Khôi phục Bảng MySQL từ các tệp .ibd, .frm và mysqllogbin


10

Vì một số lý do, khi tôi cố gắng mở các bảng được lưu trữ trong các tệp .frm.ibdtệp (cho dù trên MySQL hay phpmyadmin), nó sẽ báo lỗi cho tôi hoặc nó không tồn tại.

Tôi đã đọc bài đăng khác có vấn đề tương tự như vậy, nhưng tôi không biết làm thế nào để kiểm tra xem có innodb_file_per_tableđược bật hay không và nói chung tôi thực sự bối rối. Tôi cũng đã chuyển đổi một bản sao của mysql-bin.000002tệp của mình thành một tệp txt để tôi thấy rằng dữ liệu từ cơ sở dữ liệu của tôi không bị mất hoàn toàn.

Cơ sở dữ liệu đã được tạo ra vào năm ngoái. Tôi có 6 trong số các mysql-bin.00000tệp đó, nhưng vì lý do nào đó .000002là lớn nhất. Ngay bây giờ, tôi có các tệp .ibd.frmtệp cho tất cả các cơ sở dữ liệu của mình, nhưng tôi không biết làm cách nào để khôi phục lại nó vào MySQL hoặc ít nhất là vào thứ gì đó tôi có thể đọc được.

Tôi đang sử dụng WampServer 2.4 và MySQL 5.6.12 trên Windows 2003 Server. Ngoài ra, tôi có nên tải xuống một plugin trong InnoDB không?


Không, nó đã được tạo ra vào năm ngoái. Tôi có 6 trong số các tệp mysql-bin.00000, nhưng vì một số lý do, 0,000002 là lớn nhất. Ngay bây giờ, tôi có các tệp .ibd và .frm cho tất cả các cơ sở dữ liệu của mình, nhưng tôi không biết làm cách nào để khôi phục lại nó vào MySQL, hoặc ít nhất là vào thứ gì đó tôi có thể đọc được.
chăm sóc

Câu trả lời:


19

Cuối cùng tôi đã tìm ra và giải quyết vấn đề của mình thông qua rất nhiều thử nghiệm và sai sót. Đối với những người không có tệp ibdata1 ban đầu của họ và chỉ có tệp .frm và .ibd của họ, đây là cách tôi khôi phục dữ liệu của mình.

  1. Tải xuống và cài đặt các tiện ích MySQL tại -> http://dev.mysql.com/doads/utilities .
  2. Đi vào lệnh / thiết bị đầu cuối của bạn để mở tiện ích MySQL, mysqlfrm và sử dụng nó để tìm cấu trúc của bảng mà bạn cần khôi phục. Tôi đã làm như thế nào, tôi đã vào vị trí tệp của mysqlfrm, sau đó nhập "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt". Tệp .txt phải được lưu trong cùng thư mục với nơi các tiện ích của bạn được lưu nếu bạn không chỉ định nơi bạn muốn đến.
  3. Trong tệp văn bản, bạn sẽ thấy các câu lệnh CREATE TABLE, bao gồm tất cả các cột và thông tin (về cơ bản, cấu trúc ban đầu) của bảng của bạn. Sao chép câu lệnh CREATE với tất cả thông tin đó.
  4. Trong Lệnh MySQL của bạn, hãy tạo một cơ sở dữ liệu mới (TẠO cơ sở dữ liệu cơ sở dữ liệu). Đặt tên giống như tên cơ sở dữ liệu ban đầu của bạn.
  5. Tạo một bảng mới bên trong cơ sở dữ liệu mới - nó không phải cùng tên với thư mục. Bạn có thể tạo bảng mới bên trong dấu nhắc lệnh, nhưng tôi đã tạo bảng của mình trong PhpMyAdmin, một công cụ phần mềm miễn phí xử lý việc quản trị MySQL trên web. Tôi chỉ cần nhấp vào cơ sở dữ liệu trên PhpMyAdmin, sau đó là bảng SQL và dán cấu trúc bảng từ # 3. (Như một lưu ý phụ, tôi luôn nhận được lỗi nếu tôi đặt tên bảng là "bảng" trong dấu nhắc lệnh của mình, vì vậy hãy cố gắng tránh tên đó).
  6. Trên Lệnh MySQL của bạn, đi vào cơ sở dữ liệu của bạn và nhập "ALTER TABLE table_name DISCARD TABLESPACE", về cơ bản sẽ xóa tệp .ibd của bảng này.
  7. Sao chép tệp gốc của bạn (bảng bạn muốn khôi phục) tệp .ibd vào bảng vừa tạo để thay thế tệp .ibd mà bạn vừa xóa. Thay đổi tệp .ibd ban đầu của bạn thành tên của bảng vừa tạo. Điều này sẽ bắt chước tệp .ibd cũ mà bạn vừa xóa. Bạn có thể tìm thấy thư mục này trong thư mục dữ liệu MySQL, trong thư mục cơ sở dữ liệu mới được tạo trên máy tính của bạn.
  8. Quay trở lại Lệnh MySQL của bạn, truy cập vào cơ sở dữ liệu của bạn và nhập "ALTER TABLE table_Name NHẬP TABLESPACE." Bạn sẽ nhận được một tuyên bố loại lỗi "cảnh báo" (1), nhưng chỉ cần bỏ qua điều đó.
  9. Và thực hiện! nếu bạn cố truy cập vào bảng mới của mình, nó sẽ chứa tất cả dữ liệu từ bảng cũ của bạn.

Tôi hy vọng điều này có ích, và cho tôi biết nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào! Ngoài ra, hãy xem http://www.chrryptender.com/?tag=innodb-error-tablespace-id-in-file để biết các chi tiết khác.


Hướng dẫn tuyệt vời, nhưng nó chỉ hoạt động với MySQL 5.6 ! Ngày 5.5 bạn sẽ gặp lỗi Got error -1 from storage enginekhi chạy IMPORT TABLESPACE. Nhưng đối với tôi, MySQL 5.6 hoạt động cho các bảng được tạo bằng MySQL 5.5, vì vậy tất cả đều tốt;). Nếu bạn bị kẹt với 5.5, bạn phải làm theo hướng dẫn trong liên kết tài khoản mà bạn đặt ra.
Ostrokach

@carment Tôi đã làm theo hướng dẫn của bạn nhưng tôi phải đối mặt với ERRPR: cố gắng truy cập số trang 1767006713 trong không gian 13635, tên không gian <dbname> / <tblname>, nằm ngoài không gian bảng bị ràng buộc. Bạn có thể hướng dẫn cho tôi những gì tôi có thể đã làm?
Mohit Mehta

Điều này chỉ giúp tôi tiết kiệm rất nhiều thời gian để tạo lại một cái bàn. Phương thức vẫn hoạt động vào năm 2016, trên MySQL 5.7.17
Andy Mercer

@ostrokach có vẻ như là vì bạn chưa innodb_file_per_tablekích hoạt.
Yvan

Bạn chỉ .. cứu tôi sau một hành trình rất dài, cảm ơn bạn!
Amr SubZero

4

Tệp dữ liệu chính của InnoDB - thường được đặt tên ibdata- là điều cần thiết để MySQL của bạn có thể hiểu các tệp .ibd của bạn.

Nếu bạn cần di chuyển dữ liệu giữa các máy chủ bằng các tệp nhị phân, bạn nên dừng MySQL sạch và sau đó di chuyển tất cả các tệp dữ liệu, bao gồm (các) tệp ibdata , giữa các thư mục.

Một cơ chế đáng tin cậy hơn để di chuyển dữ liệu giữa các máy chủ trên Windows sẽ là sử dụng ( mysqldump) hoặc xuất cơ sở dữ liệu từ PHPMyAdmin (hoặc một công cụ tương tự).

Nếu ghi nhật ký nhị phân đã được bật trong toàn bộ thời gian máy chủ của bạn đang chạy (dựa trên các nhận xét, đây có thể không phải là trường hợp), bạn cũng có thể sử dụng mysqlbinlogđể khôi phục mọi câu lệnh SQL bạn đã chạy trên máy chủ từ các tệp mysql-bin và tạo lại cơ sở dữ liệu theo cách đó. Cần có dấu thời gian unix trong các tệp mysql-bin giúp bạn xác định khoảng thời gian họ quay lại.

Nếu bạn đã mất các tệp cơ sở dữ liệu gốc và tất cả những gì bạn còn lại là các tệp .ibd riêng lẻ, bạn có thể phải dùng đến việc khôi phục dữ liệu theo đề xuất của akuzminsky trong các nhận xét.

MySQL 5.6 có một số tính năng mới để di chuyển các tệp dữ liệu InnoDB .ibd ( không gian bảng có thể di chuyển ), nhưng chúng đòi hỏi một số nỗ lực và, đối với một cơ sở dữ liệu đủ nhỏ, việc truyền dữ liệu sẽ dễ dàng hơn nhiều mysqldump.


0

Wiki câu trả lời được tạo ra từ các bình luận câu hỏi của akuzminsky


Nếu bạn thấy *.ibdcác file sau đó innodb_file_per_tableđược ON, nếu không tất cả các bảng sẽ trong ibdata1.

Nếu nó báo một bảng không tồn tại thì bảng bị thiếu trong từ điển InnoDB. Cố gắng đổ tất cả các bảng vào các bãi chứa sql riêng biệt (một bảng - một tệp). Những bảng bạn không thể kết xuất, bạn có thể khôi phục bằng bộ công cụ khôi phục TwinDB .

Không có gói nhị phân nào. Bạn phải lấy mã nguồn từ GitHub và biên dịch nó. Xem hướng dẫn tại từ điển Recover InnoDB . Nó khá đơn giản:

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

và sau đó

make all
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.