Hoàn tác DROP bảng mysql

Đôi khi bạn có thể đánh rơi một bảng chứa dữ liệu mà bạn vẫn cần. Nếu vậy, bạn nên xem xét làm cho các bảng quan trọng của mình có thể phục hồi được sau thao tác xóa bảng

Bạn có thể khôi phục dữ liệu bảng bằng cách gọi thao tác khôi phục cơ sở dữ liệu, sau đó là thao tác cuộn tới cơ sở dữ liệu đến một thời điểm trước khi bảng bị hủy. Các thao tác khôi phục và chuyển tiếp có thể tốn thời gian nếu cơ sở dữ liệu lớn và dữ liệu của bạn không khả dụng trong quá trình khôi phục

Tính năng khôi phục bảng bị mất cho phép bạn khôi phục dữ liệu bảng bị mất của mình bằng cách sử dụng các thao tác khôi phục và khôi phục ở cấp độ không gian bảng

Khôi phục cấp độ không gian bảng này nhanh hơn khôi phục cấp độ cơ sở dữ liệu và cơ sở dữ liệu của bạn vẫn sẵn dùng cho người dùng

Trước khi bắt đầu

Để một bảng bị hủy có thể khôi phục được, không gian bảng chứa bảng đó phải được bật tùy chọn PHỤC HỒI BẢNG ĐÃ XÓA. Tùy chọn này có thể được bật trong khi tạo không gian bảng hoặc bằng cách gọi câu lệnh ALTER TABLESPACE. Tùy chọn DROPPED TABLE RECOVERY dành riêng cho không gian bảng và giới hạn ở các không gian bảng thông thường. Để xác định xem một vùng bảng có được bật để khôi phục bảng bị hủy hay không, bạn có thể truy vấn cột DROP_RECOVERY trong SYSCAT. Bảng danh mục TABLESPACES

Tùy chọn khôi phục bảng bị hủy được bật theo mặc định khi bạn tạo một vùng bảng. Nếu bạn không muốn kích hoạt một không gian bảng để khôi phục bảng bị hủy, bạn có thể đặt rõ ràng tùy chọn DROPPED TABLE RECOVERY thành TẮT khi bạn đưa ra câu lệnh CREATE TABLESPACE hoặc bạn có thể sử dụng câu lệnh ALTER TABLESPACE để vô hiệu hóa việc khôi phục bảng bị hủy cho một . Nếu có nhiều thao tác trên bảng bị hủy cần khôi phục hoặc nếu tệp lịch sử lớn, thì tính năng khôi phục bảng bị hủy có thể ảnh hưởng đến hiệu suất đối với quá trình khôi phục về phía trước

Khi chạy câu lệnh DROP TABLE đối với một bảng có không gian bảng được kích hoạt để khôi phục bảng bị hủy, một mục nhập bổ sung (xác định bảng bị hủy) được tạo trong tệp nhật ký. Một mục cũng được tạo trong tệp lịch sử khôi phục, chứa thông tin có thể được sử dụng để tạo lại bảng

Đối với các bảng được phân vùng, tính năng khôi phục bảng bị hủy luôn bật ngay cả khi tính năng khôi phục bảng bị hủy bị tắt đối với các bảng không được phân vùng trong một hoặc nhiều không gian bảng. Chỉ một bản ghi nhật ký bảng bị hủy được ghi cho một bảng được phân vùng. Bản ghi nhật ký này đủ để khôi phục tất cả các phân vùng dữ liệu của bảng

Về nhiệm vụ này

Nếu bảng ở trạng thái chờ sắp xếp lại khi sự cố xảy ra, nội dung của CREATE TABLE DDL có thể cần được thay đổi để khớp với nội dung của tệp dữ liệu

Nếu bạn hành động nhanh chóng, có nhiều khả năng bạn sẽ lấy lại được cơ sở dữ liệu của mình. Cơ hội cao hơn đối với InnoDB hoặc MyISAM, nó khác không, nhưng gần

Vấn đề là khi MySQL thực thi DROP TABLE hoặc DROP DATABASE (về cơ bản là giống nhau) InnoDB không xóa sạch dữ liệu. Các trang có dữ liệu vẫn còn trên đĩa

Tùy thuộc vào cài đặt innodb_file_per_table, quá trình khôi phục sẽ khác nhau. Nếu innodb_file_per_table TẮT (mặc định cho đến 5. 5) thì bảng bị hủy vẫn còn trong ibdata1. Nếu innodb_file_per_table được BẬT (mặc định là 5. 5) thì bảng bị bỏ rơi ở vị trí tương ứng. tập tin ibd. MySQL xóa tệp này khi bỏ bảng

Điều đầu tiên cần làm là dừng mọi thao tác ghi có thể xảy ra để bảng của bạn không bị ghi đè. Nếu innodb_file_per_table TẮT thì đủ để dừng MySQL (kill -9 thậm chí còn tốt hơn, nhưng trước tiên hãy đảm bảo rằng bạn kill safe_mysqld). Nếu innodb_file_per_table được BẬT thì hãy bỏ qua phân vùng nơi MySQL lưu trữ dữ liệu của nó. Nếu datadir nằm trên phân vùng gốc, tôi khuyên bạn nên tắt máy chủ hoặc ít nhất là chụp ảnh đĩa. Để tôi nhắc lại, mục tiêu là ngăn chặn việc ghi đè bảng bị hủy bởi MySQL hoặc hệ điều hành

Có một công cụ cho phép làm việc với các trang InnoDB ở cấp độ thấp, đó là bộ công cụ khôi phục dữ liệu TwinDB. Tôi sẽ sử dụng nó để minh họa phục hồi undrop

Bạn cần lấy phương tiện có bảng bị hủy (ibdata1 hoặc ảnh đĩa) và tìm các trang InnoDB trên đó. công cụ stream_parser từ bộ công cụ thực hiện

./stream_parser -f /path/to/disk/image

Nó sẽ quét tệp, tìm các trang InnoDB và sắp xếp chúng theo loại và index_id. index_id là một mã định danh mà InnoDB sử dụng để chỉ một chỉ mục. Một bảng được lưu trữ trong chỉ mục CHÍNH. Để tìm index_id là bảng bị mất của bạn, bạn cần khôi phục từ điển InnoDB

Từ điển InnoDB được lưu trữ trong tệp ibdat1. Bạn cần quét tệp ibdata1 theo cách tương tự như trên

./stream_parser -f /var/lib/mysql/ibdata1

Bây giờ bạn cần lấy các bản ghi từ các bảng từ điển InnoDB SYS_TABLES và SYS_INDEXES (giả sử bảng của bạn là sakila. diễn viên)

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor
000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  0

158 là table_id, hãy nhớ nó

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158
000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295
000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx\_actor\_last\_name"        1       0       0       4294967295

Vì vậy, index_id của bảng bị hủy của bạn(sakila. diễn viên) là 376

Giờ đây, bạn có thể tìm nạp các bản ghi của bảng bị hủy từ InnoDB index_id 376. Bạn cần có cấu trúc bảng của bảng bị hủy, chính xác câu lệnh CREATE TABLE mà bảng được tạo bằng. Bạn có thể lấy nó ở đâu? . Cũng có thể khôi phục cấu trúc từ từ điển InnoDB, nhưng tôi sẽ không đề cập đến nó trong câu trả lời này. Hãy cứ coi như bạn có nó

./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t actor.sql > dump.tsv 2> load_cmd.sql

c_parser xuất các bản ghi dưới dạng kết xuất được phân tách bằng tab thành thiết bị xuất chuẩn. Kết xuất có thể được tải bằng lệnh LOAD DATA. c_parser in nó ra stderr

Bạn có thể hoàn tác một bảng thả?

Các. lệnh hoàn tác thả bảng hoàn nguyên thao tác thả bảng về một phiên bản cơ sở dữ liệu cụ thể . Lệnh phải được thực thi với bối cảnh cơ sở dữ liệu.

Làm cách nào để khôi phục bảng đã xóa trong MySQL?

Nội dung .
Sử dụng lệnh mysql để khôi phục cơ sở dữ liệu từ dòng lệnh. .
Khôi phục tất cả cơ sở dữ liệu trong MySQL từ tệp kết xuất bằng mysqldump
Sử dụng mysqldump để khôi phục một bảng từ tệp kết xuất
Khôi phục cơ sở dữ liệu MySQL từ. tệp sql bằng Workbench
Khôi phục cơ sở dữ liệu trong MySQL bằng phpMyAdmin

Chúng ta có thể hoàn tác xóa trong MySQL không?

Sau khi hàng bị xóa, hàng sẽ biến mất. Bạn có thể sẽ phải sử dụng bản sao lưu để khôi phục dữ liệu. Các trường hợp ngoại lệ đối với điều này là nếu bạn đang xóa bên trong một Giao dịch đang mở, thì trong những trường hợp đó bạn có thể "Hoàn tác" giao dịch để hoàn tác mọi thay đổi được thực hiện bên trong giao dịch.