วิธีการกู้คืนฐานข้อมูล MySQL จากไฟล์. myd, .myi, .frm


183

วิธีการเรียกคืนหนึ่งในฐานข้อมูล MySQL ของฉันจาก.myd, .myi, .frmไฟล์?


10
แม้ว่าฉันจะตอบคำถามนี้มันเป็นของ Serverfault จริงๆ
Derobert

31
@chandrajeet คุณควรยอมรับคำตอบที่ได้รับการโหวตมากที่สุด
หอคอย

2
เฮ้ chandrajeet ทำไมคุณไม่ยอมรับคำตอบของ Derobert ล่ะ ฉันยืนยันว่ามันใช้ได้สำหรับฉันด้วย ไม่เหมาะกับคุณใช่ไหม stackoverflow.com/help/someone-answers
Taz

คำตอบ:


173

หากนี่คือตาราง MyISAM ให้ทำการเปิดไฟล์. FRR, .MYD และ. MYI ลงในไดเรกทอรีฐานข้อมูล (เช่น/var/lib/mysql/dbname) จะทำให้ตารางนั้นพร้อมใช้งาน ไม่จำเป็นต้องเป็นฐานข้อมูลเดียวกับที่มาจากเซิร์ฟเวอร์เดียวกันเวอร์ชัน MySQL เดียวกันหรือสถาปัตยกรรมเดียวกัน คุณอาจต้องเปลี่ยนความเป็นเจ้าของสำหรับโฟลเดอร์ (เช่นchown -R mysql:mysql /var/lib/mysql/dbname)

โปรดทราบว่าสิทธิ์ ( GRANT, ฯลฯ ) เป็นส่วนหนึ่งของmysqlฐานข้อมูล ดังนั้นพวกเขาจะไม่ถูกเรียกคืนพร้อมกับตาราง คุณอาจต้องเรียกใช้GRANTคำสั่งที่เหมาะสมเพื่อสร้างผู้ใช้ให้การเข้าถึง ฯลฯ (การกู้คืนmysqlฐานข้อมูลเป็นไปได้ แต่คุณต้องระวังเวอร์ชัน MySQL และการรันmysql_upgradeยูทิลิตี้ที่จำเป็น)

ที่จริงแล้วคุณอาจต้องการ. FRM (โครงสร้างตาราง) และ. MYD (ข้อมูลตาราง) แต่คุณจะต้องซ่อมแซมตารางเพื่อสร้าง. MIY (ดัชนี) ใหม่

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

[แม้ว่ามันจะชัดเจนถ้าคุณผสมและจับคู่ตารางความสมบูรณ์ของความสัมพันธ์ระหว่างตารางเหล่านั้นเป็นปัญหาของคุณ MySQL จะไม่สนใจ แต่แอปพลิเคชันของคุณและผู้ใช้ของคุณอาจ นอกจากนี้วิธีนี้ใช้ไม่ได้กับตาราง InnoDB ทั้งหมด เฉพาะ MyISAM แต่พิจารณาไฟล์ที่คุณมีคุณมี MyISAM]


สิ่งนี้จะใช้งานได้จริงหรือไม่โดยไม่เพิ่มรายการที่เหมาะสมลงในตาราง information_schema ฉันหมายถึง MySQL จำเป็นต้องรู้เพื่อค้นหาไฟล์เหล่านี้ใช่ไหม
Zenshai

4
ตาราง data_schema ไม่มีอยู่จริงพวกเขาจะดูเฉพาะในสถานะฐานข้อมูลภายใน ดูdev.mysql.com/doc/refman/5.0/en/information-schema.html
brian-brazil

4
ว้าวฉันรู้สึกสกปรก แต่ทิ้งไดเรคทอรีทั้งหมดจากที่ฉันคิดว่าติดตั้ง MySQL4 ลงใน MySQL5.1 ของฉันเพียงสร้างตารางขึ้นใหม่อย่างน่าอัศจรรย์ ไม่มีการรีสตาร์ทหรืออะไร (ใน windows)
เดฟ

4
มันทำงานได้คุณเพียงแค่จำให้เรียกใช้ (สำหรับทุกตาราง): check table sometable; แล้วเรียกใช้การซ่อมแซม (เฉพาะในกรณีจำเป็น): repair table sometable;
Nux

3
มันใช้งานได้ดีมาก! ฉันใส่ไฟล์ไว้ แต่ mysql ไม่ได้ "เห็น" จนกว่าฉันจะเปลี่ยนความเป็นเจ้าของเป็น "mysql: mysql"
sean.boyer

26

โปรดทราบว่าหากคุณต้องการสร้างไฟล์ MYI อีกครั้งการใช้ REPAIR TABLE ที่ถูกต้องคือ:

ซ่อมตาราง USE_FRM ในบางครั้ง;

มิฉะนั้นคุณอาจจะได้รับข้อผิดพลาดอีกครั้ง


24

ฉันเพิ่งค้นพบวิธีแก้ปัญหาสำหรับเรื่องนี้ ฉันใช้ MySQL 5.1 หรือ 5.6 บน Windows 7

  1. คัดลอกไฟล์. frmและibdata1จากไฟล์เก่าซึ่งอยู่ที่ "C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data"
  2. หยุดการทำงานของเซิร์ฟเวอร์ SQL ในอินสแตนซ์ SQL ปัจจุบัน
  3. ไปที่ฐานข้อมูลที่อยู่ที่ "C: \ Program Data \ MySQL \ MSQLServer5.1 \ Data"
  4. วางibdata1และโฟลเดอร์ของฐานข้อมูลของคุณซึ่งมีไฟล์. frmจากไฟล์ที่คุณต้องการกู้คืน
  5. เริ่มอินสแตนซ์ MySQL

ไม่จำเป็นต้องค้นหาไฟล์. MYI และ. MYD สำหรับการกู้คืนนี้


ทำตามขั้นตอนเหล่านี้ (หลังจากทุกอย่างล้มเหลว) และใช้innodb_force_recovery = 4ระดับ (ไม่แน่ใจว่าจำเป็นสำหรับกรณีนี้) ขอบคุณพระเจ้า!
Joshua Stewardson

6
FYI: ibdata1คือ InnoDB ไม่ใช่ MyISAM
Derobert

14

สิ่งหนึ่งที่ควรทราบ:

ไฟล์. FRM มีโครงสร้างตารางของคุณอยู่และเฉพาะรุ่น MySQL ของคุณ

ไฟล์. MYD ไม่ได้เฉพาะเจาะจงกับเวอร์ชั่นอย่างน้อยก็ไม่ใช่เวอร์ชั่นรอง

ไฟล์. MYI นั้นมีความเฉพาะเจาะจง แต่สามารถปล่อยออกมาและสร้างใหม่ได้REPAIR TABLEเหมือนคำตอบอื่น ๆ ที่พูด

จุดประสงค์ของคำตอบนี้คือให้คุณรู้ว่าหากคุณมี schema dump ของตารางของคุณคุณสามารถใช้มันเพื่อสร้างโครงสร้างของตารางจากนั้นแทนที่ไฟล์. MYD เหล่านั้นด้วยการสำรองข้อมูลของคุณลบไฟล์ MYI และซ่อมแซม ทั้งหมด. วิธีนี้คุณสามารถเรียกคืนการสำรองข้อมูลของคุณไปยัง MySQL mysqldumpรุ่นอื่นหรือย้ายฐานข้อมูลของคุณทั้งหมดโดยไม่ต้องใช้ ฉันพบว่ามีประโยชน์อย่างยิ่งเมื่อย้ายฐานข้อมูลขนาดใหญ่


14

! ง่าย สร้างฐานข้อมูลจำลอง (พูด abc)

คัดลอกไฟล์. myd, .myi, .frm เหล่านี้ทั้งหมดไปยัง mysql \ data \ abc โดยที่ mysql \ data \ เป็นสถานที่ซึ่ง. myd, .myi, .frm สำหรับฐานข้อมูลทั้งหมดจะถูกเก็บไว้

จากนั้นไปที่ phpMyadmin ไปที่ db abc แล้วคุณจะพบฐานข้อมูลของคุณ


คำตอบที่สั้นและแม่นยำ
Serak Shiferaw

วิธีที่ดีที่สุดในการกู้คืนข้อมูล ... ฉันติดตั้ง WAMP แล้วสร้างฐานข้อมูลใหม่คัดลอกไฟล์ในไดเรกทอรีฐานข้อมูลใหม่ C: \ WAMP64 \ bin \ mysql \ mysqlxx \ data \ newdatabase เปิด phpmyadmin และฐานข้อมูลใหม่ของคุณคุณจะ ดูข้อมูล
Alexandre georges

7

ฉันคิดว่า. mii คุณสามารถซ่อมแซมได้จากภายใน mysql

หากคุณเห็นข้อความแสดงข้อผิดพลาดประเภทนี้จาก MySQL: ฐานข้อมูลล้มเหลวในการเรียกใช้คิวรี (แบบสอบถาม) 1016: ไม่สามารถเปิดไฟล์: 'someable.MYI' (errno: 145) ข้อผิดพลาดเกี่ยวกับ: 1034: ไฟล์คีย์ไม่ถูกต้องสำหรับตาราง: 'บางครั้ง' ลองซ่อมมันแล้วคุณอาจจะมีตารางที่เสียหายหรือเสียหาย

คุณสามารถตรวจสอบและซ่อมแซมตารางได้จากพรอมต์ mysql ดังนี้:

check table sometable;
+------------------+-------+----------+----------------------------+
| Table | Op | Msg_type | Msg_text | 
+------------------+-------+----------+----------------------------+ 
| yourdb.sometable | check | warning | Table is marked as crashed | 
| yourdb.sometable | check | status | OK | 
+------------------+-------+----------+----------------------------+ 

repair table sometable;
+------------------+--------+----------+----------+ 
| Table | Op | Msg_type | Msg_text | 
+------------------+--------+----------+----------+ 
| yourdb.sometable | repair | status | OK | 
+------------------+--------+----------+----------+

และตอนนี้ตารางของคุณควรจะดี:

check table sometable;
+------------------+-------+----------+----------+ 
| Table | Op | Msg_type | Msg_text |
+------------------+-------+----------+----------+ 
| yourdb.sometable | check | status | OK |
+------------------+-------+----------+----------+

6

ฉันพบวิธีแก้ปัญหาสำหรับการแปลงไฟล์เป็น.sqlไฟล์ (คุณสามารถนำเข้า.sqlไฟล์ไปยังเซิร์ฟเวอร์และกู้คืนฐานข้อมูล) โดยไม่จำเป็นต้องเข้าถึง/varไดเรกทอรีดังนั้นคุณไม่จำเป็นต้องเป็นผู้ดูแลเซิร์ฟเวอร์เพื่อทำเช่นนี้

มันต้องการ XAMPP หรือ MAMP ติดตั้งบนคอมพิวเตอร์ของคุณ

  • หลังจากที่คุณได้ติดตั้ง XAMPP นำทางไปยังไดเรกทอรีที่ติดตั้ง (ปกติC:\XAMPP) mysql\dataและย่อยไดเรกทอรี เส้นทางแบบเต็มควรเป็นC:\XAMPP\mysql\data
  • ภายในคุณจะเห็นโฟลเดอร์ของฐานข้อมูลอื่น ๆ ที่คุณสร้างขึ้น คัดลอกและวางโฟลเดอร์เต็มรูปแบบของ.myd, .myiและ.frmไฟล์ลงมี เส้นทางไปยังโฟลเดอร์นั้นควรเป็น

    C:\XAMPP\mysql\data\foldername\.mydfiles

  • จากนั้นไปlocalhost/phpmyadminที่เบราว์เซอร์ เลือกฐานข้อมูลที่คุณเพิ่งวางลงในmysql\dataโฟลเดอร์และคลิกที่ส่งออกในแถบนำทาง เลือกส่งออกเป็น.sqlไฟล์ จากนั้นจะปรากฏขึ้นถามที่บันทึกไฟล์

และนั่นคือมัน! ตอนนี้คุณ (ควร) มี.sqlไฟล์ที่มีฐานข้อมูลที่เป็นมา.mydก่อน.myiและ.frmไฟล์ จากนั้นคุณสามารถนำเข้าสู่เซิร์ฟเวอร์อื่นผ่าน phpMyAdmin โดยสร้างฐานข้อมูลใหม่และกด 'นำเข้า' ในแถบนำทางแล้วทำตามขั้นตอนเพื่อนำเข้า


5

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


หากฉันไม่มี MySQL รุ่นเดียวกันทุกตัวฉันควรทำอย่างไร
Jo Sprague


2

คำอธิบายข้างต้นไม่เพียงพอที่จะทำให้สิ่งต่าง ๆ ใช้งานได้สำหรับฉัน (อาจหนาแน่นหรือขี้เกียจ) ดังนั้นฉันจึงสร้างสคริปต์นี้เมื่อฉันพบคำตอบที่จะช่วยฉันในอนาคต หวังว่าจะช่วยผู้อื่น

vim fixperms.sh 

#!/bin/sh
for D in `find . -type d`
do
        echo $D;
        chown -R mysql:mysql $D;
        chmod -R 660 $D;
        chown mysql:mysql $D;
        chmod 700 $D;
done
echo Dont forget to restart mysql: /etc/init.d/mysqld restart;

-2

สำหรับผู้ที่มี Windows XP และติดตั้งเซิร์ฟเวอร์ MySQL 5.5 - ตำแหน่งของฐานข้อมูลคือ C: \ Documents และ Settings \ ผู้ใช้งานทั้งหมด \ Data Data \ MySQL \ MySQL Server 5.5 \ data เว้นแต่ว่าคุณเปลี่ยนตำแหน่งภายในการติดตั้ง MySql Workbench GUI


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