Cách khôi phục bảng InnoDB có tệp được di chuyển xung quanh


13

Vì vậy, tôi có một máy chủ db thử nghiệm được thiết lập trên luồng sao chép. Với cái tên, một sự tối ưu hóa đã xuất hiện nhanh chóng lấp đầy không gian trên datadir nô lệ. Mysql đàng hoàng chờ đợi thêm không gian.

Datadir này là một hệ thống tệp CHỈ được sử dụng làm datadir của mysql nên không có gì khác để giải phóng.

Tôi đã có một bảng thử nghiệm innodb 4 gig không phải là một phần của luồng sao chép vì vậy tôi nghĩ rằng tôi sẽ thử một cái gì đó để xem nó có hoạt động không, và là một môi trường thử nghiệm tôi không quá lo lắng nếu mọi thứ trở nên tồi tệ.

Đây là các bước tôi đã thực hiện

  1. Rửa bàn tôi chuẩn bị di chuyển
  2. Đặt một khóa đọc trên nó (mặc dù không có gì được viết cho nó và nó không nằm trong luồng sao chép)
  3. Sao chép .frm và .ibd qua hệ thống tập tin với một số phòng dự phòng
  4. Mở khóa bàn
  5. Rút ngắn bảng đó - điều này giải phóng đủ không gian để tối ưu hóa hoàn thành có bản sao bắt đầu lặp lại.
  6. Dừng slave / shutdown mysql
  7. Sao chép tệp ra khỏi tmp trở lại thư mục dữ liệu
  8. Khởi động lại mysql

Không có gì hiển thị trong nhật ký .err, mọi thứ có vẻ tốt. Tôi kết nối và sử dụng mydb; và thấy cái bàn tôi đang rối tung trong những cái bàn trưng bày. Nhưng, nếu tôi cố gắng

select * from testtable limit 10;

Tôi nhận được lỗi

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

Từ những gì tôi có thể nói cho đến nay tôi có thể đọc từ tất cả các bảng khác tốt và sao chép bắt đầu sao lưu bất kỳ khiếu nại nào.

Có bất cứ điều gì tôi có thể làm để phục hồi từ thời điểm này? Tôi có thể xây dựng lại từ đầu nếu cần nhưng tò mò người khác nghĩ gì về liên doanh này nói chung. Có bất cứ điều gì về chuỗi các bước tôi đã thực hiện sẽ có kết quả hoàn hảo hơn không?

Điều gì sẽ xảy ra nếu đây không phải là máy chủ thử nghiệm mà tôi không thể 'thực hiện trực tiếp' và xem điều gì sẽ xảy ra? Điều gì sẽ có cách tốt nhất để giải phóng không gian tạm thời trên một nô lệ sản xuất nếu tôi phải như vậy?

Câu trả lời:


15

Điều lớn nhất mà hầu hết mọi người quên về TRUNCATE TABLE là TRUNCATE TABLE là DDL chứ không phải DML . Trong InnoDB, siêu dữ liệu trong ibdata1 chứa danh sách các bảng InnoDB được đánh số. Việc sử dụng TRUNCATE TABLE khiến id siêu dữ liệu nội bộ của bảng InnoDB thay đổi. Điều này xảy ra vì TRUNCATE TABLE thực hiện các thao tác sau:

Ví dụ: Để cắt bớt Bảng InnoDB được gọi là mydb.mytb

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

Do đó, mytb mới sẽ có id siêu dữ liệu nội bộ khác.

Khi bạn sao chép tệp .ibd sang một nơi khác, .ibd chứa trong đó id siêu dữ liệu nội bộ ban đầu. Chỉ cần đặt lại tệp .ibd không gây ra sự đối chiếu của id siêu dữ liệu nội bộ với id của siêu dữ liệu trong ibdata1.

Những gì bạn nên làm là thế này:

Sao chép tệp .ibd của bảng InnoDB. Sau đó, chạy nó

ALTER TABLE tablename DISCARD TABLESPACE;

Để đưa nó trở lại sau này, sao chép tệp .ibd trở lại datadir và sau đó chạy

ALTER TABLE tablename IMPORT TABLESPACE;

Điều này sẽ bảo toàn id siêu dữ liệu nội bộ.

Hãy chắc chắn .frm luôn có mặt.

Tôi đã từng giúp một khách hàng khôi phục 30 bảng InnoDB mà anh ta đã sử dụng theo cách tương tự. Tôi đã phải sử dụng một máy chủ DB khác và chơi một số trò chơi bằng cách thêm và xóa các bảng InnoDB để tìm ra id siêu dữ liệu nội bộ chính xác.

Khách hàng tìm thấy bài viết này: http : //www.chrryptender.com/?tag=innodb-error-tablespace-id-in-file . Chúng tôi đã sử dụng nó và nó đã giúp rất nhiều. Tôi hy vọng nó sẽ giúp bạn.


1
Tôi có 2 cơ sở dữ liệu trong đó tất cả các bảng nói Table 'X' doesn't exist in engine. Tôi có phải thực hiện phương pháp trên cho mỗi bảng không hoặc có cách nào tốt hơn để khắc phục điều đó không?
papanito

-2

Tôi đã trải nghiệm với máy Mac của mình, trước khi bán cho một người bạn chỉ cần sao chép thư mục XAMPP chỉ vào ổ cứng của tôi. . KHÔNG LÀM VIỆC, tôi vẫn không thể truy cập các bảng trong PHPMyAdmin ... - Tôi đã cố gắng cài đặt phiên bản xampp tương tự và lặp lại các bước trên, vẫn KHÔNG LÀM VIỆC. - Quyết định đi ngủ.

(THÀNH CÔNG) - Sáng nay, tôi đã mang theo đĩa sao lưu của mình và dùng thử với Windows 7. - Cài đặt XAMPP mới nhất cho Windows, c: \ xampp - Tôi có một trang web (thư mục) từ bản sao lưu \ httdocs và thư mục cơ sở dữ liệu tương ứng bên trong \ var \ mysql SYN SÀNG trong windows 7 của tôi, tôi chỉ muốn thử với một trang web sau đó thử phần còn lại vì tôi có nhiều dự án bên trong httdocs \ và \ var \ mysql - Tôi sao chép thư mục httdocs \ vào windows c: \ xampp \ httdocs và sao chép \ var \ mysql vào c: \ xampp \ mysql \ data

KHÔNG ĐƯỢC YÊU CẦU Tôi sao chép ib_logfile0, ib_logfile1, ibdata1 từ tệp sao lưu của mình sang windows xampp c: \ xampp \ mysql \ data

Tôi làm mới http: // localhost / mywebsite

WOW WOW DONG ... nó đang hoạt động ...

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.