先說原理
基於全量備份,加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語句'
恢復數據時
恢復數據準備前確認已經存在如下文件:
- 誤操作前的完整備份
- 全量備份到誤操作前的執行sql
- 誤操作後的執行sql
進行數據恢復時開啓讀鎖
> flush tables with read lock;
然後依次還原1,2,3;最後把數據庫鎖解開
> unlock tables;