記一次MySQL資料誤刪-恢復體驗
資料誤刪了怎麼辦?本文也許能給您一定的提示。
一、檢視日誌
資料無意中發現不見了,怎麼辦?
也許首先想到的是去查日誌,找到問題原因,但是這個時間有可能會比較長,並且線上的業務在這段時間會收到影響。
因此,先不要去管什麼原因,首先應該做的第一件事情應當是資料恢復,保證正常的業務不受影響,而後再回過來查詢原因即可。
那麼,想要恢復資料,首先想到的也是日誌:有無所有SQL操作的記錄日誌,有無開啟binlog同步日誌。這樣才能根據SQL記錄重新恢復資料,否則,資料將無法找回。
其次,我們需要查以下MySQL伺服器開啟了哪些日誌,於是首先檢視MySQL的配置檔案 /etc/my.cnf ,發現開啟了errorlog、slowlog和binlog,這時就可以鬆一口氣了,因為只要有binlog,所有資料都將找得回來,slowlog對我們當前的問題來說並沒有什麼用,errorlog後面我們拿來查詢問題原因也許會有用。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | [client]port=3306socket=/tmp/mysql.sockdefault-character-set=utf8mb4[mysql]prompt |
此外,我們通過 show variables 命令檢視當前MySQL變數發現,其實MySQL還有另外一類日誌,叫做generallog
12 | |general_log|OFF||general_log_file|/data/mysql/localhost.log| |
當前伺服器沒有開啟該日誌,該日誌用以記錄所有執行的SQL語句,它和binlog的區別在於:
1、generallog僅僅是記錄的日誌文字檔案,而binlog原本是拿來進行伺服器之間的資料同步用的,是一個二進位制檔案;
2、binlog記錄了比generallog更全面的SQL執行記錄,而generallog提供的文字日誌可讀性更強;
二、恢復資料
找到了binlog,那麼我們需要從binlog中恢復資料。
1、檢視當前有哪些binlog檔案
123456789 | MySQL[hhzl_gdg]>show binary logs;+------------------+-----------+|Log_name|File_size|+------------------+-----------+|mysql-bin.000005|17160082||mysql-bin.000006|890082||mysql-bin.000007|27160082|+------------------+-----------+3rows inset(0.00sec) |
發現有3個binlog檔案,我們再來檢視當前正在使用的binlog檔案是哪個:
1234567 | MySQL[hhzl_gdg]>show master status;+------------------+----------+--------------+------------------+-------------------+|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|+------------------+----------+--------------+------------------+-------------------+|mysql-bin.000007|27160082||||+------------------+----------+--------------+------------------+-------------------+1row inset(0.00sec) |
發現是 mysql-bin.000007檔案。瞭解的資訊差不多了,我們進入到MySQL的資料存放目錄 /data/mysql/,先將這幾個binlog檔案備份起來,以便防止資料丟失,並且後面也許還需要再從這幾個檔案查詢資料丟失原因。
123 | cd/data/mysql/mkdir-p~/mysql-bin-backupcpmysql-bin.*~/mysql-bin-backup/-r |
由於對於我們當前的業務來說,被刪除的資料僅僅是2017-08-01到2017-08-25之間的重要資料,因此,我們僅需要恢復這段時間的資料即可,從mysql-bin.000007這個檔案匯出這個時間段的sql:
1 | mysqlbinlog--no-defaults--start-datetime='2017-08-01 00:00:00'--stop-datetime='2017-08-25 00:00:00'-dhhzl_gdg/root/mysql-bin-backup/mysql-bin.000007>~/2017-08-01_2047-08-25.sql |
執行完成之後使用mysql命令進入mysql控制檯,use 需要恢復資料的資料庫,執行source命令即可:
12 | usehhzl_gdg;source/root/2017-08-01_2047-08-25.sql |
參考連結: