国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql 找回誤刪表的數據辦法

2024-07-24 13:00:28
字體:
來源:轉載
供稿:網友

有備份的話很簡單,只需要生成一個最近備份的數據 然后用MySQLbinlog找回備份時間點之后的數據 再恢復到現網即可。

要是沒有備份 可能就會比較麻煩,找回數據的成本也是非常之高的.

下面介紹下 mysqlbinlog找回備份時間點之后的數據的辦法:

做個簡單的實驗,將MySQL的表數據刪除之后,然后用mysqlbinlog 找回剛才刪除的表的數據。

app表的創建時間和數據的插入: 2013-02-04 10:00:00 

原理: mysqlbinlog

前提: mysql開啟了bin log日志

測試刪除之前:

mysql> show tables;+-----------------------+| Tables_in_report_sina |+-----------------------+| app                   || test                  |+-----------------------+

mysql> select now();+---------------------+| now()               |+---------------------+| 2013-02-04 11:45:44 |+---------------------+1 row in set (0.01 sec)

mysql> select count(1) from app;+----------+| count(1) |+----------+|       10 |+----------+1 row in set (0.01 sec)

 

開始刪除數據:

mysql> delete from app where id =1;Query OK, 1 row affected (0.00 sec)

mysql> mysql> delete from  app where id <6;Query OK, 4 rows affected (0.01 sec)

mysql> select count(1) from app;+----------+| count(1) |+----------+|        5 |+----------+1 row in set (0.00 sec)

 

mysql> select now();+---------------------+| now()               |+---------------------+| 2013-02-04 12:08:45 |+---------------------+

 

開始找回數據:

1.找到bin log的位置:

/app/mysql/log

-rw-rw---- 1 mysql mysql  17K Feb  4 11:43 alert.log-rw-rw---- 1 mysql mysql 1.0K Nov  1 14:52 master-bin.000001-rw-rw---- 1 mysql mysql  126 Dec 25 14:00 master-bin.000002-rw-rw---- 1 mysql mysql  126 Dec 25 14:02 master-bin.000003-rw-rw---- 1 mysql mysql  126 Dec 25 14:02 master-bin.000004-rw-rw---- 1 mysql mysql  107 Dec 25 14:02 master-bin.000005-rw-rw---- 1 mysql mysql  13K Feb  4 12:02 master-bin.000006

可以看到 最近被修改的bin log 只有  master-bin.000006 

(要是誤刪除跨越了好幾個bin log 找回數據的時候就必須一個個的bin log日志去找回了)

將這一段時間所有執行的sql語句存入到 待恢復的 sql文件中。

mysqlbinlog --start-date='2013-02-04 10:00:00' --stop-date='2013-02-04 12:08:45' /app/mysql/log/master-bin.000006 >/app/mysql/mysql_restore_20130204.sql

當然在現網環境下 ,這個時間可能沒那么的準確,并且還有其他事務sql語句的干擾。

 

創建臨時數據庫

create database for_bak;

導出當前數據庫中被誤刪的表 app

mysqldump -uroot -ppwd my_db app > /app/mysql/app.sql

 

將現在的數據導入到臨時表:

mysql -root -ppwd for_bak < /app/mysql/app.sql

 

我們再來看下 /app/mysql/mysql_restore_20130204.sql的部分內容: (可以看到罪惡的delete 語句)

SET TIMESTAMP=1359949544/*!*/;BEGIN/*!*/;# at 12878#130204 11:45:44 server id 1  end_log_pos 12975  Query thread_id=5 exec_time=974 error_code=0SET TIMESTAMP=1359949544/*!*/;delete from app where id =1/*!*/;# at 12975#130204 11:45:44 server id 1  end_log_pos 13002  Xid = 106COMMIT/*!*/;# at 13002#130204 11:45:44 server id 1  end_log_pos 13077  Query thread_id=5 exec_time=1013 error_code=0SET TIMESTAMP=1359949544/*!*/;BEGIN/*!*/;# at 13077#130204 11:45:44 server id 1  end_log_pos 13175  Query thread_id=5 exec_time=1013 error_code=0SET TIMESTAMP=1359949544/*!*/;delete from  app where id <6/*!*/;# at 13175#130204 11:45:44 server id 1  end_log_pos 13202  Xid = 107COMMIT/*!*/;DELIMITER ;# End of log file

 

可以看到 數據是什么時間點刪除的 。  具體的時間也可以用 select from_unixtime(1359949544); 來查詢

令人欣慰的是 create table app 語句和 insert 的語句也在這個文件之中。 在手工去掉 delete 語句之后 在臨時庫里面進行 source mysqlbinlog找回來的sql文件

就將app恢復到被刪除之前的狀態了。 然后將臨時庫的數據導入到現網數據(這個不是這篇文章的重點了)。

 

要是沒有備份,要找回所有app表相關的數據 那可能就非常的麻煩了 尤其是 binlog文件非常多 而且每個都比較的大。

那樣的話也只有從app的建立到現在 用mysqlbinlog來逐個的找回與app表相關dml操作的sql記錄,然后整合恢復數據。

我想這種情況一般比較的少。雖然麻煩,但是也不是不能恢復。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 图木舒克市| 喀什市| 双峰县| 罗平县| 抚州市| 枣庄市| 淮南市| 安阳县| 布尔津县| 眉山市| 阿克苏市| 承德县| 子长县| 宁波市| 晋州市| 左权县| 延寿县| 称多县| 乌审旗| 竹溪县| 都匀市| 沽源县| 乐亭县| 额济纳旗| 故城县| 库尔勒市| 柳州市| 民县| 垣曲县| 元朗区| 巩留县| 英德市| 福建省| 天水市| 岳阳市| 信宜市| 乐平市| 济源市| 墨江| 墨玉县| 赤水市|