การส่งออก InnoDB ที่เสียหาย

เมื่อวานนี้ ฮาร์ดไดรฟ์จากเซิร์ฟเวอร์เฉพาะของฉันขัดข้อง ทางเลือกเดียวที่ฉันมีคือบันทึกเท่าที่ทำได้ ก่อนที่จะเปลี่ยนฮาร์ดไดรฟ์ใหม่

สิ่งเดียวที่ฉันสามารถบันทึกได้คือโฟลเดอร์ /var/lib/mysql ตอนนี้ฉันมีฮาร์ดไดรฟ์ใหม่ที่มีฐานข้อมูล MySQL ใหม่ทำงานอยู่แต่ว่างเปล่า ฉันต้องการกู้คืนข้อมูลจากฐานข้อมูลที่ฉันมี

ฉันลองหลายสิ่งหลายอย่าง และอ่านบนอินเทอร์เน็ตว่าการส่งออก InnoDB นั้นไม่ง่ายเหมือนกับการคัดลอกโฟลเดอร์ /var/lib/mysql ทั้งหมด ดังนั้นฉันจึงไม่แน่ใจว่าฉันมีวิธีแก้ปัญหาอย่างไร

ฉันพยายามแทนที่โฟลเดอร์ /var/lib/mysql ใหม่ด้วยโฟลเดอร์ใหม่ แต่ตอนนี้ mysqld จะไม่ทำงาน บันทึกข้อผิดพลาดมีลักษณะ เช่นนี้ มาก แต่การเพิ่ม innodb_force_recovery = 1 ไม่ได้ช่วยอะไรเลย

ตอนนี้ฉันค่อนข้างหลงทางและไม่มีทางเลือก มีใครเผชิญกับสิ่งที่คล้ายกันเมื่อเร็ว ๆ นี้?

ขอบคุณ


person Benjamin Netter    schedule 29.07.2014    source แหล่งที่มา


คำตอบ (1)


มีเครื่องมือที่สามารถดึงฐานข้อมูล MySQL จากดิสก์ที่เสียหาย https://launchpad.net/undrop-for-innodb .

ฉันหวังว่าคุณจะยังมีฮาร์ดไดรฟ์เก่าติดอยู่กับเซิร์ฟเวอร์หรืออย่างน้อยก็มีภาพที่นำมาจากเซิร์ฟเวอร์

ดาวน์โหลดเวอร์ชันล่าสุดและคอมไพล์ คุณต้องมี gcc, flex และ bison เป็นการพึ่งพา

สมมติว่าคุณได้แนบดิสก์เก่า (เสียหาย) เป็น /dev/sdb

ขั้นแรก คุณต้องสแกนดิสก์และค้นหาหน้า InnoDB

./stream_parser -f /dev/sdb

จากนั้นคุณต้องกู้คืนพจนานุกรม InnoDB เพื่อทราบชื่อตาราง -> การโต้ตอบของดัชนี_id ดูรายละเอียดใน "Recover InnoDB Dictionary"

คุณจะต้องมีโครงสร้างตารางด้วย เอามาจากข้อมูลสำรองเก่าๆ (ตัวเลือกอื่นคือการกู้คืนโครงสร้างจากไฟล์ .frm หรือจากพจนานุกรม InnoDB)

เมื่อคุณทราบโครงสร้างตารางและ index_id ของตาราง คุณสามารถแยกบันทึกตารางออกจากหน้า InnoDB ได้:

./c_parser -6f pages-actor.ibd/FIL_PAGE_INDEX/0000000000002655.page -t actor.sql

Actor.sql เป็นคำสั่ง CREATE TABLE

c_parser จะสร้างคำสั่ง LOAD DATA INFILE เพื่อโหลดดัมพ์กลับใน MySQL

person akuzminsky    schedule 29.07.2014