ibdata1 ไม่สามารถ Shrink ได้โดยตรง (Design limitation ของ InnoDB Shared Tablespace) วิธีเดียวคือ Dump → Drop → Reload
วิธีแก้ไขรากราก (Reclaim Space)
mysqldump --all-databases > alldb.sql(Backup ทุก Database)- Stop MySQL:
systemctl stop mysql - ลบไฟล์:
ibdata1, ib_logfile*, *.ibdใน Data Directory - Start MySQL:
systemctl start mysql(สร้าง ibdata1 ใหม่ ขนาดเล็ก) - Restore:
mysql < alldb.sql
ป้องกันไม่ให้ใหญ่เกินไป: File-Per-Table (Default ตั้งแต่ 5.6.6)
แต่ละตารางเก็บใน .ibd แยกต่างหาก สามารถ DROP TABLE / TRUNCATE เพื่อคืนพื้นที่ OS ได้ทันที
ตรวจสอบ/เปิดใช้งานใน my.cnf
[mysqld] innodb_file_per_table = 1 # ON = File-per-table (Default 5.6.6+)
สำหรับตารางเก่าที่อยู่ใน ibdata1 (Shared Tablespace)
-- ย้ายตารางออกมาเป็น File-per-table ALTER TABLE old_table ENGINE=InnoDB; -- Rebuild เป็น .ibd แยก -- หรือใช้ pt-online-schema-change (Percona Toolkit) เพื่อไม่ Lock ตาราง pt-online-schema-change --alter="ENGINE=InnoDB" D=db,t=old_table --execute
คำเตือน: การ Rebuild ibdata1 ต้อง Downtime และมี Risk สูง ควรวางแผน Backup/Restore อย่างรอบคอบ และทดสอบบน Staging ก่อน