ฉันจะเพิ่มความเร็วการเรียกคืน MySQL จากไฟล์ดัมพ์ได้อย่างไร


28

ฉันกำลังกู้คืนฐานข้อมูล 30GB จากไฟล์ mysqldump ไปยังฐานข้อมูลเปล่าบนเซิร์ฟเวอร์ใหม่ เมื่อเรียกใช้ SQL จากไฟล์ดัมพ์การคืนค่าจะเริ่มขึ้นอย่างรวดเร็วและเริ่มช้าลงและช้าลง ตอนนี้ส่วนแทรกส่วนบุคคลใช้เวลา 15+ วินาที ตารางส่วนใหญ่เป็น MyISAM ที่มี InnoDB ขนาดเล็กหนึ่งอัน เซิร์ฟเวอร์ไม่มีการเชื่อมต่อที่ใช้งานอื่น SHOW PROCESSLIST;แสดงการแทรกจากการกู้คืนเท่านั้น (และรายการกระบวนการแสดงเอง)

ไม่มีใครมีความคิดใด ๆ ที่อาจทำให้เกิดการชะลอตัวอย่างมาก?

มีตัวแปร MySQL ใดบ้างที่ฉันสามารถเปลี่ยนเพื่อเร่งความเร็วการกู้คืนในขณะที่มันกำลังดำเนินอยู่?


แก้ไขเพื่อแก้ไขประเภทตาราง
Dave Forgac

คำตอบ:


26

สิ่งหนึ่งที่อาจทำให้กระบวนการช้าลงคือkey_buffer_sizeซึ่งเป็นขนาดของบัฟเฟอร์ที่ใช้สำหรับบล็อกดัชนี ปรับค่านี้เป็นอย่างน้อย 30% ของ RAM หรือกระบวนการสร้างดัชนีใหม่อาจช้าเกินไป

สำหรับการอ้างอิงหากคุณใช้ InnoDB และคีย์ต่างประเทศคุณสามารถปิดใช้งานการตรวจสอบคีย์ต่างประเทศและเปิดใช้งานอีกครั้งในตอนท้าย (โดยใช้SET FOREIGN_KEY_CHECKS=0และSET FOREIGN_KEY_CHECKS=1)


1
ฉันพบสองสิ่ง: key_buffer_size ถูกตั้งค่าเป็น 8MB และมีหนึ่งตาราง InnoDB ในการผสมกับคีย์ต่างประเทศ เพิ่ม key_buffer_size เป็น 1GB และปิดการตรวจสอบกุญแจต่างประเทศชั่วคราว การคืนค่าเสร็จสิ้นใน 5 นาที ขอบคุณ!
Dave Forgac

ว้าว! ดีใจที่มันช่วย :)
มาร์โกรามอส

2
ฉันเพิ่งสังเกตเห็นว่าฉันพิมพ์ '5' นาที ฉันค่อนข้างแน่ใจว่ามันเหมือน 50 นาที แต่ก็สมเหตุสมผลมากกว่า ;-)
Dave Forgac

5
key_buffer_size สำหรับ MYISAM
Fernando Fabreti

@FernandoFabreti - เป็นจุดสำคัญสำหรับผู้อ่านจำนวนมาก แต่ OP ได้ระบุว่าพวกเขาส่วนใหญ่มี MyISAM
mc0e

22

ลิงค์นี้แสดงสิ่งที่เราสามารถทำได้เพื่อเร่งกระบวนการกู้คืน

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

หนึ่งสามารถใส่คำสั่งใส่ที่ด้านบนของไฟล์การถ่ายโอน

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

และวางข้อความเหล่านี้ไว้ท้ายไฟล์ดัมพ์

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

สิ่งนี้ใช้ได้สำหรับฉัน การคืนความสุข :-)


8
สิ่งนี้ช่วยได้ไม่มาก แทนที่จะแก้ไขไฟล์ฉันสร้าง pre.sql และ post.sql จากตัวอย่างข้างต้นและที่ใช้ที่จะเรียกคืนฐานข้อมูล:cat pre.sql dump.sql post.sql | mysql ...
เจสันคูมบ์สอาร์

1

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


1

หากคุณมีสำเนาทางกายภาพของไฟล์การถ่ายโอนข้อมูล (ไดเรกทอรี DB) คุณสามารถคัดลอกไปยังเซิร์ฟเวอร์ใหม่หากเซิร์ฟเวอร์ใหม่มีรุ่น MySQL ที่เหมือนกันและมันจะทำงานได้ดี มันใช้งานได้ดีกับ MyISAM และสำหรับฉันฉันคิดว่ามันจะดีกว่าการกู้คืนข้อมูลตามไฟล์การถ่ายโอนข้อมูล SQL แบบลอจิคัล


0

ถ้าคุณมีโอกาสหลายตารางที่คุณอาจได้รับประโยชน์จากMK-ขนานเรียกคืน


นี่เลิกใช้แล้วและควรใช้เพื่อกู้คืนข้อมูลทดสอบไม่ใช่สำหรับการกู้คืนการสำรองข้อมูลจริง
svandragt

0

สิ่งนี้จะทำ:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql


-1

ฉันแนะนำคุณ

  1. ตรวจสอบตารางของคุณ: มันมีทริกเกอร์หรือไม่? ล้างทริกเกอร์ทั้งหมด
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( และไม่ลืมที่จะย้อนกลับการเปลี่ยนแปลงนี้ )
  3. ใช้คำสั่ง LINE LIKE mysql -u root -pPasss requests < mydb.sql
  4. ตรวจสอบขนาดไฟล์ฐานข้อมูลของคุณ

โชคดี

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