วิธีที่เร็วที่สุดในการเปลี่ยนประเภทข้อมูลคีย์ดัชนีที่จัดทำตาราง 600GB จาก INT เป็น BIGINT


13

ฉันต้องการเปลี่ยนประเภทข้อมูลจาก INT เป็น BIGINT ในตาราง MySQL 600GB คอลัมน์มีดัชนีที่ไม่ซ้ำกัน ฉันอาจจะดีกับ INT ที่ไม่ได้ลงนาม แต่ฉันคิดว่าการเปลี่ยนแปลงนั้นมิฉะนั้น BIGINT จะเจ็บปวดเหมือนกัน เอ็นจิ้นของตารางคือ InnoDB อะไรจะง่ายขึ้น:

  1. แก้ไขตาราง
  2. โครงสร้างการคัดลอกและ INSERT INTO (SELECT *)
  3. ตารางการดัมพ์และการเปลี่ยนนิยามตารางไฟล์ดัมพ์
  4. มีอะไรอีกไหม

ปรับปรุง: ตามที่ร้องขอ MySQL เวอร์ชั่น 5.5.15 ไม่มีคีย์ต่างประเทศและสร้างตาราง:

 CREATE TABLE `tbl` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created_at` datetime NOT NULL,
    `tid` bigint(20) NOT NULL,
    `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `f` tinyint(1) NOT NULL,
    `i_id` bigint(20) NOT NULL,
    `ir_id` int(11) NOT NULL,
    `r_c` int(11) NOT NULL,
    `r` tinyint(1) NOT NULL,
    `e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `t` varchar(5) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8

กำหนดความเจ็บปวดใช้เวลาน้อยที่สุด .... ? ผลลัพธ์ที่เร็วที่สุด?

@AlecTeal ใช้เวลาให้น้อยที่สุด
Noam

แม้ว่ามันจะไม่ได้ตอบคำถามและคำถามนี้อาจถูกพูดถึงก่อนที่โต๊ะจะมีขนาดใหญ่ แต่ฉันก็จะหาวิธีลดขนาดของตารางนี้

1
MySQL รุ่นใด ALTER TABLE ONLINEมันเป็นเรื่องสำคัญเป็นบางรุ่นมี คุณมีกุญแจต่างประเทศที่อ้างอิงคอลัมน์นี้หรือไม่? มันจะช่วยถ้าคุณแสดงSHOW CREATE TABLE tablename;ผลลัพธ์
ypercubeᵀᴹ

2
ถ้าชื่อเขตสั้นช่วยลดขนาดตารางก็จะเป็น 600 MB
Jon of All Trades

คำตอบ:


2

สมมติว่าตารางของคุณไม่มีทริกเกอร์ใด ๆ คุณควรพิจารณาใช้pt-online-schema-changeเนื่องจากจะทำให้คุณสามารถเปลี่ยนตารางได้โดยไม่ต้องล็อก

มันจะยังคงใช้เวลาพอสมควรตามขนาดของตาราง

นอกจากนี้ด้วยวิธีนี้หรือด้วยALTER TABLEคุณจะต้องตรวจสอบให้แน่ใจว่าคุณมีพื้นที่ว่างบนดิสก์ 600 GB เพื่อรองรับสำเนาสองชุดของตารางในขณะที่มันถูกสร้างใหม่


มีการประเมินตลอดเวลา? (ฉันรู้ว่ามันขึ้นอยู่กับปัจจัยหลายอย่าง แต่ถ้าคุณต้องเดาสิ่งที่จะเป็นช่วง)
Noam

@ ไม่มีคุณไม่จำเป็นต้องคัดลอกตาราง ถ้าคุณใช้ตาราง Alter กรณีที่แย่ที่สุดคือมันคัดลอกถ้าคุณใช้เอ็นจิ้นที่โตแล้วมันจะทำการจดบันทึกตัวเองว่าสิ่งใด ๆ ก่อนหน้านี้ (บางตำแหน่งในไฟล์หรือบางเรคคอร์ด) ใช้ int ทุกสิ่งใช้บิ๊กโพสต์จนกระทั่ง คุณเพิ่มประสิทธิภาพ

@AlecTeal คุณมีการอ้างอิงอย่างเป็นทางการเกี่ยวกับเรื่องนี้หรือไม่?
Noam

@ โฟมเห็นคำตอบของฉัน

1
@ โฟมฉันคาดว่าALTER TABLEอาจใช้เวลา 24 - 96 ชั่วโมงในการทำงาน คุณสามารถประมาณการได้ดีขึ้นโดยการเรียกใช้ ALTER TABLE ในสภาพแวดล้อมการทดสอบ
Ike Walker

2

การใช้ชุดเครื่องมือ percona pt-online-schema-changeจะเป็นทางเลือกของฉันในการผลิตโดยไม่กระทบต่อการใช้งาน สิ่งนี้จะเพิ่มทริกเกอร์บางอย่างเพื่อให้ delta ของคุณและตารางชั่วคราวที่จะเปลี่ยนชื่อหลังจากเสร็จสิ้น

ตัวอย่าง:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE

pt เป็นวิธีที่จะไป @Noam FYI: INT-> การโยกย้าย BIGINT บนตาราง ~ 270GB ที่มีแถวจำนวนมากบนอินสแตนซ์ EC2 ที่มีกิจกรรมการเขียนค่อนข้างหนักในตารางนี้ใช้เวลา 64 ชั่วโมงโดยใช้ pt-online-schema-change
Jakub Głazik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.