MySQL InnoDB bị mất bảng nhưng tồn tại tệp


33

Tôi có một MySQL InnoDB có tất cả các tệp bảng cơ sở dữ liệu, nhưng MySQL không nhìn thấy chúng và không tải chúng.

Vấn đề xảy ra bởi vì tôi đã xóa ba tập tin: ibdata1, ib_logfile0ib_logfile1

bởi vì tôi đã gặp vấn đề với mysql khi khởi động và những gì tôi đọc được là loại bỏ chúng vì MySQL sẽ chỉ tạo lại chúng (tôi biết rằng tôi nên sao lưu chúng nhưng không được).

Tôi có thể làm gì để có được MySQL để xem lại các bảng?

about_member.frm                              site_stories.frm
about_member.ibd                              site_stories.ibd
db.opt                                        stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd  stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd        story_comments.frm
FTS_00000000000000bb_CONFIG.ibd               story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd        story_likes.frm
FTS_00000000000000bb_DELETED.ibd              story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd  story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd        story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd               story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd        story_views.ibd
FTS_00000000000000f5_DELETED.ibd              story_view_totals.frm
member_favorites.frm                          story_view_totals.ibd
member_favorites.ibd                          tags.frm
members.frm                                   tags.ibd
members.ibd

Bạn đã cố gắng khôi phục những tập tin đó? Các tập tin nhật ký có thể bị xóa. Bạn thực sự không nên xóa ibdata1
Ramhound

Tôi đã sao chép tệp từ một phiên bản mysql cũ nơi tệp được đặt nhưng các bảng không hiển thị.
Xuống bãi cỏ của tôi

Câu trả lời:


36

Đây là lý do tại sao MySQL không thể xem các tệp đó: Không gian bảng hệ thống (ibdata1) có một từ điển dữ liệu cụ thể của Storage-Engine cho phép InnoDB vạch ra việc sử dụng bảng tiềm năng:

Kiến trúc InnoDB

Di chuyển các bảng InnoDB từ nơi này sang nơi khác yêu cầu các lệnh như

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

Đây là một phần của Tài liệu MySQL 5.5 giải thích những gì cần được xem xét

Cân nhắc tính di động cho các tệp .ibd

Bạn không thể tự do di chuyển các tệp .ibd giữa các thư mục cơ sở dữ liệu như bạn có thể với các tệp bảng MyISAM. Định nghĩa bảng được lưu trữ trong không gian bảng chia sẻ InnoDB bao gồm tên cơ sở dữ liệu. ID giao dịch và số thứ tự nhật ký được lưu trữ trong các tệp không gian bảng cũng khác nhau giữa các cơ sở dữ liệu.

Để di chuyển tệp .ibd và bảng được liên kết từ cơ sở dữ liệu này sang cơ sở dữ liệu khác, hãy sử dụng câu lệnh RENAME TABLE:

RENAME BẢNG db1.tbl_name ĐẾN db2.tbl_name; Nếu bạn có một bản sao lưu sạch sẽ của một tập tin .ibd, bạn có thể khôi phục nó về bản cài đặt MySQL mà nó bắt nguồn như sau:

Bảng không được bỏ hoặc cắt bớt vì bạn đã sao chép tệp .ibd, vì làm như vậy sẽ thay đổi ID bảng được lưu trữ bên trong không gian bảng.

Ban hành câu lệnh ALTER TABLE này để xóa tệp .ibd hiện tại:

THAY ĐỔI BẢNG Tbl_name KHÁM PHÁ BẢNG; Sao chép tệp .ibd sao lưu vào thư mục cơ sở dữ liệu thích hợp.

Đưa ra câu lệnh ALTER TABLE này để báo cho InnoDB sử dụng tệp .ibd mới cho bảng:

THAY ĐỔI BẢNG Tbl_name NHẬP KHẨU; Trong ngữ cảnh này, một bản sao lưu tập tin .ibd sạch của Google là một trong đó đáp ứng các yêu cầu sau:

Không có sửa đổi không được cam kết bởi các giao dịch trong tệp .ibd.

Không có mục nhập bộ đệm chèn không được trộn trong tệp .ibd.

Purge đã xóa tất cả các bản ghi chỉ mục bị đánh dấu xóa khỏi tệp .ibd.

mysqld đã xóa tất cả các trang đã sửa đổi của tệp .ibd từ nhóm bộ đệm sang tệp.

Với những cảnh báo và giao thức này, đây là một quá trình hành động được đề xuất

Trong ví dụ này, chúng ta hãy thử khôi phục tagsbảng vào mydbcơ sở dữ liệu

BƯỚC 1

Đảm bảo rằng bạn có bản sao lưu của những tệp .frm.ibdtệp trong/tmp/innodb_data

BƯỚC 2

Nhận CREATE TABLE tagstuyên bố và thực hiện nó như là CREATE TABLE mydb.tags .... Hãy chắc chắn rằng nó là cấu trúc chính xác như ban đầutags.frm

BƯỚC 3

Xóa trống tags.ibdbằng MySQL

ALTER TABLE mydb.tags DISCARD TABLESPACE;

BƯỚC 4

Mang theo bản sao lưu của tags.ibd

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

BƯỚC # 5

Thêm tagsbảng vào Từ điển dữ liệu InnoDB

ALTER TABLE mydb.tags IMPORT TABLESPACE;

BƯỚC 6

Kiểm tra khả năng truy cập của bảng

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

Nếu bạn nhận được kết quả bình thường, xin chúc mừng bạn đã nhập bảng InnoDB.

BƯỚC 7

Trong tương lai, vui lòng không xóa ibdata1 và nhật ký của nó

Hãy thử một lần !!!

Tôi đã thảo luận về những điều như thế này trước đây

CẨN THẬN

Nếu bạn không biết cấu trúc bảng của thì tagssao?

Có các công cụ để nhận được câu lệnh CREATE TABLE chỉ bằng cách sử dụng .frmtệp. Tôi cũng đã viết một bài về điều này: Làm thế nào có thể trích xuất lược đồ bảng từ chỉ tệp .frm? . Trong bài đăng đó, tôi đã sao chép tệp .frm vào máy Windows từ hộp Linux, chạy công cụ Windows và nhận được CREATE TABLEtuyên bố.


Cảm ơn câu trả lời tuyệt vời! Tôi vẫn đang trong quá trình nhập một bảng, vì tôi tiếp tục tạo ra sự cố, nhưng cuối cùng tôi sẽ đến đó và tôi sẽ cho bạn biết cách hoạt động của nó! Cảm ơn!
Xuống bãi cỏ của tôi

1
Khi tôi chạy tạo, tôi nhận được: ERROR 1813 (HY000): Không gian bảng cho bảng ' weblyize. tags'tồn tại. Vui lòng KHÁM PHÁ không gian bảng trước khi NHẬP. Vì vậy, sau đó tôi cố gắng chạy không gian bảng thay đổi trước và gặp lỗi này: ERROR 1146 (42S02): Bảng 'weblyize.tags' không tồn tại . Tôi có thể làm gì?
Xuống bãi cỏ của tôi

Cảm ơn! Để khắc phục lỗi của tôi, tôi đã tạo một cơ sở dữ liệu mới, chạy CREATE TABLE ...sau đó làm theo các bước của bạn! Bạn đã cứu tôi khỏi phải viết lại chúng 100% từ đầu! Nó không nhập khóa ngoại nhưng không sao, tôi có thể tự làm điều đó! Một lần nữa cám ơn!
Xuống bãi cỏ của tôi

Điều gì xảy ra nếu tôi có 100 bảng nên được sửa theo cách này. Tôi sẽ không thực hiện các thao tác cho từng bàn bằng tay. Làm thế nào nó có thể được tự động?
Oleg Abrazhaev

10

Tôi có cùng hoàn cảnh, Không thể bỏ hoặc tạo tblname cụ thể. Thủ tục sửa chữa của tôi là:

  1. Dừng MySQL.

    service mysql stop
    
  2. Xóa ib_logfile0 và ib_logfile1.

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. Xóa các tập tin tblname. CẢNH BÁO: ĐIỀU NÀY S PER XÓA DỮ LIỆU DỮ LIỆU CỦA BẠN

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. Bắt đầu MySQL.

    service mysql start
    

1
Cảm ơn đã khắc phục sự cố của tôi, tôi đã không làm bước 3, tôi chỉ cần xóa logfiles và bắt đầu sao lưu mysql.
Jeff Wilbert

Bạn hoàn toàn tuyệt vời! Giải quyết vấn đề của tôi.
Alex GP

2

Tôi cũng có vấn đề này. Tôi đã ibdata1vô tình xóa và tất cả dữ liệu của tôi đã bị mất.

Sau 1-2 ngày tìm kiếm trong google và SO, cuối cùng tôi đã tìm thấy một giải pháp mà nó đã cứu mạng tôi (tôi có rất nhiều cơ sở dữ liệu và bảng với các hồ sơ khổng lồ).

  1. sao lưu từ /var/lib/mysql

  2. khôi phục lược đồ bảng từ .frmtệp với dbsake (có một tùy chọn khác! mysqlfrm . nhưng nó không hoạt động với tôi)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. tạo bảng mới (với tên mới) với lược đồ đã xuất.

  2. loại bỏ dữ liệu bảng mới bằng lệnh này:

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. sao chép dữ liệu của bảng cũ và dán thay vì dữ liệu mới và đặt quyền cho nó.
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. nhập dữ liệu vào bảng mới.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. ổn thỏa! chúng ta có dữ liệu trong bảng mới và chúng ta có thể bỏ dữ liệu cũ.
DROP TABLE `tbl`;
  1. kiểm tra /var/lib/mysql/database-namevà nếu có dữ liệu ( .ibdtệp) cho bảng cũ, hãy xóa nó.
rm tbl.ibd
  1. và cuối cùng đổi tên bảng mới thành tên gốc
ALTER TABLE `tbl-new` RENAME `tbl`;
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.