mysql binlog2sql_MySQL数据闪回 binlog2sql
相比于全備+binlog恢復,flashback 是動作更小的恢復方式。簡單來說就是通過工具解析 binlog 生成與誤操作相反的SQL,比如 delete 則反向生成 insert,再執行一遍即可恢復數據。第一個實現該功能的是彭立勛,他在 MySQL 5.5 版本上實現,并將其提交給 MariaDB,Oracle MySQL 并沒有推出這個功能,由于跟版本綁定比較深,使用上不是很廣泛。美團點評陸續也開發了兩款開源工具:binlog2mysql和MyFlash,比較受歡迎。
閃回的要求與限制:
要求binlog_format = row格式,且binlog_row_image = full;
只支持DML的閃回,不支持DDL。
目前支持版本
MySQL 5.6, 5.7
一、安裝工具
binlog2sql 基于python,支持2.7、3.4+版本,因此需要執行該工具的環境已安裝 python 環境,然后再進行軟件的安裝。
[root@centos ~]# yum -y install git python-pip
[root@centos ~]# git clone https://github.com/danfengcao/binlog2sql.git
[root@centos ~]# cd binlog2sql/
[root@centos binlog2sql]# pip install -r requirements.txt
二、模擬數據誤刪除
模擬 id 為 2、3 的兩行數據被誤刪除
執行 flush logs; 是為了更加直觀的寫文檔,這一步可以忽略。
mysql> flush logs;
Query OK, 0 rows affected (0.04 sec)
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | aa |
| 2 | bb |
| 3 | cc |
+------+------+
3 rows in set (0.00 sec)
mysql> delete from t1 where id in (1,2);
Query OK, 2 rows affected (0.00 sec)
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 3 | cc |
+------+------+
1 row in set (0.00 sec)
查看當前誤刪除時 binlog 文件名( 一般不需要大概位置的 position 位點或 GTID 事務號,因為可以使用時間來選中日志范圍 )
mysql> show master status;
+------------------+----------+--------------+------------------+-----------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-----------------------------------------------+
| mysql-bin.000006 | 521 | | | 049f1f26-dd03-11ea-bc16-02000aba3c36:1-106260 |
+------------------+----------+--------------+------------------+-----------------------------------------------+
1 row in set (0.00 sec)
三、查看誤刪除時間執行的DML語句
查看誤操作時間段內執行的DML語句( 假設誤操作在 14:00-14:20 )
每一個 SQL 后都有 position 位點信息( start 259 end 490 )
[root@centos binlog2sql]# python ./binlog2sql/binlog2sql.py -h 10.186.60.54 -P 3306 -u root -p 123456 -d testdb -t t1 --start-file='mysql-bin.000006' --start-datetime='2020-08-13 14:00:00' --stop-datetime='2020-08-13 14:20:00'
DELETE FROM `testdb`.`t1` WHERE `id`=1 AND `name`='aa' LIMIT 1; #start 259 end 490 time 2020-08-13 14:17:39
DELETE FROM `testdb`.`t1` WHERE `id`=2 AND `name`='bb' LIMIT 1; #start 259 end 490 time 2020-08-13 14:17:39
四、生成回滾SQL語句
根據上一步獲取到的準確 postion 位點信息,生成回滾語句。
[root@centos binlog2sql]# python ./binlog2sql/binlog2sql.py -h 10.186.60.54 -P 3306 -u root -p 123456 -d testdb -t t1 --flashback --start-file='mysql-bin.000006' --start-position='259' --stop-position='490' > /tmp/mysql_flashback_testdb_t1.sql
[root@centos binlog2sql]# cat /tmp/mysql_flashback_testdb_t1.sql
INSERT INTO `testdb`.`t1`(`id`, `name`) VALUES (2, 'bb'); #start 259 end 490 time 2020-08-13 14:17:39
INSERT INTO `testdb`.`t1`(`id`, `name`) VALUES (1, 'aa'); #start 259 end 490 time 2020-08-13 14:17:39
五、數據恢復
由業務方確認待回滾的 SQL 語句內容完全正確后,登錄MySQL客戶端執行導入。
在數據恢復時,要記得關閉 binlog 日志記錄,防止 binlog 日志被污染。
當前測試 id 字段不是自增主鍵,所以閃回數據后 id 字段數字為倒序的( 如果 id 字段是自增主鍵,那么會數據閃回后順序是遞增的,不會紊亂的。 )
mysql> use testdb;
Database changed
mysql> set sql_log_bin = off;
Query OK, 0 rows affected (0.00 sec)
mysql> source /tmp/mysql_flashback_testdb_t1.sql;
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
# 數據驗證
mysql> select * from testdb.t1;
+------+------+
| id | name |
+------+------+
| 3 | cc |
| 2 | bb |
| 1 | aa |
+------+------+
3 rows in set (0.00 sec)
六、參數解釋
# python binlog2sql/binlog2sql.py --help
MySQL連接配置
-h host; -P port; -u user; -p password
解析模式
--stop-never 持續解析binlog。可選。,默認False,同步至執行命令時最新的binlog位置。
-K, --no-primary-key 對INSERT語句去除主鍵。可選。默認False
-B, --flashback 成回滾SQL,可解析大文件,不受內存限制。可選。默認False。與stop-never或no-primary-key不能同時添加。
--back-interval B模式下,每打印一千行回滾SQL,加一句SLEEP多少秒,如不想加SLEEP,請設為0。可選。默認1.0。
解析范圍控制
--start-file 起始解析文件,只需文件名,無需全路徑 。必須。
--start-position /--start-pos 起始解析位置。可選。默認為start-file的起始位置。
--stop-file /--end-file 終止解析文件。可選。默認為start-file同一個文件。若解析模式為stop-never,此選項失效。
--stop-position /--end-pos 終止解析位置。可選。默認為stop-file的最末位置;若解析模式為stop-never,此選項失效。
--start-datetime 起始解析時間,格式'%Y-%m-%d %H:%M:%S'。可選。默認不過濾。
--stop-datetime 終止解析時間,格式'%Y-%m-%d %H:%M:%S'。可選。默認不過濾。
對象過濾
-d, --databases 只解析目標db的sql,多個庫用空格隔開,如-d db1 db2。可選。默認為空。
-t, --tables 只解析目標table的sql,多張表用空格隔開,如-t tbl1 tbl2。可選。默認為空。
--only-dml 只解析dml,忽略ddl。可選。默認TRUE。
--sql-type 只解析指定類型,支持INSERT, UPDATE, DELETE。多個類型用空格隔開,如--sql-type INSERT DELETE。可選。默認為增刪改都解析。用了此參數但沒填任何類型,則三者都不解析。
建議 MySQL 二進制日志參數
# 在配置文件my.cnf的mysqld這個區下設置
[mysqld]
server_id = 1
log_bin = /data/mysql/log/binlog/3306/mysql-bin
max_binlog_size = 256M
binlog_format = row
binlog_row_image = full
# 在運行中的mysql中查看
show variables like 'server_id';
show variables like 'log_bin%';
show variables like 'max_binlog_size';
show variables like 'binlog_format';
show variables like 'binlog_row_image';
用來閃回數據的用戶需要的最小權限集合
# 建議授權
# select, super/replication client, replication slave
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'localhost' identified by '123456';
# select:需要讀取server端information_schema.COLUMNS表,獲取表結構的元信息,拼接成可視化的sql語句
# super/replication client:兩個權限都可以,需要執行'SHOW MASTER STATUS', 獲取server端的binlog列表
# replication slave:通過BINLOG_DUMP協議獲取binlog內容的權限
總結
以上是生活随笔為你收集整理的mysql binlog2sql_MySQL数据闪回 binlog2sql的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 住房公积金贷款条件 具有合法有效的身份证
- 下一篇: 什么是江恩理论 以研究测市为主