Thứ Năm, ngày 30 tháng 11 năm 2006
Cách khôi phục các tệp cơ sở dữ liệu MySQL vô tình xóa
Gần đây, tôi tình cờ thấy một bài đăng trên diễn đàn MySQL của Đức từ người dùng vô tình xóa tất cả các tệp bảng khỏi thư mục dữ liệu của máy chủ MySQL với tập lệnh shell sai. Anh ấy đã rất ngạc nhiên khi phát hiện ra rằng máy chủ vui vẻ tiếp tục phục vụ các yêu cầu và trang web của anh ấy vẫn hoạt động đầy đủ, mặc dù
/var/lib/mysql/hoàn toàn là emtpy! Lý do cho điều này một cách ngắn gọn:
RMLệnh chỉ xóa tham chiếu đến các tệp bảng khỏi thư mục cơ sở dữ liệu, bản thân các tệp không bị xóa khỏi hệ thống tệp
mysqldQuá trình vẫn có các tập tin được mở. Vì vậy, miễn là một quá trình giữ một tệp mở, kernel sẽ không giải phóng không gian đĩa bị chiếm bởi tệp và nó sẽ vẫn còn nguyên, mặc dù không còn hiển thị.
Tất nhiên, người dùng hiện đang tuyệt vọng để khôi phục các tệp bảng bị xóa và đã yêu cầu trợ giúp. May mắn thay, việc phục hồi trong trường hợp này là khá đơn giản. Trước tiên, bạn nên tắt ứng dụng của mình để tránh hoạt động tiếp theo trên cơ sở dữ liệu bị ảnh hưởng. Quan trọng: Bạn không được tắt máy chủ MySQL, vì điều này sẽ đóng tham chiếu mở cuối cùng vào các tệp bảng! Bây giờ bạn chỉ có thể sử dụngImportant: you must not shut down the MySQL Server, as this would close the last open reference to the table files! Now you can simply use
mysqldump --opt> cơ sở dữ liệu.sqlĐể thực hiện một kết xuất SQL của các bảng đã xóa. Vì máy chủ MySQL vẫn có thể truy cập các tệp bảng mở, kết xuất sẽ chứa toàn bộ nội dung và sau đó có thể được sử dụng để khôi phục lại cơ sở dữ liệu. Bây giờ bạn nên khởi động lại máy chủ MySQL để nó đóng các mô tả tệp vẫn mở của các tệp bảng bị xóa. Ngoài ra, bạn có thể sử dụng
Bàn thảhoặc
Thả cơ sở dữ liệuĐể xóa đúng các tài liệu tham khảo, trong trường hợp bạn không muốn tắt toàn bộ máy chủ. Bây giờ bạn có thể khôi phục các bảng bị thiếu của mình từ bãi rác SQL như bình thường và có thể khởi động lại ứng dụng của bạn!
Lưu ý rằng thủ thuật này chỉ hoạt động trên các tệp bảng đã bị xóa ở cấp hệ thống tệp, không phải sau khi bạn sử dụng
BẢNG/Cơ sở dữ liệu thả, vì vậy, đó không phải là một hàm hoàn tác ma thuật cho các lệnh này - chỉ khôi phục từ bản sao lưu gần đây [ví dụ: được thực hiện với mylvmbackup, gợi ý, gợi ý] sẽ giúp trong trường hợp này. Ngoài ra, máy chủ MySQL phải đã mở các bảng trước đó. Máy chủ MySQL mới bắt đầu chưa mở bất kỳ tệp bảng nào ngoài các tệp trong
mysqlCơ sở dữ liệu hệ thống.
Nhân tiện, có một bài viết liên quan "Mang lại các tệp đã xóa bằng LSOF" trên Linux.com bao gồm chủ đề khôi phục các tệp đã xóa [nhưng vẫn mở] ở cấp độ chung hơn và cũng cung cấp thêm một số thông tin cơ bản về Linux Internals . Đáng đọc!
38
Làm cách nào để khôi phục tệp .sql trong mysql?
Learn more.
Có thể khôi phục bảng về lần trước với dữ liệu nếu tất cả dữ liệu bị xóa một cách tình cờ.
Hỏi ngày 3 tháng 8 năm 2011 lúc 10:10Aug 3, 2011 at 10:10
2
Có một giải pháp khác, nếu bạn có nhật ký nhị phân hoạt động trên máy chủ của mình, bạn có thể sử dụng mysqlbinlog
tạo tệp SQL với nó
mysqlbinlog binary_log_file > query_log.sql
Sau đó tìm kiếm các hàng bị thiếu của bạn. Nếu bạn không có nó hoạt động, không có giải pháp nào khác. Thực hiện sao lưu lần sau.
Đã trả lời ngày 3 tháng 8 năm 2011 lúc 10:15Aug 3, 2011 at 10:15
Mihai Iorgamihai IorgaMihai Iorga
38.7K15 Huy hiệu vàng107 Huy hiệu bạc106 Huy hiệu đồng15 gold badges107 silver badges106 bronze badges
5
Loại của. Sử dụng phpmyadmin, tôi chỉ xóa một hàng quá nhiều. Nhưng tôi đã bắt được nó trước khi tôi tiến hành và có hầu hết dữ liệu từ thông báo XÓA XÓA. Tôi đã có thể xây dựng lại hồ sơ. Nhưng thông điệp xác nhận đã cắt ngắn một số bình luận văn bản.
Ai đó hiểu biết hơn tôi về phpmyadmin có thể biết về một cài đặt để bạn có thể nhận được tiếng vang hoàn chỉnh hơn về thông báo Xóa Xóa. Với một thông báo xóa hoàn toàn có sẵn, nếu bạn chậm lại và bắt lỗi, bạn có thể khôi phục toàn bộ bản ghi.
.
Đã trả lời ngày 6 tháng 11 năm 2012 lúc 14:58Nov 6, 2012 at 14:58
Aardvark27Aardvark27Aardvark27
511 Huy hiệu bạc1 Huy hiệu đồng1 silver badge1 bronze badge
Như Mitch đã đề cập, việc sao lưu dữ liệu lên là phương pháp tốt nhất.
Tuy nhiên, có thể trích xuất dữ liệu bị mất một phần tùy thuộc vào tình huống hoặc máy chủ DB được sử dụng. Đối với hầu hết các phần, bạn không gặp may nếu bạn không có bất kỳ bản sao lưu nào.
Đã trả lời ngày 3 tháng 8 năm 2011 lúc 10:14Aug 3, 2011 at 10:14
Tôi xin lỗi, BU không thể thực hiện được, trừ khi bạn tạo tệp sao lưu trước đó.
EDIT: Thật ra điều đó là có thể, nhưng nó rất khó khăn và bạn không nên nghĩ về nó nếu dữ liệu không thực sự, thực sự quan trọng. Bạn thấy: Khi dữ liệu bị xóa khỏi máy tính, nó vẫn ở cùng một vị trí trên đĩa, chỉ có các lĩnh vực của nó được đánh dấu là trống. Vì vậy, dữ liệu vẫn còn nguyên vẹn, ngoại trừ nếu nó bị ghi đè bởi dữ liệu mới. Có một số chương trình được thiết kế cho mục đích này và có những công ty chuyên phục hồi dữ liệu, mặc dù chúng khá đắt.
Đã trả lời ngày 3 tháng 8 năm 2011 lúc 10:14Aug 3, 2011 at 10:14
Tôi xin lỗi, BU không thể thực hiện được, trừ khi bạn tạo tệp sao lưu trước đó.JanLikar
EDIT: Thật ra điều đó là có thể, nhưng nó rất khó khăn và bạn không nên nghĩ về nó nếu dữ liệu không thực sự, thực sự quan trọng. Bạn thấy: Khi dữ liệu bị xóa khỏi máy tính, nó vẫn ở cùng một vị trí trên đĩa, chỉ có các lĩnh vực của nó được đánh dấu là trống. Vì vậy, dữ liệu vẫn còn nguyên vẹn, ngoại trừ nếu nó bị ghi đè bởi dữ liệu mới. Có một số chương trình được thiết kế cho mục đích này và có những công ty chuyên phục hồi dữ liệu, mặc dù chúng khá đắt.8 silver badges20 bronze badges
Janlikarjanlikar
1.2448 Huy hiệu bạc20 Huy hiệu Đồng
Đối với các bảng Innodb, Percona có một công cụ phục hồi có thể giúp ích. Nó không an toàn hoặc hoàn hảo, và bạn dừng máy chủ MySQL của mình nhanh như thế nào sau khi xóa tình cờ có tác động lớn. Nếu bạn đủ nhanh, các thay đổi là bạn có thể khôi phục khá nhiều dữ liệu, nhưng việc khôi phục tất cả dữ liệu là không thể.Sep 17, 2013 at 15:12
Của Cours, bản sao lưu hàng ngày thích hợp, binlogs và có thể là nô lệ sao chép [không giúp ích cho việc xóa tình cờ nhưng không giúp được gì trong trường hợp lỗi phần cứng] là cách để đi, nhưng công cụ này có thể cho phép bạn lưu nhiều dữ liệu như có thể khi bạn chưa có những thứ đó.Wrikken
Đã trả lời ngày 17 tháng 9 năm 2013 lúc 15:128 gold badges94 silver badges135 bronze badges
1
WrikkenWrikken
Đã trả lời ngày 3 tháng 8 năm 2011 lúc 10:15Aug 3, 2011 at 10:15
Mihai Iorgamihai IorgaTjekkles
38.7K15 Huy hiệu vàng107 Huy hiệu bạc106 Huy hiệu đồng8 gold badges35 silver badges52 bronze badges
Loại của. Sử dụng phpmyadmin, tôi chỉ xóa một hàng quá nhiều. Nhưng tôi đã bắt được nó trước khi tôi tiến hành và có hầu hết dữ liệu từ thông báo XÓA XÓA. Tôi đã có thể xây dựng lại hồ sơ. Nhưng thông điệp xác nhận đã cắt ngắn một số bình luận văn bản.
Ai đó hiểu biết hơn tôi về phpmyadmin có thể biết về một cài đặt để bạn có thể nhận được tiếng vang hoàn chỉnh hơn về thông báo Xóa Xóa. Với một thông báo xóa hoàn toàn có sẵn, nếu bạn chậm lại và bắt lỗi, bạn có thể khôi phục toàn bộ bản ghi.
Đã trả lời ngày 3 tháng 8 năm 2011 lúc 10:15Aug 3, 2011 at 10:15
Mihai Iorgamihai IorgaMyISAM tables, then you can recover any data you deleted, just
38.7K15 Huy hiệu vàng107 Huy hiệu bạc106 Huy hiệu đồngmysql/data/[your_db]/[your_table].MYD
Loại của. Sử dụng phpmyadmin, tôi chỉ xóa một hàng quá nhiều. Nhưng tôi đã bắt được nó trước khi tôi tiến hành và có hầu hết dữ liệu từ thông báo XÓA XÓA. Tôi đã có thể xây dựng lại hồ sơ. Nhưng thông điệp xác nhận đã cắt ngắn một số bình luận văn bản.
Ai đó hiểu biết hơn tôi về phpmyadmin có thể biết về một cài đặt để bạn có thể nhận được tiếng vang hoàn chỉnh hơn về thông báo Xóa Xóa. Với một thông báo xóa hoàn toàn có sẵn, nếu bạn chậm lại và bắt lỗi, bạn có thể khôi phục toàn bộ bản ghi.Apr 8, 2016 at 15:03
.jmp
Đã trả lời ngày 6 tháng 11 năm 2012 lúc 14:583 gold badges28 silver badges45 bronze badges