มีวิธีเดียวเท่านั้นที่จะดึงสิ่งนี้ออก คุณจะต้องส่งออกข้อมูลโดยใช้ mysqldumps, ปล่อยฐานข้อมูลทั้งหมด, ปิดเครื่อง mysqld, ลบ ib_logfile0, ลบ ib_logfile1, ลบ ibdata1, เพิ่มinnodb_file_per_table
ใต้[mysqld]
หัวเรื่อง, เริ่ม mysql
ฉันโพสต์คำตอบนี้ใน StackOverflow ย้อนกลับไปในเดือนตุลาคม 2010
นี่คือขั้นตอนที่ระบุไว้ในแนวตั้ง:
ขั้นตอนที่ 01) MySQLDump ฐานข้อมูลทั้งหมดลงในไฟล์ข้อความ SQL (เรียกว่า SQLData.sql)
ขั้นตอนที่ 02) ปล่อยฐานข้อมูลทั้งหมด (ยกเว้นสคีมา mysql)
ขั้นตอนที่ 03) ปิด mysql
ถ้ำ : หากต้องการทำความสะอาดธุรกรรมที่ไม่มีข้อผูกมัดทั้งหมดจากไฟล์ InnoDB ให้เรียกใช้สิ่งนี้
mysql -uroot -p... -Ae"SET GLOBAL innodb_fast_shutdown = 0;"
service mysql stop
ขั้นตอนที่ 04) เพิ่มบรรทัดต่อไปนี้ลงใน /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
Sidenote: ไม่ว่าชุดของคุณสำหรับ innodb_buffer_pool_size จะต้องแน่ใจว่า innodb_log_file_size นั้นเท่ากับ 25% ของ innodb_buffer_pool_size
ขั้นตอนที่ 05) ลบ ibdata1, ib_logfile0 และ ib_logfile1
ณ จุดนี้ควรมี schema mysql ใน / var / lib / mysql เท่านั้น
ขั้นตอนที่ 06) รีสตาร์ท mysql
สิ่งนี้จะสร้าง ibdata1 ที่ 10MB, ib_logfile0 และ ib_logfile1 ที่ 1G ต่อครั้ง
ขั้นตอนที่ 07) โหลด SQLData.sql ไปที่ mysql
ibdata1 จะเพิ่มขึ้น แต่จะมีเฉพาะข้อมูลเมตาของตาราง
แต่ละตาราง InnoDB จะมีอยู่นอก ibdata1
สมมติว่าคุณมีตาราง InnoDB ชื่อ mydb.mytable หากคุณเข้าสู่ / var / lib / mysql / mydb คุณจะเห็นสองไฟล์ที่แสดงถึงตาราง
- mytable.frm (หัวเครื่องมือจัดเก็บข้อมูล)
- mytable.ibd (หน้าแรกของข้อมูลตารางและดัชนีตารางสำหรับ mydb.mytable)
ibdata1 จะไม่มีข้อมูล InnoDB และดัชนีอีกต่อไป
ด้วยตัวเลือก innodb_file_per_table ใน /etc/my.cnf คุณสามารถเรียกใช้ OPTIMIZE TABLE mydb.mytable และไฟล์ /var/lib/mysql/mydb/mytable.ibd จริง ๆ แล้ว
ฉันทำมาแล้วหลายครั้งในอาชีพการงานของฉันในฐานะ MySQL DBA
ในความเป็นจริงครั้งแรกที่ฉันทำสิ่งนี้ฉันยุบไฟล์ 50GB ibdata1 เป็น 500MB
ให้มันลอง. หากคุณมีคำถามเพิ่มเติมเกี่ยวกับเรื่องนี้ส่งอีเมลฉัน เชื่อฉัน. สิ่งนี้จะใช้ได้ในระยะสั้นและระยะยาว !!!
มีทางเลือกอื่นที่จะแยกตาราง InnoDB โดยไม่ลดขนาด ibdata1
ขั้นตอนที่ 01) เพิ่มบรรทัดต่อไปนี้ลงใน /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
ขั้นตอนที่ 02) service mysql restart
ขั้นตอนที่ 03) หากต้องการแยกตาราง InnoDB เดี่ยวชื่อ mydb.mytable ให้ทำดังนี้
ALTER TABLE mydb.mytable ENGINE=InnoDB;
สิ่งนี้จะสร้างหนึ่งไฟล์โปรดเก็บไฟล์โครงสร้างเดิมไว้
- /var/lib/mysql/mydb/mytable.frm
- /var/lib/mysql/mydb/mytable.ibd
คุณสามารถทำได้สำหรับทุกตาราง InnoDB น่าเสียดายที่ ibdata1 จะอยู่ที่ 150GB
ERROR 1071 (42000) at line 25: Specified key was too long; max key length is 1000 bytes
แนวคิดหรือไม่