各位兄弟们,很久不见了!最近一直忙于新书的创做,因此一直没有时间更新博客。不知道这段时间你们学习得怎么样,但愿你们经过看个人文章给你们带来帮助。
老张我也花费了大量时间录制一些数据库的视频课程,你们要是感兴趣,也能够去学习,不要错过啊!node
今儿抽出时间,给你们分享一篇利用binlog2sql闪回工具,来恢复误删除的数据。咱们都知道binlog的做用是备份恢复和完成MySQL的主从复制功能。利用mysqlbinlog工具能够进行基于时间点或者位置偏移量的数据恢复工做,在生产环境中遇到误删除,改错数据的状况,那是常有的事儿。咱们都知道Oracle数据库有闪回功能,而MySQL自己没有自带闪回,但咱们可使用binlog2sql来完成这项工做。python
咱们都知道binlog是以event做为单位,来记录数据库变动的数据信息,闪回就是能够帮助咱们重现这些变化数据信息以前的操做。也就是说对于insert操做,会生成delete语句,反之delete操做,会生成insert语句。对于update操做,也会生成相反的update语句。这款工具只能使用在binlog格式为row模式下。mysql
下面进行实战演练:
binlog2sql工具的下载地址: https://github.com/danfengcao/binlog2sql
第一步:环境准备安装各类依赖的工具包列表git
python-pip , PyMySQL , python-mysql-replication, wheel argparse
第二步:解压binlog2sql软件,命令以下github
unzip binlog2sql-master.zip cd binlog2sql-master pip install –r requirements.txt
第三步:经过python binlog2sql.py --help命令,来查看重要参数的使用;sql
-B, --flashback 生成回滚语句 --start-file 须要解析的binlog文件 --start-position 解析binlog的起始位置 --stop-position解析binlog的结束位置 --start-datetime 从哪一个时间点的binlog开始解析,格式必须为datetime --stop-datetime 到哪一个时间点的binlog中止解析,格式必须为datetime -d, --databases 只输出目标db的sql -t, --tables 只输出目标tables的sql
第四步:开始模拟数据删除
首先删除掉zs库下,t表中的数据数据库
root@db 14:26: [zs]> select * from t; +----+------+---------+ | id | name | address | +----+------+---------+ | 1 | aaa | bj | | 2 | bbb | sh | | 3 | ccc | gz | | 4 | ddd | sy | | 5 | eee | fj | +----+------+---------+ 5 rows in set (0.00 sec) root@db 14:26: [zs]> delete from t; Query OK, 5 rows affected (0.04 sec) root@db 14:27: [zs]> select * from t; Empty set (0.00 sec)
第五步:须要建立一个闪回用户ide
create user 'zs_test'@'%' identified by '123456'; grant select,replication slave,replication client on *.* to 'zs_test'@'%' ; flush privileges;
第六步:肯定当前binlog文件和position位置工具
root@db 14:41: [zs]> show master status; +---------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------------+----------+--------------+------------------+------------------------------------------+ | mysql-binlog.000002 | 2091 | | | e10f0ead-d595-11e7-82cb-080027cd683a:1-8 | +---------------------+----------+--------------+------------------+------------------------------------------+
能够看到当前binlog是:mysql-binlog.000002
位置偏移量:2091学习
第七步:须要预估下时间,误操做的时间范围应该在下午2点20分到2点30分之间。命令以下:python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file='mysql-binlog.000002' --start-datetime='2017-11-30 14:20:00' --stop-datetime='2017-11-30 14:30:00'
输出结果:
DELETE FROM zs
.t
WHERE address
='bj' AND id
=1 AND name
='aaa' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs
.t
WHERE address
='sh' AND id
=2 AND name
='bbb' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs
.t
WHERE address
='gz' AND id
=3 AND name
='ccc' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs
.t
WHERE address
='sy' AND id
=4 AND name
='ddd' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
DELETE FROM zs
.t
WHERE address
='fj' AND id
=5 AND name
='eee' LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46
从解析结果中咱们了解到,误操做sql的位置是在1214~1427之间;这样就能够进一步过滤,使用flashback模式生成回滚sql;
命令以下:python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file='mysql-binlog.000002' --start-position=1214 --stop-position=1427 -B >t_rollback.sql
查看闪回导出文件:
[root@node3 binlog2sql]# cat t_rollback.sql INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('fj', 5, 'eee'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('sy', 4, 'ddd'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('gz', 3, 'ccc'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('sh', 2, 'bbb'); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES ('bj', 1, 'aaa'); #start 1214 end 1427 time 2017-11-30 14:27:46
第八步:应用回滚文件,恢复数据。命令以下:/usr/local/mysql/bin/mysql -uroot -proot123 zs < t_rollback.sql
第九步:检验恢复数据是否成功
root@db 15:09: [zs]> select * from t; +----+------+---------+ | id | name | address | +----+------+---------+ | 1 | aaa | bj | | 2 | bbb | sh | | 3 | ccc | gz | | 4 | ddd | sy | | 5 | eee | fj | +----+------+---------+ 5 rows in set (0.00 sec)
验证恢复数据成功!
工具虽小,但功能很强大,咱们要善于发现周围的资源,利用这些武器,来帮助咱们学习MySQL数据库!从此老张会继续分享新的干货,供你们学习参考!