Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธี Shrink/Purge ไฟล์ ibdata1 ใน MySQL

ibdata1 ไม่สามารถ Shrink ได้โดยตรง (Design limitation ของ InnoDB Shared Tablespace) วิธีเดียวคือ Dump → Drop → Reload

วิธีแก้ไขรากราก (Reclaim Space)

  1. mysqldump --all-databases > alldb.sql (Backup ทุก Database)
  2. Stop MySQL: systemctl stop mysql
  3. ลบไฟล์: ibdata1, ib_logfile*, *.ibd ใน Data Directory
  4. Start MySQL: systemctl start mysql (สร้าง ibdata1 ใหม่ ขนาดเล็ก)
  5. 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+)
วิธี Shrink/Purge ไฟล์ ibdata1 ใน MySQL

สำหรับตารางเก่าที่อยู่ใน 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 ก่อน