mysql bin-log 誤操作數據修復

先說原理

基於全量備份,加bin-log,將數據恢復到誤操作之前節點數據,然後跳過誤操作,執行後面操作。使用binlog文件轉成sql執行,導入到數據庫。

查看binlog文件

如果有多個binlog日誌也可以在Mysql命令行下查看當前binlog、切割binlog日誌。切割完成binlog再次查看就會看到新的日誌寫入到新的binlog文件中。

mysql> show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 343629748 |              |                  |                   |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

找到binlog中錯誤的語句

使用mysqlbinlog命令加參數,可以指定時間段,和pos節點:

--start-position    起始點
--stop-position     結束點(不包含)
--start-datetime=“2017--11-01 00:00:00”     起始時間
--stop-datetime="2017-11-11 00:00:00"       終止時間
-d db_name          指定數據庫
-v                  是顯示出一些sql的信息 
-vv                 則是多一些註釋性的東西
--base64-output=DECODE-ROWS 這個是把sql解碼出來

可以binlog日誌中找到錯誤語句執行的時間點,分別恢復錯誤語句前後的binlog日誌爲sql。也可以跳過此步,直接恢復整個binlog日誌爲sql,然後打開sql文件,刪除錯誤語句。

  • 可以根據時間點來確定誤操作的確切時間
mysqlbinlog  --no-defaults --database=order  --start-datetime='2019-11-02 3:08' --stop-datetime='2019-11-02 23:08' --base64-output=DECODE-ROWS mysql-bin.000004 > neworder.sql
  • 根據position確定誤操作之前的節點
mysqlbinlog  --no-defaults --database=order --start-position=756577992  --stop-position=775926228 --base64-output=DECODE-ROWS mysql-bin.000004 > neworder.sql
  • 過濾誤刪除的sql
# sudo mysqlbinlog --base64-output=DECODE-ROWS -v -d ids mysql-bin.000001 | grep --ignore-case -A3 -B4 '錯誤的sql語句'

恢復數據時

恢復數據準備前確認已經存在如下文件:

  1. 誤操作前的完整備份
  2. 全量備份到誤操作前的執行sql
  3. 誤操作後的執行sql

進行數據恢復時開啓讀鎖

> flush tables with read lock;

然後依次還原1,2,3;最後把數據庫鎖解開

> unlock tables;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章