ฉันจะลดขนาดไฟล์ innodb ibdata1 โดยไม่ต้องทิ้งฐานข้อมูลทั้งหมดได้อย่างไร


24

InnoDB เก็บตารางทั้งหมดไว้ในไฟล์ibdata1เดียว

หลังจากวางตารางขนาดใหญ่ไฟล์จะรักษาขนาดของมันไม่ว่าโต๊ะจะใหญ่แค่ไหน ฉันจะลดขนาดไฟล์นั้นโดยไม่ต้องถ่ายโอนข้อมูลและนำเข้าฐานข้อมูลทั้งหมดอีกครั้ง (ซึ่งมีทั้งหมดหลายร้อย GB)

ฉันคิดว่าเหตุผลก็เพราะคุณยังสามารถย้อนกลับไปลดลง ในกรณีของฉันฉันไม่จำเป็นต้อง

คำตอบ:


30

นี่เป็นหนึ่งในหัวข้อที่ถกเถียงกันมากที่สุดที่ฉันเคยได้รับในช่วงหลายปีที่ผ่านมาในฐานะ 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 ใด ๆ


1
การแก้ไขเล็กน้อย: MSSQL และ PostgreSQL สามารถย้อนกลับ DDL ได้ Oracle ไม่สามารถ ในความเป็นจริงแล้วออราเคิลออกคำสั่งโดยปริยายเมื่อเห็น DDL!
Chris Travers

1
@RolandoMySQLDBA ตั้งแต่รุ่นใดของ MySQL นี่ "ข่าวดี" ของการย่อขนาดอัตโนมัติทำงานอย่างไร
Gavriel

@Gavriel - ฉันคิดว่าคุณเข้าใจผิด คุณยังต้องทิ้ง ลบ ibdata1; เริ่มต้นใหม่; และโหลดซ้ำ ไม่มีการ autoshrink ของ ibdata1 (การเปลี่ยน iblog * นั้นง่ายกว่า)
Rick James

2

InnoDB เก็บเฉพาะตาราง InnoDB ทั้งหมดของคุณใน ibdata1 หากคุณไม่ใช้การตั้งค่าต่อไปนี้ในไฟล์ค่าเริ่มต้น my.cnf ของคุณ:

innodb_file_per_table = 1

DROP Table (และ DROP DATABASE) ไม่สามารถย้อนกลับได้

นั่นไม่ใช่เหตุผลที่คุณไม่สามารถย่อขนาด ibdata1 ได้

นี่คือคำอธิบายที่ย่อ แต่ ibdata1 มีอินเทอร์เน็ต InnoDB นอกเหนือจากข้อมูลตารางของคุณ จากความเข้าใจของฉันการลดขนาดนั้นจำเป็นต้องมีการจัดเรียงข้อมูลซึ่งไม่ได้รับการสนับสนุน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.