binlog2sql是大眾點評開源的一款用於解析binlog的工具,在測試環境試用了下,還不錯。
DBA或開發人員,有時會誤刪或者誤更新數據,如果是線上環境並且影響較大,就需要能快速回滾。傳統恢復方法是利用備份重搭實例,再應用去除錯誤sql后的binlog來恢復數據。此法費時費力,甚至需要停機維護,並不適合快速回滾。也有團隊利用LVM快照來縮短恢復時間,但快照的缺點是會影響mysql的性能。現在有不少好用而且效率又高的開源閃回工具如binlog2sql、mysqlbinlog_flashback,這些工具在工作中給DBA減輕了不少痛苦,以下針對binlog2sql的使用進行實踐演練。
binlog2sql的用途:
- 數據快速回滾(閃回)
- 主從切換后數據不一致的修復
- 從binlog生成標准SQL,帶來的衍生功能
安裝binlog2sql前先安裝git和pip:
yum -y install epel-release
yum -y install git python-pip
安裝binlog2sql:
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt
MySQL的配置要開啟以下選項:
[mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_size = 1G binlog_format = row binlog_row_image = full
要授權一個用戶有以下權限:
SELECT, REPLICATION SLAVE, REPLICATION CLIENT
權限說明:
- select:需要讀取server端information_schema.COLUMNS表,獲取表結構的元信息,拼接成可視化的sql語句
- super/replication client:兩個權限都可以,需要執行'SHOW MASTER STATUS', 獲取server端的binlog列表
- replication slave:通過BINLOG_DUMP協議獲取binlog內容的權限
內網環境如何使用該工具呢?
該工具的使用依賴以下三個包:
PyMySQL==0.7.8 wheel==0.24.0 mysql-replication==0.9
其中,每個包又會依賴其它包,所以安裝這些包是一個比較麻煩的事情。
如果是在外網的環境下,可直接通過pip install安裝,它會自動下載並安裝依賴包的。
在內網環境下,可手動安裝這些包,目前,這些包已下載打包,並上傳到百度雲盤中,大家可自行下載。
http://pan.baidu.com/s/1qYQ2PPy
安裝教程:
# tar xvf binlog2sql.tar.gz
# cd binlog2sql/binlog2sql_dependencies/
# tar xvf setuptools-0.6c11.tar.gz
# cd setuptools-0.6c11
# python setup.py install
# cd ..
# tar xvf pip-9.0.1.tar.gz
# cd pip-9.0.1
# python setup.py install
# cd ..
# pip install *.whl mysql-replication-0.9.tar.gz
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop support for Python 2.6Processing ./mysql-replication-0.9.tar.gz Processing ./argparse-1.4.0-py2.py3-none-any.whl Processing ./linecache2-1.0.0-py2.py3-none-any.whl Requirement already satisfied: PyMySQL==0.7.8 from file:///root/binlog2sql/binlog2sql_dependencies/PyMySQL-0.7.8-py2-none-any.whl in /usr/lib/python2.6/site-packagesProcessing ./six-1.10.0-py2.py3-none-any.whl Processing ./traceback2-1.4.0-py2.py3-none-any.whl Processing ./unittest2-1.1.0-py2.py3-none-any.whl Processing ./wheel-0.24.0-py2.py3-none-any.whl Installing collected packages: argparse, linecache2, six, traceback2, unittest2, wheel, mysql-replication Running setup.py install for mysql-replication ... done Successfully installed argparse-1.4.0 linecache2-1.0.0 mysql-replication-0.9 six-1.10.0 traceback2-1.4.0 unittest2-1.1.0 wheel-0.24.0
至此,所有依賴包安裝完畢。
binlog2sql的使用參數說明:
mysql連接配置
-h host; -P port; -u user; -p password
解析模式
--stop-never 持續同步binlog。可選。不加則同步至執行命令時最新的binlog位置。
-K, --no-primary-key 對INSERT語句去除主鍵。可選。
-B, --flashback 生成回滾語句,可解析大文件,不受內存限制,每打印一千行加一句SLEEP SELECT(1)。可選。與stop-never或no-primary-key不能同時添加。
解析范圍控制
--start-file 起始解析文件。必須。
--start-position/--start-pos start-file的起始解析位置。可選。默認為start-file的起始位置。
--stop-file/--end-file 末尾解析文件。可選。默認為start-file同一個文件。若解析模式為stop-never,此選項失效。
--stop-position/--end-pos stop-file的末尾解析位置。可選。默認為stop-file的最末位置;若解析模式為stop-never,此選項失效。
--start-datetime 從哪個時間點的binlog開始解析,格式必須為datetime,如'2016-11-11 11:11:11'。可選。默認不過濾。
--stop-datetime 到哪個時間點的binlog停止解析,格式必須為datetime,如'2016-11-11 11:11:11'。可選。默認不過濾。
對象過濾
-d, --databases 只輸出目標db的sql。可選。默認為空。
-t, --tables 只輸出目標tables的sql。可選。默認為空。
root@localhost:mysql3306.sock [hch]>select * from hch; +----+-------+ | id | cname | +----+-------+ | 1 | hch | | 2 | tom | | 3 | jerry | +----+-------+ 3 rows in set (0.00 sec)
# 刪除表里的數據 root@localhost:mysql3306.sock [hch]>delete from hch; Query OK, 3 rows affected (0.12 sec) root@localhost:mysql3306.sock [hch]>select * from hch; Empty set (0.00 sec)
# 查看binlog位置
root@localhost:mysql3306.sock [hch]>show master status; +------------------+----------+--------------+------------------+--------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+--------------------------------------------+ | mysql-bin.000010 | 713 | | | 7c91060d-1927-11e8-a036-000c2930f871:1-139 | +------------------+----------+--------------+------------------+--------------------------------------------+ 1 row in set (0.00 sec)
下面我們使用binlog2sql進行格式為ROW的binlog生成hch庫hch表的標准SQL
[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin.000009 > 1.sql
[root@hch binlog2sql]# cat 1.sql
USE hch;
create table hch(id int not null auto_increment, cname varchar(32), primary key(id));
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', 1); #start 480 end 643 time 2018-03-04 17:59:25
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', 2); #start 739 end 902 time 2018-03-04 17:59:29
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', 3); #start 998 end 1163 time 2018-03-04 17:59:34
DELETE FROM `hch`.`hch` WHERE `cname`='hch' AND `id`=1 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57
DELETE FROM `hch`.`hch` WHERE `cname`='tom' AND `id`=2 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57
DELETE FROM `hch`.`hch` WHERE `cname`='jerry' AND `id`=3 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57
我們可以看到,剛剛執行過的sql都生成出來了。
我們現在對hch這個庫的所有操作生成反向SQL,這個時候需要在上面語句的基礎上帶一個-B參數,就是flashback閃回的意思:
[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin.000009 -B INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', 3); #start 1259 end 1442 time 2018-03-04 18:02:57 INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', 2); #start 1259 end 1442 time 2018-03-04 18:02:57 INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', 1); #start 1259 end 1442 time 2018-03-04 18:02:57 DELETE FROM `hch`.`hch` WHERE `cname`='jerry' AND `id`=3 LIMIT 1; #start 998 end 1163 time 2018-03-04 17:59:34 DELETE FROM `hch`.`hch` WHERE `cname`='tom' AND `id`=2 LIMIT 1; #start 739 end 902 time 2018-03-04 17:59:29 DELETE FROM `hch`.`hch` WHERE `cname`='hch' AND `id`=1 LIMIT 1; #start 480 end 643 time 2018-03-04 17:59:25
可以看到生成了跟上面標准SQL相反的SQL了,通過這些反向SQL可以進行誤操的數據恢復。
比如我們想恢復delete命令之前的數據。
[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin.000009 --start-pos=1259 --stop-pos=1442 -B > roll_1.sql [root@hch binlog2sql]# cat roll_1.sql INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', 3); #start 1259 end 1442 time 2018-03-04 18:02:57 INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', 2); #start 1259 end 1442 time 2018-03-04 18:02:57 INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', 1); #start 1259 end 1442 time 2018-03-04 18:02:57
[root@hch binlog2sql]# mysql -uroot -pmysql123 <roll_1.sql
查看數據已經恢復
root@localhost:mysql3306.sock [hch]>select * from hch; +----+-------+ | id | cname | +----+-------+ | 1 | hch | | 2 | tom | | 3 | jerry | +----+-------+ 3 rows in set (0.00 sec)
參考
binlog2sql之MySQL數據閃回實踐 - GoogSQL - 博客園
https://www.cnblogs.com/xuanzhi201111/p/6602489.html
binlog2sql使用總結 - iVictor - 博客園
http://www.cnblogs.com/ivictor/p/6418409.html
送給mysql dba們一顆速效救心丸,閃回之binlog2sql - CSDN博客
http://blog.csdn.net/shudaqi2010/article/details/54412654
原創工具binlog2sql:從MySQL binlog得到你要的SQL - CSDN博客
http://blog.csdn.net/shudaqi2010/article/details/54412895
MySQL誤操作后如何快速恢復數據 - arun_yh - 博客園
http://www.cnblogs.com/itcomputer/articles/6184454.html
