สถาปัตยกรรมของ InnoDB ต้องการการใช้หน้าข้อมูลพื้นฐานสี่ประเภท
- หน้าข้อมูลตาราง
- หน้าดัชนีตาราง
- ตาราง MetaData
- ข้อมูล MVCC (เพื่อสนับสนุนการแยกธุรกรรมและความสอดคล้องกับกรด )
- ส่วนย้อนกลับ
- เลิกทำ Space
- บัฟเฟอร์การเขียนซ้ำ (การเขียนพื้นหลังเพื่อป้องกันการพึ่งพาระบบปฏิบัติการแคช)
- แทรกบัฟเฟอร์ (จัดการการเปลี่ยนแปลงดัชนีรองที่ไม่ซ้ำกัน)
ดูภาพการเป็นตัวแทนของ ibdata1
โดยค่าเริ่มต้นinnodb_file_per_tableถูกปิดใช้งาน สิ่งนี้ทำให้หน้าข้อมูลทั้งสี่ประเภทเชื่อมโยงไปถึงไฟล์เดียวชื่อ ibdata1 หลายคนพยายามกระจายข้อมูลโดยสร้างไฟล์ ibdata หลายไฟล์ สิ่งนี้อาจนำไปสู่การกระจายตัวของข้อมูลและหน้าดัชนี
นี่คือเหตุผลที่ผมมักจะแนะนำให้ทำความสะอาดโครงสร้างพื้นฐาน InnoDB โดยใช้ไฟล์ ibdata1 เริ่มต้นและไม่มีอะไรเพิ่มเติม
การคัดลอกนั้นอันตรายมากเนื่องจากโครงสร้างพื้นฐานที่ InnoDB ทำงาน มีโครงสร้างพื้นฐานสองขั้นพื้นฐาน
- innodb_file_per_table ถูกปิดใช้งาน
- เปิดใช้งาน innodb_file_per_table
เมื่อปิดใช้งานinnodb_file_per_tableข้อมูล InnoDB เหล่านี้ทั้งหมดจะเผยแพร่ภายใน ibdata1 การรวมตัวกันของตาราง InnoDB ใด ๆ ภายนอก ibdata1 คือไฟล์. frm ของตาราง InnoDB การคัดลอกข้อมูล InnoDB ทั้งหมดในครั้งเดียวจำเป็นต้องคัดลอกทั้งหมดของ / var / lib / mysql
การคัดลอกตาราง InnoDB แต่ละรายการเป็นไปไม่ได้โดยสิ้นเชิง คุณต้อง MySQL dump เพื่อแยก dump ของตารางเป็นการแสดงตรรกะของข้อมูลและนิยามดัชนีที่สอดคล้องกัน จากนั้นคุณจะโหลดการถ่ายโอนข้อมูลนั้นไปยังฐานข้อมูลอื่นบนเซิร์ฟเวอร์เดียวกันหรือเซิร์ฟเวอร์อื่น
เมื่อเปิดใช้งานinnodb_file_per_tableข้อมูลในตารางและดัชนีจะอยู่ในโฟลเดอร์ฐานข้อมูลถัดจากไฟล์. frm ตัวอย่างเช่นสำหรับตาราง db1.mytable การรวมตัวกันของตาราง InnoDB ภายนอก ibdata1 จะเป็น:
/var/lib/mysql/db1/mytable.frm
/var/lib/mysql/db1/mytable.ibd
ตารางระบบ ibdata1
ข้อมูลเมตาทั้งหมดสำหรับ db1.mytable ยังคงอยู่ใน ibdata1 และไม่มีทางแก้ไข ทำซ้ำบันทึกและข้อมูล MVCC ยังคงใช้งานได้กับ ibdata1
เมื่อพูดถึงการแตกแฟรกเมนต์ของตารางนี่คือสิ่งที่เกิดขึ้นกับ ibdata1:
- innodb_file_per_tableเปิดการใช้งาน : คุณสามารถหด db1.mytables ด้วยหรือ
ALTER TABLE db1.mytable ENGINE=InnoDB;
OPTIMIZE TABLE db1.mytable;
ซึ่งส่งผลให้ /var/lib/mysql/db1/mytable.ibd มีขนาดเล็กลงโดยไม่มีการแตกแฟรกเมนต์
- innodb_file_per_tableถูกปิดใช้งาน : คุณไม่สามารถย่อ db1.mytables ด้วย
ALTER TABLE db1.mytable ENGINE=InnoDB;
หรือOPTIMIZE TABLE db1.mytable;
เพราะมันอยู่กับ ibdata1 เรียกใช้คำสั่งทั้งสองจริงทำให้ตารางต่อเนื่องกันและเร็วกว่าในการอ่านและเขียน น่าเสียดายที่เกิดขึ้นในตอนท้ายของ ibdata1 สิ่งนี้ทำให้ ibdata1 เติบโตอย่างรวดเร็ว นี้เป็น addressed อย่างเต็มที่ในการล้างข้อมูล InnoDB โพสต์ของฉัน
หากคุณกำลังคิดที่จะคัดลอกไฟล์. frm และ. ibd คุณจะเข้าสู่โลกแห่งความเจ็บปวด คัดลอก .frm และไฟล์ .ibd ของตาราง InnoDB เป็นดีเท่านั้นและถ้าหากคุณสามารถรับประกันได้ว่ารหัส tablespace ของแฟ้ม .ibd ตรงกันกับรายการ tablespace ID ในข้อมูลเมตาของไฟล์
ฉันเขียนสองโพสต์ใน DBA StackExchange เกี่ยวกับแนวคิด id tablespace นี้
นี่คือการเชื่อมโยงที่ดีเกี่ยวกับวิธีการใส่กลับเข้าไปไฟล์ .ibd ใด ๆ ที่จะ ibdata1 ในกรณีของรหัส tablespace ไม่ตรงกัน: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file หลังจากอ่านสิ่งนี้แล้วคุณควรตระหนักทันทีว่าการคัดลอกไฟล์. ibd เป็นสิ่งที่ธรรมดามาก
สำหรับ InnoDB คุณจะต้องทำสิ่งนี้เพื่อย้ายเท่านั้น
CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
เพื่อสร้างสำเนาของตาราง InnoDB
หากคุณย้ายข้อมูลไปยังเซิร์ฟเวอร์ฐานข้อมูลอื่นให้ใช้ mysqldump
ในเรื่องของการผสมตาราง InnoDB ทั้งหมดจากฐานข้อมูลทั้งหมดฉันสามารถเห็นภูมิปัญญาในการทำเช่นนั้น ที่ บริษัท ผู้ให้บริการโฮสต์ DB / เว็บของฉันฉันมีไคลเอนต์ MySQL หนึ่งตัวที่มีตารางในฐานข้อมูลหนึ่งซึ่งมีข้อ จำกัด ถูกแมปกับตารางอื่นในฐานข้อมูลอื่นภายในอินสแตนซ์ MySQL เดียวกัน ด้วยที่เก็บข้อมูลเมตาทั่วไปหนึ่งรายการทำให้การสนับสนุนธุรกรรมและความสามารถในการทำงานของ MVCC สามารถทำได้ในหลายฐานข้อมูล