กู้คืน MySQL Tables จากไฟล์. ibd, .frm และ mysqllogbin


10

ด้วยเหตุผลบางอย่างเมื่อฉันพยายามเปิดตารางของฉันที่เก็บไว้ใน.frmและ.ibdไฟล์ (ไม่ว่าจะใน MySQL หรือ phpmyadmin) มันทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์หรือมันบอกว่ามันไม่มีอยู่

ฉันได้อ่านโพสต์อื่นที่มีปัญหาคล้ายกันนี้ แต่ฉันไม่ทราบวิธีตรวจสอบว่าinnodb_file_per_tableเปิดใช้งานหรือไม่และโดยรวมฉันสับสนจริงๆ ฉันแปลงสำเนาmysql-bin.000002ไฟล์เป็นไฟล์ txt ด้วยดังนั้นฉันเห็นว่าข้อมูลจากฐานข้อมูลของฉันไม่สูญหายทั้งหมด

ฐานข้อมูลถูกสร้างขึ้นเมื่อปีที่แล้ว ฉันมีmysql-bin.00000ไฟล์เหล่านี้ 6 ไฟล์ แต่ด้วยเหตุผลบางอย่างไฟล์.000002ใหญ่ที่สุด ตอนนี้ฉันมี.ibdและ.frmไฟล์สำหรับฐานข้อมูลทั้งหมดของฉัน แต่ฉันกำลังสูญเสียว่าฉันสามารถคืนค่ากลับสู่ MySQL หรืออย่างน้อยก็เป็นสิ่งที่ฉันสามารถอ่านได้

ฉันใช้ WampServer 2.4 และ MySQL 5.6.12 บน Windows 2003 Server นอกจากนี้ฉันควรจะดาวน์โหลดปลั๊กอินใน InnoDB ด้วยหรือไม่


ไม่มันถูกสร้างขึ้นเมื่อปีที่แล้ว ฉันมีไฟล์ไฟล์ mysql-bin.00000 6 ไฟล์ แต่ด้วยเหตุผลบางอย่างไฟล์. 000002 นั้นใหญ่ที่สุด ตอนนี้ฉันมีไฟล์. ibd และ. frm สำหรับฐานข้อมูลทั้งหมดของฉัน แต่ฉันก็หลงทางว่าฉันจะกู้คืนมันกลับสู่ MySQL ได้หรืออย่างน้อยก็เป็นสิ่งที่ฉันสามารถอ่านได้
carment

คำตอบ:


20

ในที่สุดฉันก็พบและแก้ไขปัญหาของฉันผ่านการทดลองและข้อผิดพลาดมากมาย สำหรับผู้ที่ไม่มีไฟล์ ibdata1 ดั้งเดิมและมีเฉพาะไฟล์. frm และ. ibd ต่อไปนี้เป็นวิธีเรียกคืนข้อมูลของฉัน

  1. ดาวน์โหลดและติดตั้งสาธารณูปโภค MySQL ที่ -> http://dev.mysql.com/downloads/utilities
  2. ไปที่คำสั่ง / เทอร์มินัลของคุณเพื่อเปิดยูทิลิตี้ MySQL, mysqlfrm และใช้มันเพื่อค้นหาโครงสร้างของตารางที่คุณต้องการกู้คืน วิธีที่ฉันทำคือฉันถูก cd'ed ในตำแหน่งไฟล์ของ mysqlfrm จากนั้นป้อน "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt" ไฟล์. txt ควรได้รับการบันทึกไว้ในโฟลเดอร์เดียวกับที่บันทึกยูทิลิตี้ของคุณหากคุณไม่ได้ระบุว่าต้องการไปที่ไหน
  3. ในไฟล์ข้อความคุณจะเห็นคำสั่ง CREATE TABLE ซึ่งรวมถึงคอลัมน์และข้อมูลทั้งหมด (โดยทั่วไปคือโครงสร้างดั้งเดิม) ของตารางของคุณ คัดลอกคำสั่ง CREATE นั้นด้วยข้อมูลทั้งหมด
  4. ในคำสั่ง MySQL ของคุณสร้างฐานข้อมูลใหม่ (สร้างฐานข้อมูล database_name) ทำให้เป็นชื่อเดียวกับชื่อฐานข้อมูลดั้งเดิมของคุณ
  5. สร้างตารางใหม่ภายในฐานข้อมูลใหม่ - ไม่จำเป็นต้องเป็นชื่อเดียวกันกับโฟลเดอร์ คุณสามารถสร้างตารางใหม่ภายในพรอมต์คำสั่ง แต่ฉันสร้างตารางของฉันใน PhpMyAdmin เครื่องมือซอฟต์แวร์ฟรีที่จัดการการบริหาร MySQL ผ่านเว็บ ฉันเพียงคลิกที่ฐานข้อมูลบน PhpMyAdmin จากนั้นตาราง SQL และวางโครงสร้างตารางจาก # 3 (ในฐานะที่เป็นข้อความด้านข้างฉันมักจะได้รับข้อผิดพลาดเสมอหากฉันตั้งชื่อตาราง "ตาราง" ในพรอมต์คำสั่งของฉันดังนั้นพยายามหลีกเลี่ยงชื่อนั้น)
  6. ในคำสั่ง MySQL ของคุณไปที่ฐานข้อมูลของคุณแล้วป้อน "ALTER TABLE table_name DISCARD TABLESPACE" ซึ่งจะลบไฟล์. ibd ของตารางนี้เป็นหลัก
  7. คัดลอกตารางดั้งเดิมของคุณ (ตารางที่คุณต้องการกู้คืน) ไฟล์. ibd ลงในตารางที่สร้างขึ้นใหม่เพื่อแทนที่ไฟล์. ibd ที่คุณเพิ่งลบ เปลี่ยนไฟล์. ibd เริ่มต้นของคุณเป็นชื่อของตารางที่สร้างขึ้นใหม่ สิ่งนี้จะเลียนแบบไฟล์. ibd เก่าที่คุณเพิ่งลบ คุณสามารถค้นหาโฟลเดอร์นี้ในโฟลเดอร์ข้อมูล MySQL ภายใต้โฟลเดอร์ฐานข้อมูลที่สร้างขึ้นใหม่บนคอมพิวเตอร์ของคุณ
  8. กลับไปที่คำสั่ง MySQL ของคุณไปที่ฐานข้อมูลแล้วป้อน "แก้ไขตาราง table_Name IMPORT TABLESPACE" คุณจะได้รับข้อความแจ้งเตือน "คำเตือน" (1) ชนิดข้อผิดพลาด แต่ไม่ต้องสนใจ
  9. และทำ! หากคุณพยายามเข้าถึงตารางใหม่ควรมีข้อมูลทั้งหมดจากตารางเก่าของคุณ

ฉันหวังว่าสิ่งนี้จะช่วยได้และแจ้งให้เราทราบหากคุณมีคำถามหรือความคิดเห็นใด ๆ ! นอกจากนี้ตรวจสอบhttp://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-fileสำหรับรายละเอียดอื่น ๆ


คำแนะนำที่ยอดเยี่ยม แต่ใช้งานได้กับ MySQL 5.6เท่านั้น! เมื่อวันที่ 5.5 คุณจะได้รับข้อผิดพลาดเมื่อคุณเรียกใช้Got error -1 from storage engine IMPORT TABLESPACEแต่สำหรับฉัน MySQL 5.6 ทำงานได้กับตารางที่สร้างขึ้นโดยใช้ MySQL 5.5 ดังนั้นมันดีทั้งหมด;) หากคุณติดกับ 5.5 คุณต้องทำตามคำแนะนำในลิงค์ chriscalenderที่คุณโพสต์
ostrokach

@carment ฉันทำตามคำแนะนำของคุณแล้ว แต่ฉันเผชิญ ERRPR: พยายามเข้าถึงหมายเลขหน้า 1767006713 ในช่องว่าง 13635 ชื่อช่องว่าง <dbname> / <tblname> ซึ่งอยู่นอกพื้นที่ตารางที่ถูกผูกไว้ คุณช่วยแนะนำฉันว่าฉันควรทำอะไรไปบ้าง
Mohit Mehta

สิ่งนี้ช่วยให้ฉันประหยัดเวลาในการสร้างตารางใหม่ วิธียังคงใช้ได้ในปี 2559 บน MySQL 5.7.17
Andy Mercer

@ ostrokach ดูเหมือนว่าเป็นเพราะคุณไม่ได้innodb_file_per_tableเปิดใช้งาน
Yvan

คุณเพียงแค่ .. ช่วยฉันหลังจากการเดินทางที่ยาวนานขอบคุณมาก!
Amr SubZero

4

ไฟล์ข้อมูล InnoDB หลักซึ่งมักจะตั้งชื่อibdata- เป็นสิ่งจำเป็นสำหรับคุณ MySQL ที่จะเข้าใจไฟล์. ibd ของคุณ

หากคุณต้องการย้ายข้อมูลระหว่างเซิร์ฟเวอร์โดยใช้ไฟล์ไบนารีคุณควรหยุด MySQL อย่างเรียบร้อยแล้วย้ายไฟล์ข้อมูลทั้งหมดรวมถึงไฟล์ ibdataระหว่างไดเรกทอรี

กลไกที่เชื่อถือได้มากขึ้นในการย้ายข้อมูลระหว่างเซิร์ฟเวอร์บน Windows คือการใช้ ( mysqldump) หรือการส่งออกฐานข้อมูลจาก PHPMyAdmin (หรือเครื่องมือที่คล้ายกัน)

หากการบันทึกแบบไบนารีถูกเปิดใช้งานตลอดเวลาที่เซิร์ฟเวอร์ของคุณกำลังทำงานอยู่ (ตามความคิดเห็นนี่อาจไม่ใช่กรณี) คุณสามารถใช้mysqlbinlogเพื่อกู้คืนคำสั่ง SQL ทุกคำสั่งที่คุณเรียกใช้บนเซิร์ฟเวอร์จากไฟล์ mysql-bin และสร้างฐานข้อมูลด้วยวิธีนี้ ควรมีการประทับเวลา unixในไฟล์ mysql-bin ที่ช่วยให้คุณกำหนดว่าจะไปได้ไกลแค่ไหน

หากคุณทำไฟล์ฐานข้อมูลดั้งเดิมหายไปและสิ่งที่คุณได้ทิ้งไว้คือไฟล์. ibd แต่ละไฟล์คุณอาจต้องทำการกู้คืนข้อมูลตามคำแนะนำของ akuzminsky ในความคิดเห็น

MySQL 5.6 มีคุณสมบัติใหม่บางอย่างสำหรับการย้าย InnoDB .ibd ไฟล์ข้อมูล ( ตารางขนส่ง ) mysqldumpแต่เหล่านี้ต้องใช้ความพยายามบางอย่างและสำหรับฐานข้อมูลขนาดเล็กพอที่มันจะเป็นเรื่องง่ายที่จะถ่ายโอนข้อมูลโดยใช้


0

คำตอบวิกิพีเดียสร้างขึ้นจากความคิดเห็นคำถามโดยakuzminsky


ถ้าคุณเห็น*.ibdไฟล์แล้วinnodb_file_per_tableคือมิฉะนั้นตารางทั้งหมดจะอยู่ในONibdata1

ถ้ามันบอกว่าไม่มีตารางแสดงว่าตารางนั้นขาดหายไปในพจนานุกรม InnoDB พยายามที่จะถ่ายโอนข้อมูลตารางทั้งหมดลงในการถ่ายโอนข้อมูลแยก sql (หนึ่งตาราง - หนึ่งไฟล์) ตารางเหล่านั้นคุณจะไม่สามารถถ่ายโอนข้อมูลคุณสามารถเรียกคืนกับTwinDB เครื่องมือการกู้คืน

ยังไม่มีแพ็คเกจไบนารี คุณต้องได้รับซอร์สโค้ดจาก GitHub และรวบรวมมัน โปรดดูคำแนะนำในการกู้คืนพจนานุกรม InnoDB มันค่อนข้างตรงไปตรงมา:

git clone git@github.com:twindb/undrop-for-innodb.git

แล้ว

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