Cách khôi phục cơ sở dữ liệu MySQL từ các tệp .myd, .myi, .frm


183

Làm thế nào để khôi phục một trong những cơ sở dữ liệu MySQL của tôi từ .myd, .myi, .frmfile?


10
Mặc dù tôi đã trả lời nhưng nó thực sự thuộc về Serverfault.
derobert

31
@ Vendrajeet bạn thực sự nên chấp nhận câu trả lời được bình chọn nhiều nhất.
Tháp

2
Này chandrajeet, tại sao bạn không chấp nhận câu trả lời của derobert? Tôi xác nhận nó làm việc cho tôi quá. Nó không dành cho bạn? stackoverflow.com/help/someone-answers
Taz

Câu trả lời:


173

Nếu đây là các bảng MyISAM, thì việc đưa các tệp .RM, .MYD và .MYI vào một thư mục cơ sở dữ liệu (ví dụ /var/lib/mysql/dbname:) sẽ cung cấp bảng đó. Nó không phải là cùng một cơ sở dữ liệu như chúng đến từ cùng một máy chủ, cùng một phiên bản MySQL hoặc cùng một kiến ​​trúc. Bạn cũng có thể cần thay đổi quyền sở hữu cho thư mục (ví dụ chown -R mysql:mysql /var/lib/mysql/dbname:)

Lưu ý rằng các quyền ( GRANT, v.v.) là một phần của mysqlcơ sở dữ liệu. Vì vậy, chúng sẽ không được khôi phục cùng với các bảng; bạn có thể cần chạy các GRANTcâu lệnh thích hợp để tạo người dùng, cấp quyền truy cập, v.v. (Có thể khôi phục mysqlcơ sở dữ liệu, nhưng bạn cần cẩn thận với các phiên bản MySQL và mọi hoạt động cần thiết của mysql_upgradetiện ích.)

Trên thực tế, có lẽ bạn chỉ cần .RR (cấu trúc bảng) và .MYD (dữ liệu bảng), nhưng bạn sẽ phải sửa chữa bảng để xây dựng lại .MYI (chỉ mục).

Hạn chế duy nhất là nếu bạn đang hạ cấp, tốt nhất bạn nên kiểm tra ghi chú phát hành (và có thể chạy bảng sửa chữa). Phiên bản MySQL mới hơn thêm tính năng, tất nhiên.

[Mặc dù nó là hiển nhiên, nhưng nếu bạn trộn và khớp các bảng, tính toàn vẹn của các mối quan hệ giữa các bảng đó là vấn đề của bạn; MySQL sẽ không quan tâm, nhưng ứng dụng của bạn và người dùng của bạn có thể. Ngoài ra, phương pháp này hoàn toàn không hoạt động đối với các bảng InnoDB. Chỉ MyISAM, nhưng xem xét các tệp bạn có, bạn có MyISAM]


Điều này sẽ thực sự hoạt động mà không cần thêm các mục thích hợp vào bảng information_schema? Ý tôi là MySQL cần biết để tìm những tập tin này đúng không?
Zenshai

4
Các bảng information_schema không thực sự tồn tại, chúng chỉ xem ở trạng thái cơ sở dữ liệu nội bộ. Xem dev.mysql.com/doc/refman/5.0/en/inatures-schema.html
brian-brazil

4
Ồ, tôi cảm thấy bẩn, nhưng bỏ toàn bộ thư mục từ những gì tôi nghĩ là cài đặt MySQL4 vào MySQL5.1 của tôi chỉ được tạo lại một cách kỳ diệu các bảng. Không khởi động lại hoặc bất cứ điều gì (trên windows).
Dave

4
Nó hoạt động bạn chỉ cần nhớ lại để chạy (cho mỗi bảng): check table sometable; và sau đó chạy sửa chữa (chỉ khi cần thiết): repair table sometable;
Nux

3
Điều này đã làm việc tuyệt vời! Tôi đã đặt các tập tin vào vị trí, nhưng mysql không "nhìn thấy" chúng cho đến khi tôi thay đổi quyền sở hữu thành "mysql: mysql".
sean.boyer

26

Lưu ý rằng nếu bạn muốn xây dựng lại tệp MYI thì việc sử dụng chính xác REPAIR TABLE là:

BẢNG SỬA CHỮA đôi khi USE_FRM;

Nếu không, bạn có thể sẽ chỉ nhận được một lỗi khác.


24

Tôi chỉ phát hiện ra giải pháp cho việc này. Tôi đang sử dụng MySQL 5.1 hoặc 5.6 trên Windows 7.

  1. Sao chép .frm tập tin và ibdata1 từ tập tin cũ được đặt vào "C: \ Data Chương trình \ MySQL \ MSQLServer5.1 \ Data"
  2. Dừng phiên bản máy chủ SQL trong phiên bản SQL hiện tại
  3. Chuyển đến bộ dữ liệu được đặt tại "C: \ Data Data \ MySQL \ MSQLServer5.1 \ Data"
  4. Dán ibdata1thư mục cơ sở dữ liệu của bạn chứa tệp .frm từ tệp bạn muốn khôi phục.
  5. Bắt đầu phiên bản MySQL.

Không cần xác định vị trí tệp .MYI và .MYD để phục hồi này.


Thực hiện theo các bước này (sau khi mọi thứ khác đã thất bại) và sử dụng innodb_force_recovery = 4cấp độ (không chắc chắn là cần thiết trong trường hợp này). Ơn Chúa!
Joshua Stewardson

6
FYI: ibdata1là InnoDB, không phải MyISAM.
derobert

14

Một điều cần lưu ý:

Tệp .RM có cấu trúc bảng của bạn trong đó và dành riêng cho phiên bản MySQL của bạn.

Tệp .MYD KHÔNG dành riêng cho phiên bản, ít nhất không phải là phiên bản nhỏ.

Tệp .MYI là cụ thể, nhưng có thể bị bỏ qua và được tạo lại REPAIR TABLEgiống như các câu trả lời khác nói.

Điểm của câu trả lời này là để cho bạn biết rằng nếu bạn có một lược đồ kết xuất các bảng của mình, thì bạn có thể sử dụng nó để tạo cấu trúc bảng, sau đó thay thế các tệp .MYD đó bằng các bản sao lưu của bạn, xóa các tệp MYI và sửa chữa chúng tất cả. Bằng cách này, bạn có thể khôi phục bản sao lưu của mình sang phiên bản MySQL khác hoặc di chuyển cơ sở dữ liệu của bạn hoàn toàn mà không cần sử dụng mysqldump. Tôi đã tìm thấy siêu hữu ích này khi di chuyển cơ sở dữ liệu lớn.


14

Đơn giản! Tạo một cơ sở dữ liệu giả (nói abc)

Sao chép tất cả các tệp .myd, .myi, .frm này vào mysql \ data \ abc trong đó mysql \ data \ là nơi lưu trữ .myd, .myi, .frm cho tất cả các cơ sở dữ liệu.

Sau đó vào phpMyadmin, truy cập db abc và bạn tìm thấy cơ sở dữ liệu của mình.


câu trả lời
ngắn gọn

Cách tốt nhất để khôi phục dữ liệu ... Tôi đã cài đặt WAMP, sau đó tạo cơ sở dữ liệu mới, sao chép tệp trong thư mục cơ sở dữ liệu mới C: \ WAMP64 \ bin \ mysql \ mysqlxx \ data \ newdatabase mở phpmyadmin và cơ sở dữ liệu mới của bạn, bạn sẽ xem dữ liệu
Alexandre georges

7

Tôi nghĩ .myi bạn có thể sửa chữa từ bên trong mysql.

Nếu bạn thấy các loại thông báo lỗi này từ MySQL: Cơ sở dữ liệu không thể thực hiện truy vấn (truy vấn) 1016: Không thể mở tệp: 'đôi khi.MYI'. (errno: 145) Lỗi Msg: 1034: Tệp khóa không chính xác cho bảng: 'đôi khi'. Cố gắng sửa chữa nó sau đó bạn có thể có một bảng bị hỏng hoặc bị hỏng.

Bạn có thể kiểm tra và sửa chữa bảng từ một dấu nhắc mysql như thế này:

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 | 
+------------------+--------+----------+----------+

và bây giờ bảng của bạn sẽ ổn:

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

6

Tôi đã tìm thấy một giải pháp để chuyển đổi các tệp thành một .sqltệp (sau đó bạn có thể nhập .sqltệp vào máy chủ và khôi phục cơ sở dữ liệu), mà không cần phải truy cập vào /varthư mục, do đó bạn không cần phải là quản trị viên máy chủ để thực hiện việc này.

Nó yêu cầu XAMPP hoặc MAMP được cài đặt trên máy tính của bạn.

  • Sau khi bạn đã cài đặt XAMPP, hãy điều hướng đến thư mục cài đặt (Thông thường C:\XAMPP) và thư mục con mysql\data. Đường dẫn đầy đủ phải làC:\XAMPP\mysql\data
  • Bên trong bạn sẽ thấy các thư mục của bất kỳ cơ sở dữ liệu nào khác mà bạn đã tạo. Copy & Paste thư mục đầy đủ các .myd, .myi.frmcác file vào đó. Đường dẫn đến thư mục đó phải là

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

  • Sau đó truy cập localhost/phpmyadmintrong một trình duyệt. Chọn cơ sở dữ liệu bạn vừa dán vào mysql\datathư mục và nhấp vào Xuất trong thanh điều hướng. Chọn xuất nó dưới dạng .sqltệp. Sau đó nó sẽ bật lên hỏi nơi lưu tập tin

Và đó là nó! Bạn (nên) bây giờ có một .sqltập tin có chứa các cơ sở dữ liệu ban đầu .myd, .myi.frmtập tin. Sau đó, bạn có thể nhập nó vào một máy chủ khác thông qua phpMyAdmin bằng cách tạo cơ sở dữ liệu mới và nhấn 'Nhập' trong thanh điều hướng, sau đó làm theo các bước để nhập nó


5

Bạn có thể sao chép các tệp vào thư mục thư mục con có tên thích hợp của thư mục dữ liệu miễn là nó là phiên bản CHÍNH XÁC của myQuery và bạn đã giữ lại tất cả các tệp được liên kết trong thư mục đó. Nếu bạn không có tất cả các tệp, tôi chắc chắn bạn sẽ gặp vấn đề.


Nếu tôi không có phiên bản chính xác của MySQL, tôi phải làm gì?
Jo Sprague


2

Mô tả ở trên không đủ để khiến mọi thứ hoạt động với tôi (có thể dày đặc hoặc lười biếng) vì vậy tôi đã tạo ra kịch bản này một khi tôi tìm thấy câu trả lời giúp tôi trong tương lai. Hy vọng nó sẽ giúp người khác

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

Đối với những người đã cài đặt Windows XP và cài đặt máy chủ MySQL 5.5 - vị trí của cơ sở dữ liệu là C: \ Documents and Settings \ All Users \ Application Data \ MySQL \ MySQL Server 5.5 \ data, trừ khi bạn thay đổi vị trí trong cài đặt MySql Workbench GUI.


3
Câu hỏi là về việc khôi phục từ các loại tệp cụ thể, không phải là nơi các tệp đó có thể được tìm thấy trên Windows XP MySQL 5.5.
Danpe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.