นี่เป็นหนึ่งในหัวข้อที่ถกเถียงกันมากที่สุดที่ฉันเคยได้รับในช่วงหลายปีที่ผ่านมาในฐานะ MySQL DBA และใน DBA StackExchange
ที่จะนำมันอย่างอ่อนโยนมีเพียงไม่มีทางอื่นที่จะหดตัว ibdata1 เมื่อปิดใช้งานinnodb_file_per_tableทุกครั้งที่คุณเรียกใช้OPTIMIZE TABLE
บนตาราง InnoDB จะทำให้ ibdata1 เติบโตอย่างรวดเร็ว ข้อมูลที่ถูกทิ้งโดยใช้DROP TABLE
และDROP DATABASE
ไม่สามารถย้อนกลับได้เพราะเป็น DDL ไม่ใช่ DML ฉันเชื่อว่า Oracle และ MSSQL สามารถย้อนกลับ DDL ได้ MySQL ไม่สามารถทำเช่นนั้นได้
มีหลายคลาสของข้อมูลที่อยู่ใน ibdata1
- ข้อมูลตาราง
- ดัชนีตาราง
- ตาราง MetaData
- ข้อมูลการควบคุม MVCC
- บัฟเฟอร์การเขียนซ้ำ (การเขียนเบื้องหลังเพื่อป้องกันการพึ่งพาระบบปฏิบัติการแคช)
- แทรกบัฟเฟอร์ (จัดการการเปลี่ยนแปลงดัชนีรองที่ไม่ซ้ำกัน)
การใช้innodb_file_per_table=1
จะช่วยให้คุณสร้างตารางใหม่ที่มีข้อมูลตารางและดัชนีตารางที่สร้างขึ้นภายนอก ibdata1 คุณสามารถแยกตารางใด ๆ ที่ยังคงอยู่ภายใน ibdata1 โดยใช้ALTER TABLE ... ENGINE=InnoDB;
หรือOPTIMIZE TABLE
แต่จะทำให้พื้นที่ว่างที่ไม่ได้ใช้นั้นใหญ่ใน ibdata1
อย่างไรก็ตามคุณต้องล้างโครงสร้างพื้นฐานของ InnoDB ฉันได้เขียนโพสต์ StackExchange แล้วว่าทำอย่างไรและทำไม:
ข่าวดี
คุณจะต้องถ่ายโอนข้อมูลโหลดอีกครั้งหนึ่งและไม่เคยทบทวนเรื่องนี้อีกครั้ง การรันOPTIMIZE TABLE
หลังจากนั้นจะลดขนาด.ibd
ไฟล์ tablespace สำหรับตาราง InnoDB ใด ๆ