binlog2sql
看到使用binlog2sql恢复数据,测试玩玩~
环境:CentOS6.5源码安装多个MySQL实例及复制搭建
由于原先的复制采用binlog-format=mixed,先将其修改为binlog-format=row
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/******** 测试环境,步骤简化 ********/ #Master上操作 [root@VMUest ~]# mysqldump -uroot -p -P3306 --databases db_swzf jbts --master-data=2 --lock-all-tables > /myshare/user_db.sql [root@VMUest ~]# cat /myshare/user_db.sql |grep -i 'change' -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000048', MASTER_LOG_POS=120; #Slave上操作 mysql> change master to master_host='192.168.85.129', master_port=3306, master_user='repl', master_password='repl', master_log_file='mysql-bin.000048', master_log_pos=120;
binlog2sql安装
#检测是否安装git、pip [root@VMUest ~]# git --help [root@VMUest ~]# pip --help #安装git、pip [root@VMUest ~]# yum -y install git [root@VMUest ~]# yum -y install epel-release [root@VMUest ~]# yum -y install python-pip #安装 [root@VMUest ~]# cd /tools/ [root@VMUest tools]# git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql [root@VMUest binlog2sql]# pip install -r requirements.txt
binlog2sql使用
[root@VMUest binlog2sql]# python binlog2sql.py -h192.168.85.129 -P3306 -umydba -p'mysql5635' -ddb_swzf -tarea_info --start-file='mysql-bin.000047' python: can not open file 'binlog2sql.py': [Errno 2] No such file or directory #查找文件位置 [root@VMUest binlog2sql]# find / -type f -name "binlog2sql.py" /tools/binlog2sql/binlog2sql/binlog2sql.py [root@VMUest binlog2sql]# pwd /tools/binlog2sql [root@VMUest binlog2sql]# cd /tools/binlog2sql/binlog2sql/ [root@VMUest binlog2sql]# python binlog2sql.py -h192.168.85.129 -P3306 -umydba -p'mysql5635' -ddb_swzf -tarea_info --start-file='mysql-bin.000047'
测试样例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#准备测试数据 mysql> CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> insert into test (name,create_time) values ('Glon Ho','2012-10-1'),('Eason Chan', '2016-05-02'),('Jacky Cheung', '2015-05-02'); mysql> update test set create_time = '2017-05-12' where name = 'Glon Ho'; mysql> delete from test where name = 'Jacky Cheung'; mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000048 | 1068 | | | | +------------------+----------+--------------+------------------+-------------------+
样例解析
#直接整个解析 mysql-bin.000048 日志 [root@VMUest binlog2sql]# python binlog2sql.py -h192.168.85.129 -P3306 -umydba -p'mysql5635' -dtest -ttest --start-file='mysql-bin.000048' USE test; CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test`.`test`(`create_time`, `id`, `name`) VALUES ('2012-10-01 00:00:00', 1, 'Glon Ho'); #start 376 end 597 time 2017-05-23 17:08:57 INSERT INTO `test`.`test`(`create_time`, `id`, `name`) VALUES ('2016-05-02 00:00:00', 2, 'Eason Chan'); #start 376 end 597 time 2017-05-23 17:08:57 INSERT INTO `test`.`test`(`create_time`, `id`, `name`) VALUES ('2015-05-02 00:00:00', 3, 'Jacky Cheung'); #start 376 end 597 time 2017-05-23 17:08:57 UPDATE `test`.`test` SET `create_time`='2017-05-12 00:00:00', `id`=1, `name`='Glon Ho' WHERE `create_time`='2012-10-01 00:00:00' AND `id`=1 AND `name`='Glon Ho' LIMIT 1; #start 628 end 824 time 2017-05-23 17:26:57 DELETE FROM `test`.`test` WHERE `create_time`='2015-05-02 00:00:00' AND `id`=3 AND `name`='Jacky Cheung' LIMIT 1; #start 855 end 1037 time 2017-05-23 17:27:20 [root@VMUest binlog2sql]# #按位置解析出回滚SQL [root@VMUest binlog2sql]# python binlog2sql.py --flashback -h192.168.85.129 -P3306 -umydba -p'mysql5635' -dtest -ttest --start-file='mysql-bin.000048' --start-position=376 --stop-position=597 DELETE FROM `test`.`test` WHERE `create_time`='2015-05-02 00:00:00' AND `id`=3 AND `name`='Jacky Cheung' LIMIT 1; #start 376 end 597 time 2017-05-23 17:08:57 DELETE FROM `test`.`test` WHERE `create_time`='2016-05-02 00:00:00' AND `id`=2 AND `name`='Eason Chan' LIMIT 1; #start 376 end 597 time 2017-05-23 17:08:57 DELETE FROM `test`.`test` WHERE `create_time`='2012-10-01 00:00:00' AND `id`=1 AND `name`='Glon Ho' LIMIT 1; #start 376 end 597 time 2017-05-23 17:08:57 #按时间解析出回滚SQL [root@VMUest binlog2sql]# python binlog2sql.py --flashback -h192.168.85.129 -P3306 -umydba -p'mysql5635' -dtest -ttest --start-file='mysql-bin.000048' --start-datetime="2017-05-23 17:26:57" --stop-datetime="2017-05-23 17:27:21" INSERT INTO `test`.`test`(`create_time`, `id`, `name`) VALUES ('2015-05-02 00:00:00', 3, 'Jacky Cheung'); #start 855 end 1037 time 2017-05-23 17:27:20 UPDATE `test`.`test` SET `create_time`='2012-10-01 00:00:00', `id`=1, `name`='Glon Ho' WHERE `create_time`='2017-05-12 00:00:00' AND `id`=1 AND `name`='Glon Ho' LIMIT 1; #start 628 end 824 time 2017-05-23 17:26:57
注意flashback只会解析DML,对于DDL 不会输出。可使用mysqlbinlog/show binlog events或者Percona Toolkit查看二进制日志。
因为不懂,所以加倍努力!