วิธีการจัดการ InnoDB ibdata1 ขนาดใหญ่เกินทน

มีเคสแบบนี้เกิดขึ้นเป็นระยะ เลยขอนำวิธีการจัดการกับไฟล์ ibdata1 ของ InnoDB ที่ขนาดใหญ่เกินทน มาแชร์กันครับ

ถ้าเป็นกรณี MySQL ที่เพิ่งเริ่มใช้งาน และมี default storage engine เป็น InnoDB ให้เช็ค my.cnf ว่ามีบรรทัดต่อไปนี้อยู่หรือไม่ ถ้ามีอยู่ ก็ไม่ต้องทำอะไร เพราะ table แต่ละอันที่สร้างขึ้นหลังจากนี้จะแยกอยู่ใน directory ของใครของมัน ไฟล์ ibdata1 จะมีขนาดไม่ใหญ่มาก

[mysqld]
innodb_file_per_table

ถ้าเป็นกรณี MySQL ที่ใช้งานมาแล้ว และมีไฟล์ ibdata1 ใหญ่มาก มีการรวมข้อมูลใน table ต่างๆ ไว้ที่นั่น แสดงว่าไม่ได้ตั้งค่า innodb_file_per_table เอาไว้ วิธีการแก้ไขเพื่อแยกข้อมูลของแต่ละ db.table ออกมา ให้ทำตามขั้นตอนต่อไปนี้

  1. เพิ่มเติมลงไปใน my.cnf ค่า innodb_file_per_table นี้ ตามตัวอย่างข้างบน
  2. ทำการ dump db ออกมาให้หมดทุก db ยกเว้น mysql และ performance_schema ให้เก็บไว้ที่ที่ปลอดภัย
  3. drop database ต่างๆ ทิ้งให้หมด ยกเว้น 2 db ในข้อ 2
  4. stop mysql
  5. ลบ ไฟล์ ibdata1, ib_log… ออก
  6. start mysql – ไฟล์ที่ถูกลบใน 5. จะถูกสร้างขึ้นมาใหม่ ขนาดไม่ใหญ่นัก ขึ้นกับ config ที่ตั้งไว้
  7. restore db ต่างๆ จากที่เซฟไว้ ก็จะถูกสร้างเป็นไฟล์เล็กๆ ใน directory ของใครของมันตามที่เราต้องการ

ไม่มีทางอื่นที่จะลดขนาด ibdata1 ยกเว้นที่ลิสต์ไว้ด้านบนครับ หากทำการแก้ไขโดยเพียงแต่ alter table … จะไม่ทำให้ ibdata1 เล็กลง และการ optimize table ก็ยิ่งทำให้ ibdata1 ใหญ่ขึ้นด้วยครับ

ส่วนเทคนิคการ dump/restore db ขนาดใหญ่ ให้เร็วๆ วันหลังมีโอกาสจะแวะมาเขียนอีกครับ

หวังว่าจะมีประโยชน์กับท่านอื่นๆ นะครับ

ก่อนลบให้ทดสอบการ restore ข้อมูลก่อนนะครับ

555 ใช่เลย Dumb ด้วยความมั่นใจ พอลบไปแล้ว restore error งานงอก โทษใครไม่ได้เลย

//youtu.be/WeX4J_3FHsg

ขอบคุณครับพี่วัฒ
:baa60776:

เคยได้ยินว่า [COLOR=#333333]innodb_file_per_table นี่ มันทำงานช้า กว่ารวมเป็นไฟล์ เดียวถูกมั้ยครับ

ในเว็บ mysql แนะนำให้ใช้ file per table นะคัรบ คุ้นๆ ว่า version ใหม่ๆ จะเปิดเป็น default ด้วย

ibdata1 เป็นพื้นที่ของ innodb ที่เอาไว้เก็บพวกนี้ครับ

  • table space (พวกนี้สามารถโดนแยกออกมาเป็น innodb_file_per_table)
  • data dictionary
  • change buffer
  • double write buffer
  • undo log

การรวมไว้ที่เดียวกันทำให้การทำงานมีประสิทธิภาพกว่า แต่ก็ต้องแลกกับไฟล์ ibdata1 ขนาดมหึมา การบริหารจัดการลำบากนิดนึง

ภายในของ ibdata1 หน้าตาแบบนี้


อันนี้เป็น reference ที่ดีมากเผื่อใครสนใจ
mysql - Why does InnoDB store all databases in one file? - Database Administrators Stack Exchange

อันนี้เป็น tool ใช้ดูของที่อยู่ข้างใน ibdata1