MySql - เปลี่ยน innodb_file_per_table สำหรับฐานข้อมูลสด


18

ฉันมีฐานข้อมูล MySql ขนาดใหญ่ (150GB) และตอนนี้ฉันสังเกตเห็นว่าการinnodb_file_per_tableตั้งค่าoffที่ทำให้ฐานข้อมูลทั้งหมดถูกโฮสต์ในไฟล์เดียว ( ibdata1) ฉันต้องการเปิดใช้งานinnodb_file_per_tableและให้มันแบ่งฐานข้อมูลย้อนหลังเป็นหลาย ๆ ไฟล์วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร

คำตอบ:


32

มีวิธีเดียวเท่านั้นที่จะดึงสิ่งนี้ออก คุณจะต้องส่งออกข้อมูลโดยใช้ mysqldumps, ปล่อยฐานข้อมูลทั้งหมด, ปิดเครื่อง mysqld, ลบ ib_logfile0, ลบ ib_logfile1, ลบ ibdata1, เพิ่มinnodb_file_per_tableใต้[mysqld]หัวเรื่อง, เริ่ม mysql

ฉันโพสต์คำตอบนี้ใน StackOverflow ย้อนกลับไปในเดือนตุลาคม 2010

นี่คือขั้นตอนที่ระบุไว้ในแนวตั้ง:

ขั้นตอนที่ 01) MySQLDump ฐานข้อมูลทั้งหมดลงในไฟล์ข้อความ SQL (เรียกว่า SQLData.sql)

ขั้นตอนที่ 02) ปล่อยฐานข้อมูลทั้งหมด (ยกเว้นสคีมา mysql)

ขั้นตอนที่ 03) ปิด mysql

ถ้ำ : หากต้องการทำความสะอาดธุรกรรมที่ไม่มีข้อผูกมัดทั้งหมดจากไฟล์ InnoDB ให้เรียกใช้สิ่งนี้

mysql -uroot -p... -Ae"SET GLOBAL innodb_fast_shutdown = 0;"
service mysql stop

ขั้นตอนที่ 04) เพิ่มบรรทัดต่อไปนี้ลงใน /etc/my.cnf

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G

Sidenote: ไม่ว่าชุดของคุณสำหรับ innodb_buffer_pool_size จะต้องแน่ใจว่า innodb_log_file_size นั้นเท่ากับ 25% ของ innodb_buffer_pool_size

ขั้นตอนที่ 05) ลบ ibdata1, ib_logfile0 และ ib_logfile1

ณ จุดนี้ควรมี schema mysql ใน / var / lib / mysql เท่านั้น

ขั้นตอนที่ 06) รีสตาร์ท mysql

สิ่งนี้จะสร้าง ibdata1 ที่ 10MB, ib_logfile0 และ ib_logfile1 ที่ 1G ต่อครั้ง

ขั้นตอนที่ 07) โหลด SQLData.sql ไปที่ mysql

ibdata1 จะเพิ่มขึ้น แต่จะมีเฉพาะข้อมูลเมตาของตาราง

แต่ละตาราง InnoDB จะมีอยู่นอก ibdata1

สมมติว่าคุณมีตาราง InnoDB ชื่อ mydb.mytable หากคุณเข้าสู่ / var / lib / mysql / mydb คุณจะเห็นสองไฟล์ที่แสดงถึงตาราง

  • mytable.frm (หัวเครื่องมือจัดเก็บข้อมูล)
  • mytable.ibd (หน้าแรกของข้อมูลตารางและดัชนีตารางสำหรับ mydb.mytable)

ibdata1 จะไม่มีข้อมูล InnoDB และดัชนีอีกต่อไป

ด้วยตัวเลือก innodb_file_per_table ใน /etc/my.cnf คุณสามารถเรียกใช้ OPTIMIZE TABLE mydb.mytable และไฟล์ /var/lib/mysql/mydb/mytable.ibd จริง ๆ แล้ว

ฉันทำมาแล้วหลายครั้งในอาชีพการงานของฉันในฐานะ MySQL DBA

ในความเป็นจริงครั้งแรกที่ฉันทำสิ่งนี้ฉันยุบไฟล์ 50GB ibdata1 เป็น 500MB

ให้มันลอง. หากคุณมีคำถามเพิ่มเติมเกี่ยวกับเรื่องนี้ส่งอีเมลฉัน เชื่อฉัน. สิ่งนี้จะใช้ได้ในระยะสั้นและระยะยาว !!!

มีทางเลือกอื่นที่จะแยกตาราง InnoDB โดยไม่ลดขนาด ibdata1

ขั้นตอนที่ 01) เพิ่มบรรทัดต่อไปนี้ลงใน /etc/my.cnf

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G

ขั้นตอนที่ 02) service mysql restart

ขั้นตอนที่ 03) หากต้องการแยกตาราง InnoDB เดี่ยวชื่อ mydb.mytable ให้ทำดังนี้

ALTER TABLE mydb.mytable ENGINE=InnoDB;

สิ่งนี้จะสร้างหนึ่งไฟล์โปรดเก็บไฟล์โครงสร้างเดิมไว้

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

คุณสามารถทำได้สำหรับทุกตาราง InnoDB น่าเสียดายที่ ibdata1 จะอยู่ที่ 150GB


ในขณะที่เรียกใช้โหลดจากไฟล์. sql ฉันได้รับข้อผิดพลาดต่อไปนี้เป็นERROR 1071 (42000) at line 25: Specified key was too long; max key length is 1000 bytesแนวคิดหรือไม่
Ran

@ รันโปรดโพสต์คำถามนั้นเป็นคำถามแยกต่างหาก
RolandoMySQLDBA


หากคุณตั้งค่าinnodb_file_per_tableจากนั้นทำALTER TABLEทุกตารางเดียวคุณสามารถลบไฟล์ ibdata1 เพื่อเรียกคืนพื้นที่โดยไม่ต้องกู้คืนได้หรือไม่?
SystemParadox

1
@SystemParadox แน่นอนไม่ !!!!!!!! คุณจะสูญเสียพจนานุกรมข้อมูล
RolandoMySQLDBA

5

หากคุณต้องการเรียกคืนพื้นที่ของ ibdata การดัมพ์ / กู้คืนเป็นทางเลือกเดียวของคุณเนื่องจากRolandoชี้ให้เห็น มันอาจเป็นวิธีที่ดีที่สุดสำหรับการทำ

อย่างไรก็ตามหากคุณต้องการลดการสูญเสียและ 'สูญเสีย' 150GB ในฮาร์ดไดรฟ์คุณสามารถเปิดใช้งานได้ innodb_file_per_tableใน my.cnf และรีสตาร์ทเซิร์ฟเวอร์ของคุณ

จากนั้นสำหรับแต่ละตารางปัญหา:

ALTER TABLE x DISABLE KEYS;
ALTER TABLE x ENGINE=InnoDB;
ALTER TABLE x ENABLE KEYS; 

ปัญหาที่นี่คือพื้นที่ตารางขนาดใหญ่จะใช้เวลาสักครู่

สิ่งที่ฉันอยากจะแนะนำคือการตั้งค่าทาสของ live db ของคุณเรียกใช้การแปลงบน slave จากนั้นปิด master / slave และคัดลอกดาต้าสเปซใหม่ไปยัง master หรือเลื่อน slave ให้เป็น master ทันทีที่ทัน .

คุณจะมีปัญหาในการเปลี่ยนแปลงนี้โดยไม่ต้องหยุดทำงานเลย


+1 สำหรับการซื่อสัตย์อย่างไร้ความปราณีและพูดว่า 'ตัดการสูญเสียของคุณ' คุณอาจพูดว่า 'กัดกระสุน' ด้วย
RolandoMySQLDBA

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