針對MYSQL delete、update、insert語句誤操作時的恢復辦法
mysql 針對MYSQL delete、update、insert語句誤操作(如update忘記加where條件)
目前還沒有特別好的辦法進行恢復,主要是根據binlog日誌檔案進行恢復,網上也有
很多的部落格說明這些操作步驟,目前總結起來快速方便的辦法是:
利用淘寶的彭立勳開發出的一個flashback外掛進行恢復,之前的外掛版本只針對MySQL-5.5.18,
無法用於目前主流的5.6版本的。後來平民軟體將該功能移植到5.6版本上,
讓相關人員對資料庫有更強的掌控能力。
相關的部落格:http://www.cnblogs.com/youge-OneSQL/p/5249736.html
相關的部落格:
0. MYSQL可恢復的前提
(1)開啟binlog
(2)binlog_format的格式採用 ROW 格式,
ROW 方式會產生大量的binlog資訊,引數binlog_row_image = MINIMAL 時可適當優化。
1. 下載 mysql5.6 flashback外掛(二進位制版本,無需安裝)
下載地址:http://pan.baidu.com/s/1nvGOOIl
最新更新的日期: 2016/4/8
2. 將二進位制外掛檔案拷貝到 原mysqlbinlog程式的目錄中
下載的外掛程式檔案重新命名 mysqlbinlogFB
下載下來的外掛程式檔案和之前的mysqlbinlog 工具一樣使用,只是引數多了一個 -B引數
3. 模擬一下 delete 沒有加 where條件的情況
4. 找到剛才delete 操作在binlog日誌檔案中的開始和結束位置點
這裡主要看如何使用mysqlbinlog工具了,例如:產生delete誤操作的時間點大概是在“2016-07-06 21:41:00”左右,我們檢視binlog日誌檔案時指定開始時間點為“2016-07-06 21:40:00”並且匹配表名稱“t_name”,如果打印出的binlog日誌比較多時,可只看前20行和後20行即可。
前20
[[email protected] data]# mysqlbinlogFB -v --base64-output=decode-rows --start-datetime='2016-07-06 21:40:00' mysql-bin.000021 |grep -i 't_name' -C20 | head -n 20
後20行:
[[email protected] data]# mysqlbinlogFB -v --base64-output=decode-rows --start-datetime='2016-07-06 21:40:00' mysql-bin.000021 |grep -i 't_name' -C20 | tail-n 20
由於是測試的表資料,binlog資訊量比較少,所以直接列印2016-07-06 21:40:00時間點之後的全部binglog資訊,最後找出的位置起始結束點資訊如下:
[[email protected] data]# mysqlbinlogFB -v --base64-output=decode-rows --start-datetime='2016-07-06 21:40:00' mysql-bin.000021
注意到兩個 位置點 1377 和 1567,檢視binlog中的日誌資訊確實是剛才誤操作的delete 語句。
在指定--start-position時,需要注意包含table_map_event的位置,否則工具無法找到相關表的元資料資訊。
5. 採用myslqbinlogFB 工具進行恢復
[[email protected] data]# mysqlbinlogFB-B-v
--start-position=1377 --stop-position=1567 mysql-bin.000021| mysql -uroot -proot123 mytest
採用上面的命令即可 將剛才的delete的 binlog資訊反轉成insert語句插入到 mytest資料庫中的t_name表中。
最後檢視 t_name表:
同理,對於update,insert 語句恢復,一樣的步驟操作。