Score:0

การกู้คืนฐานข้อมูล MySQL นั้นช้ามาก

ธง ar

ฉันเพิ่งซื้อเดสก์ท็อปที่บ้านใหม่ ฉันมีฐานข้อมูล MySQL สามฐานข้อมูลที่ฉันต้องการย้ายข้ามไป ฉันทิ้งทั้งหมดโดยใช้ mysqldump ก่อนถอดไดรฟ์ออกจากเครื่องเก่า

การกู้คืนฐานข้อมูลที่ใหญ่ที่สุดนั้นใช้เวลานาน (ใช้เวลาถึง 24 ชั่วโมง) ฉันกำลังกู้คืนผ่าน:

mysql -uxxxx -p
ป้อนรหัสผ่าน: yyyy
mysql> สร้างฐานข้อมูล foo;
mysql> ใช้ foo;
mysql> เริ่มการทำธุรกรรม;
มายเอสคิวแอล> \ <ดัมพ์ไฟล์>

ฉันภาวนาให้ฉันจำ ให้สัญญา เมื่อสิ่งนี้เสร็จสิ้น!

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

มีอะไรที่ฉันสามารถทำได้เพื่อเร่งการคืนค่าหรือไม่ ฉันควรทำการสำรองข้อมูลแตกต่างกันหรือไม่ - ฉันเพิ่งใช้วานิลลา mysqldump บรรทัดคำสั่งด้วย --skip-คอลัมน์-สถิติ เนื่องจากการถ่ายโอนข้อมูลจะล้มเหลวตามที่เสนอใน คำตอบ stackoverflow นี้.

สำหรับการอ้างอิง เครื่องใหม่รัน Windows 10 และ MySQL 8.0.25 Community; เครื่องเก่ารัน Windows 7 และ MySQL 5.6.22

เมื่อดูที่ไฟล์ดัมพ์อย่างละเอียดมากขึ้น (เพื่อค้นหาเวอร์ชันเซิร์ฟเวอร์) ฉันเห็นว่าตารางถูกสร้างขึ้นด้วยดัชนีของพวกเขา ตามด้วยคำสั่ง INSERT INTO จำนวนมาก ดูเหมือนจะไม่ฉลาดเป็นพิเศษ มีวิธีชักจูง mysqldump เพื่อสร้างสคริปต์ที่:

  1. สร้างตารางโดยไม่มีดัชนี
  2. แทรกแถว แล้ว
  3. สร้างดัชนี

ซึ่งดูเหมือนจะเป็นวิธีที่ดีกว่าเมื่อฐานข้อมูลกำลังถูกกู้คืน (น่าแปลกใจเล็กน้อยที่นี่ไม่ใช่ค่าเริ่มต้น!) ฉันคิดว่านี่เป็นไปได้กับ MySQL - ฉันใช้ SQLLite มา 3 ปีแล้วและเป็นไปได้อย่างแน่นอน

อัปเดต

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

อย่างไรก็ตาม คำตอบนั้นกระตุ้นและแจ้งความพยายามของฉันในการแก้ไขปัญหา ซึ่งฉันได้บันทึกไว้ในคำตอบของฉันเองด้านล่าง

nurdglaw avatar
ar flag
อืม. มันอาจจะทำได้ดี ฉันจะต้องมองอย่างใกล้ชิด สำหรับสิ่งที่คุ้มค่า ตอนนี้การคืนค่าดำเนินไปประมาณ 24 ชั่วโมงแล้ว พิจารณาจากค่า `AUTO_INCREMENT=` ในไฟล์ดัมพ์ ตารางทั้งสามมีแถว 2.6M, 250k และ 8.5M ตามลำดับ ขณะนี้กำลังกู้คืนตารางที่สาม ฉันไม่ได้ตรวจสอบอย่างถูกต้องว่ามีกี่แถวที่ถูกแทรกด้วยคำสั่ง INSERT INTO แต่ละคำสั่ง แต่ตอนนี้ใช้เวลา 3-4 นาทีจึงจะเสร็จสมบูรณ์ สิ่งนี้ให้ความรู้สึกเหมือนเป็นปัญหาในการจัดทำดัชนีอย่างแน่นอน ฉันไม่มีคีย์ต่างประเทศซึ่งเป็นจุดสำคัญของบทความที่อ้างอิง แต่ AUTOCOMMIT ดูเหมือนจะเป็นตัวการ ขอบคุณ!
nurdglaw avatar
ar flag
ฉันอยากจะรอการคืนค่านี้และดูการแก้ไขดัมพ์ของอีกสองฐานข้อมูล (เล็กกว่ามาก) เพื่อสร้างดัชนีหลังจากเสร็จสิ้น INSERT ทั้งหมดเท่านั้น ฉันจะลองกู้คืนฐานข้อมูลขนาดใหญ่ซ้ำด้วยการเปลี่ยนแปลงเหล่านั้น
nurdglaw avatar
ar flag
@MichaelHampton PPS: หากคุณแสดงความคิดเห็นเป็นคำตอบ ฉันจะโหวตให้อย่างแน่นอน (หากฉันมีตัวแทนเพียงพอ) ขอบคุณอีกครั้ง
Michael Hampton avatar
cz flag
ถ้ามันแก้ปัญหาของคุณได้ เพียงคลิกปุ่มด้านบน
nurdglaw avatar
ar flag
@Laura Elvira Hernández Lara - ขอบคุณที่เสนอการแก้ไข โปรดยกโทษให้ฉันที่ปฏิเสธคำแนะนำของคุณและแทนที่ "ขอบคุณล่วงหน้า" สำหรับสิ่งที่ (ฉันคิดว่า) ฉันตั้งใจจะใส่ไว้ในตอนแรก สวรรค์รู้ดีว่าเหตุใดฉันจึงคิดว่า "ขอบคุณล่วงหน้า" เป็นตัวยึดตำแหน่งที่เหมาะสม
ua flag
หากคุณไม่ได้ใช้งาน 8.0 ความกังวลของคุณเกี่ยวกับ `START` และ `COMMIT` นั้นไม่เกี่ยวข้องกัน คำสั่ง DDL โดยปริยาย `COMMIT` ดังนั้น การหยุดทำงานจะทำให้บางตารางโหลดได้ บางตารางไม่โหลด
Score:0
ธง ar

ในที่สุดฉันก็เลิกรอให้การนำเข้าเสร็จสิ้นหลังจาก 24 ชั่วโมง

ฉันแก้ไขสคริปต์ที่สร้างโดย mysqldump เพื่อสร้างตารางโดยไม่มีดัชนีรอง และสร้างดัชนีเฉพาะเมื่อทั้งหมด แทรก งบถูกดำเนินการด้วยการเปลี่ยนแปลงนี้ การนำเข้าเสร็จสมบูรณ์เมื่อฉันตรวจสอบสามชั่วโมงหลังจากเริ่มต้น

จากนั้นฉันแก้ไขสคริปต์เพิ่มเติมเพื่อแทรกแถวภายในธุรกรรมโดยเพิ่ม ตั้งค่าการคอมมิตอัตโนมัติ=0; เริ่มการทำธุรกรรม ในตอนเริ่มต้นและ ให้สัญญา; ในตอนท้าย ด้วยการเปลี่ยนแปลงนี้ การคืนค่าจะเสร็จสิ้นภายใน 90 นาที

ในขณะที่แก้ไขการถ่ายโอนข้อมูลที่สร้างขึ้น ฉันสังเกตเห็นว่าสิ่งเหล่านี้รวมถึง

/*!40000 ALTER TABLE `xxx` คีย์ปิดการใช้งาน */;

และ

/*!40000 ALTER TABLE `xxx` เปิดใช้งานคีย์ */;

โดยรอบ แทรก งบ ฉันเงยหน้าขึ้นมอง เอกสาร บนคำสั่งเหล่านี้และพบว่าใช้ได้กับตาราง MyISAM เท่านั้น เดอะ เอกสารเกี่ยวกับ mysqldump คุณประโยชน์ ระบุว่าบรรทัดเหล่านี้ (รวมถึงตัวคั่นความคิดเห็นและเลขวิเศษ 40000) จะถูกสร้างขึ้นหากคุณระบุ --disable-คีย์ บนบรรทัดคำสั่ง เอกสารยูทิลิตี้ยังระบุว่าจะเพิ่มพฤติกรรม "แทรกทุกอย่างในธุรกรรมเดียว" ที่ฉันพบว่าพึงปรารถนาหากคุณระบุ --no-อัตโนมัติคอมมิท บนบรรทัดคำสั่ง


สรุป ผมน่าจะเอาตัวสำรองไปด้วย

 mysqldump --no-autocommit...

อย่างน้อยในกรณีของฉัน (mysqldump เวอร์ชัน 8.0.25 และตาราง InnoDb) --disable-คีย์ ตัวเลือกไม่สร้างความแตกต่าง แก้ไขตาราง ... เปิด | ปิดการใช้งาน คีย์ คำสั่ง (แสดงข้อคิดเห็นและด้วยตัวเลขมหัศจรรย์) จะถูกสร้างขึ้นเสมอ ฉัน ทำ จำเป็นต้องแก้ไขการถ่ายโอนข้อมูลที่สร้างขึ้นเพื่อสร้างตารางโดยไม่มีคีย์รอง และเพิ่มเมื่อทั้งหมด ใส่ลงใน งบได้รับการดำเนินการ

nurdglaw avatar
ar flag
ทำไมโหวตลง / ลบโหวตได้โปรด?

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา