Tôi có thể xóa tệp mysql ibd không?

Tôi chắc rằng hầu hết các bạn đều đã gặp lỗi sau và trong nhiều trường hợp, lỗi này khá dễ chẩn đoán vì thông báo lỗi rất rõ ràng

111111 11:11:11 [ERROR] MySQL is trying to open a table handle but the .ibd file for
table test/t does not exist.
Have you deleted the .ibd file from the database directory under
the MySQL datadir, or have you used DISCARD TABLESPACE?
See http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html
how you can resolve the problem.

Từ phía khách hàng, bạn có thể thấy một cái gì đó giống như

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

Tuy nhiên, nếu bạn biết bạn (hoặc một số tập lệnh sao lưu/lưu trữ) đã không xóa tệp, cũng như bạn không chạy ALTER TABLE table DISCARD TABLESPACE, thì điều gì khác có thể gây ra điều này?

Chà, gần đây tôi đã phát hiện ra một trường hợp có thể xảy ra khi một bảng cắt bớt (trên bảng InnoDB sử dụng plugin không có khóa ngoại – vì vậy phương pháp cắt ngắn nhanh được sử dụng và innodb_file_per_table được bật) được phát hành trên bảng

Sau đó, nếu một sự cố xảy ra ở giữa này (sau khi. ibd đã bị xóa, nhưng trước khi quá trình tạo lại hoàn tất), thì bạn có thể gặp phải lỗi này (sau khi khởi động lại và CHỌN tiếp theo trên bảng này)

Tôi cho rằng điều này khá hiếm, nhưng dù sao cũng có thể xảy ra, vì vậy tôi muốn thêm thông tin này cho những người đang tìm kiếm nhiều khả năng mất tích hơn. tập tin ibd

Một bảng có không gian bảng dành riêng cho bảng (được lưu trữ trong tệp

ERROR 1146 (42S02): Table 'test.t' doesn't exist
3) có thể được khôi phục riêng lẻ mà không cần gỡ bỏ máy chủ MySQL. Kỹ thuật này có thể áp dụng nếu bạn xóa nhầm hoặc cập nhật dữ liệu bảng mà không thực sự làm mất bảng thông qua câu lệnh
ERROR 1146 (42S02): Table 'test.t' doesn't exist
4,
ERROR 1146 (42S02): Table 'test.t' doesn't exist
5 hoặc
ERROR 1146 (42S02): Table 'test.t' doesn't exist
6

Nếu bạn có bản sao lưu sạch của tệp

ERROR 1146 (42S02): Table 'test.t' doesn't exist
3, bạn có thể khôi phục tệp đó về bản cài đặt MySQL mà tệp bắt nguồn từ đó như sau

  1. Đối với MySQL 5. 5 trở về trước, bảng phải tồn tại và không bị xóa hoặc cắt bớt kể từ khi thực hiện sao lưu. Khi một bảng InnoDB bị cắt bớt hoặc bị xóa và được tạo lại, nó sẽ nhận được một ID bảng mới. Bất kỳ ID nào không khớp giữa bảng trong cơ sở dữ liệu và bảng đã sao lưu đều có thể khiến nó không được khôi phục. Yêu cầu đối với ID bảng phù hợp cũng là lý do tại sao bạn phải khôi phục vào cùng một máy chủ MySQL mà dữ liệu sao lưu đến, chứ không phải máy chủ khác có bộ cơ sở dữ liệu và bảng tương tự. Hạn chế này không áp dụng cho MySQL 5. 6 trở lên, miễn là việc khôi phục được thực hiện từ phiên bản Thường có sẵn (GA) này sang phiên bản khác trong cùng một loạt máy chủ MySQL

  2. Ngăn chặn thao tác ghi cho bảng được khôi phục. Điều này ngăn người dùng sửa đổi bảng trong khi quá trình khôi phục đang diễn ra

    LOCK TABLES tbl_name WRITE;
    
  3. Đưa ra tuyên bố

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    8 này

    ALTER TABLE tbl_name DISCARD TABLESPACE;
    

    thận trọng. Thao tác này sẽ xóa tệp

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    3 hiện tại

  4. Sao chép tệp

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    3 sao lưu trở lại thư mục cơ sở dữ liệu thích hợp

  5. Đưa ra tuyên bố

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    8 này

    ALTER TABLE tbl_name IMPORT TABLESPACE;
    
  6. Nhả khóa ghi để hoàn tất quy trình khôi phục

    UNLOCK TABLES;
    

Trong bối cảnh này, một bản sao lưu tập tin sạch____13 có nghĩa là

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

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    3

  • Không có mục nhập bộ đệm chèn chưa hợp nhất trong tệp

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    3

  • Thanh lọc đã xóa tất cả các bản ghi chỉ mục được đánh dấu xóa khỏi tệp

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    3

  • mysqld đã xóa tất cả các trang đã sửa đổi của tệp

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    3 từ vùng đệm sang tệp

Bạn có thể tạo một tệp

ERROR 1146 (42S02): Table 'test.t' doesn't exist
3 sao lưu sạch như vậy bằng phương pháp sau

  1. Dừng tất cả hoạt động từ máy chủ mysqld và cam kết tất cả các giao dịch

  2. Đợi cho đến khi

    ALTER TABLE tbl_name DISCARD TABLESPACE;
    
    9 hiển thị rằng không có giao dịch nào đang hoạt động trong cơ sở dữ liệu và trạng thái luồng chính của
    ALTER TABLE tbl_name IMPORT TABLESPACE;
    
    0 là
    ALTER TABLE tbl_name IMPORT TABLESPACE;
    
    1. Sau đó, bạn có thể tạo một bản sao của tệp
    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    3

Một phương pháp khác để tạo một bản sao rõ ràng của tệp

ERROR 1146 (42S02): Table 'test.t' doesn't exist
3 là sử dụng mysqlbackup

  1. Sử dụng mysqlbackup với tùy chọn

    ALTER TABLE tbl_name IMPORT TABLESPACE;
    
    4 hoặc
    ALTER TABLE tbl_name IMPORT TABLESPACE;
    
    5 để sao lưu cài đặt
    ALTER TABLE tbl_name IMPORT TABLESPACE;
    
    0

  2. Chạy

    ALTER TABLE tbl_name IMPORT TABLESPACE;
    
    7 để tạo phiên bản nhất quán của cơ sở dữ liệu sao lưu

  3. Bắt đầu một máy chủ mysqld thứ hai (giả) trên bản sao lưu và để nó dọn sạch các tệp

    ERROR 1146 (42S02): Table 'test.t' doesn't exist
    3 trong bản sao lưu. Chờ quá trình dọn dẹp kết thúc

    Tệp MySQL IBD là gì?

    Tệp IBD là bảng MySQL được tạo bởi công cụ cơ sở dữ liệu InnoDB . Nó chứa một vùng bảng cụ thể và dữ liệu chỉ mục. Các tệp IBD được tạo khi tùy chọn innodb_file_per_table của MySQL được bật, tùy chọn này theo mặc định.

    Các tệp IBD và FRM là gì?

    Tệp FRM được Máy chủ MySQL sử dụng để lưu trữ lược đồ bảng và. Tệp IBD dùng để lưu trữ dữ liệu và chỉ mục của cơ sở dữ liệu MySQL . Trong trường hợp vô tình xóa dữ liệu hoặc hỏng cơ sở dữ liệu MySQL, bạn có thể khôi phục dữ liệu từ. FRM và.

    Làm cách nào chúng tôi có thể mở tệp IBD?

    Bạn có thể mở tệp IBD trong MySQL (đa nền tảng) nếu bạn đang sử dụng công cụ cơ sở dữ liệu InnoDB . Ví dụ: bạn có thể sử dụng tệp IBD dự phòng để khôi phục bảng chứa trong đó nếu bản sao hiện tại của bảng bị hỏng hoặc bị xóa.