binlog2sql闪回工具的使用

一、下载安装依赖的python

yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
yum install python34 -y
python3 --version
wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
pip3 -V

切换升级本地python版本

python -V; python2. -V
# 查看当前python版本 这两个应该都是原始的2..x
ls -hli /usr/bin/python*
cp -f /usr/bin/python2. /usr/bin/python2..bak
rm -f /usr/bin/python /usr/bin/python
cp /usr/bin/python3. /usr/bin/python
ls -hli /usr/bin/python*
python -V; python2. -V
# 验证python版本是否OK(python->2.7, python2.->python2..x) yum -h # 验证yum已经不可用,命令会出错退出
head -n /usr/bin/yum
sed -i 's/python$/&2\.6/' /usr/bin/yum
head -n /usr/bin/yum
# 将/usr/bin/yum 中的python 替换为python2.
yum -h # 验证yum可用,此时不会再出错退出

二、安装binlog2sql

# 参考资料:https://www.runoob.com/w3cnote/python-pip-install-usage.html
cd /opt/
yum -y install python-pip
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

查看帮助

[root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py --help
usage: binlog2sql.py [-h HOST] [-u USER] [-p [PASSWORD [PASSWORD ...]]]
[-P PORT] [--start-file START_FILE]
[--start-position START_POS] [--stop-file END_FILE]
[--stop-position END_POS] [--start-datetime START_TIME]
[--stop-datetime STOP_TIME] [--stop-never] [--help]
[-d [DATABASES [DATABASES ...]]]
[-t [TABLES [TABLES ...]]] [--only-dml]
[--sql-type [SQL_TYPE [SQL_TYPE ...]]] [-K] [-B]
[--back-interval BACK_INTERVAL] Parse MySQL binlog to SQL you want optional arguments:
--stop-never Continuously parse binlog. default: stop at the latest
event when you start.
--help help information
-K, --no-primary-key Generate insert sql without primary key if exists
-B, --flashback Flashback data to start_position of start_file
--back-interval BACK_INTERVAL
Sleep time between chunks of rollback sql. set it
to if do not need sleep connect setting:
-h HOST, --host HOST Host the MySQL database server located
-u USER, --user USER MySQL Username to log in as
-p [PASSWORD [PASSWORD ...]], --password [PASSWORD [PASSWORD ...]]
MySQL Password to use
-P PORT, --port PORT MySQL port to use interval filter:
--start-file START_FILE
Start binlog file to be parsed
--start-position START_POS, --start-pos START_POS
Start position of the --start-file
--stop-file END_FILE, --end-file END_FILE
Stop binlog file to be parsed. default: '--start-file'
--stop-position END_POS, --end-pos END_POS
Stop position. default: latest position of '--stop-
file'
--start-datetime START_TIME
Start time. format %Y-%m-%d %H:%M:%S
--stop-datetime STOP_TIME
Stop Time. format %Y-%m-%d %H:%M:%S; schema filter:
-d [DATABASES [DATABASES ...]], --databases [DATABASES [DATABASES ...]]
dbs you want to process
-t [TABLES [TABLES ...]], --tables [TABLES [TABLES ...]]
tables you want to process type filter:
--only-dml only print dml, ignore ddl
--sql-type [SQL_TYPE [SQL_TYPE ...]]
Sql type you want to process, support INSERT, UPDATE,
DELETE.
[root@dba_test_002 binlog2sql]#

三、使用该工具的前提

1. binlog_format为ROW,且binlog_row_image为full或noblog,默认为full。

2. 必须开启MySQL Server,理由有如下两点:

1> 它是基于BINLOG_DUMP协议来获取binlog内容

2> 需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句

该工具所需权限如下:

mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flashbak_user'@'%' identified by 'flashbak_user_pwd';
**权限说明**
* select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
* super/replication client:两个权限都可以,需要执行'SHOW MASTER STATUS', 获取server端的binlog列表
* replication slave:通过BINLOG_DUMP协议获取binlog内容的权限

因为是伪装成slave来获取主的二进制事件,故无需对binlog有可读权限。

四、测试验证

4-1、创建测试表

# 创建测试表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; insert into user(name) values('小赵');
insert into user(name) values('小王');
insert into user(name) values('小李');
insert into user(name) values('小钱');
insert into user(name) values('小孙'); mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 6 | 小赵 |
| 7 | 小王 |
| 8 | 小李 |
| 9 | 小钱 |
| 10 | 小孙 |
+----+--------+
5 rows in set (0.00 sec)

4-2、update回滚实践

# update误操作闪回
mysql> update user set name='王源' where id=8;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0 #发现修改错了。
[mysql@dba_test_001 binlogdir]$ /data/mysql/percona_server/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -vvv mysql-bin.000024 >./24.binlog
# 搜索到王源,找到position点:--startposition=2082 --stop-position=2268 # 先解析出原始语句,以便确认
# 主库IP: 10.10.50.60 用户名:flashbak_user 密码:flashbak_user_pwd
/usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' [root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024'
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flashbak_user'@'%' IDENTIFIED BY PASSWORD '*0589CD47DC016BC67FC7720BADEC3C1368C15F60';
USE b'sbtest';
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (6, '小赵'); #start 822 end 995 time 2019-12-23 10:38:40
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (7, '小王'); #start 1074 end 1247 time 2019-12-23 10:38:40
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (8, '小李'); #start 1326 end 1499 time 2019-12-23 10:38:40
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (9, '小钱'); #start 1578 end 1751 time 2019-12-23 10:38:40
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (10, '小孙'); #start 1830 end 2003 time 2019-12-23 10:38:41
UPDATE `sbtest`.`user` SET `id`=8, `name`='王源' WHERE `id`=8 AND `name`='小李' LIMIT 1; #start 2082 end 2268 time 2019-12-23 10:41:20
[root@dba_test_002 binlog2sql]# # 进一步筛选
/usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' --sql-type=UPDATE --start-position=2082 --stop-position=2268
[root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' --sql-type=UPDATE --start-position=2082 --stop-position=2268
UPDATE `sbtest`.`user` SET `id`=8, `name`='王源' WHERE `id`=8 AND `name`='小李' LIMIT 1; #start 2082 end 2268 time 2019-12-23 10:41:20
[root@dba_test_002 binlog2sql]# # 生成回滚语句
[root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -B -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' --sql-type=UPDATE --start-position=2082 --stop-position=2268
UPDATE `sbtest`.`user` SET `id`=8, `name`='小李' WHERE `id`=8 AND `name`='王源' LIMIT 1; #start 2082 end 2268 time 2019-12-23 10:41:20
[root@dba_test_002 binlog2sql]# mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 6 | 小赵 |
| 7 | 小王 |
| 8 | 王源 |
| 9 | 小钱 |
| 10 | 小孙 |
+----+--------+
5 rows in set (0.00 sec) mysql> UPDATE `sbtest`.`user` SET `id`=8, `name`='小李' WHERE `id`=8 AND `name`='王源' LIMIT 1; #start 2082 end 2268 time 2019-12-23 10:41:20
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 6 | 小赵 |
| 7 | 小王 |
| 8 | 小李 |
| 9 | 小钱 |
| 10 | 小孙 |
+----+--------+
5 rows in set (0.00 sec) mysql>

4-3、delete操作回滚实践

# delete语句回滚
mysql> delete from user where id in (6,8,9,10);
Query OK, 4 rows affected (0.01 sec) mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 7 | 小王 |
+----+--------+
1 row in set (0.00 sec) [root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' --sql-type='DELETE'
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flashbak_user'@'%' IDENTIFIED BY PASSWORD '*0589CD47DC016BC67FC7720BADEC3C1368C15F60';
USE b'sbtest';
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
DELETE FROM `sbtest`.`user` WHERE `name`='小赵' AND `id`=6 LIMIT 1; #start 2612 end 2821 time 2019-12-23 11:03:34
DELETE FROM `sbtest`.`user` WHERE `name`='小李' AND `id`=8 LIMIT 1; #start 2612 end 2821 time 2019-12-23 11:03:34
DELETE FROM `sbtest`.`user` WHERE `name`='小钱' AND `id`=9 LIMIT 1; #start 2612 end 2821 time 2019-12-23 11:03:34
DELETE FROM `sbtest`.`user` WHERE `name`='小孙' AND `id`=10 LIMIT 1; #start 2612 end 2821 time 2019-12-23 11:03:34 # 生成delete的回滚语句
[root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -B -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' --sql-type='DELETE' --start-position=2612 --stop-position=2821
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (10, '小孙'); #start 2612 end 2821 time 2019-12-23 11:03:34
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (9, '小钱'); #start 2612 end 2821 time 2019-12-23 11:03:34
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (8, '小李'); #start 2612 end 2821 time 2019-12-23 11:03:34
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (6, '小赵'); #start 2612 end 2821 time 2019-12-23 11:03:34
[root@dba_test_002 binlog2sql]# # 应用回滚
mysql> INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (10, '小孙'); #start 2612 end 2821 time 2019-12-23 11:03:34
Query OK, 1 row affected (0.02 sec) mysql> INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (9, '小钱'); #start 2612 end 2821 time 2019-12-23 11:03:34
Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (8, '小李'); #start 2612 end 2821 time 2019-12-23 11:03:34
Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (6, '小赵'); #start 2612 end 2821 time 2019-12-23 11:03:34
Query OK, 1 row affected (0.00 sec) mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 6 | 小赵 |
| 7 | 小王 |
| 8 | 小李 |
| 9 | 小钱 |
| 10 | 小孙 |
+----+--------+
5 rows in set (0.00 sec) mysql>

4-4、insert操作回滚实践

# insert语句回滚
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (1, '小赵x');
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (2, '小赵x');
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (3, '小赵x');
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (5, '小赵x'); [root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' --sql-type='INSERT'
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flashbak_user'@'%' IDENTIFIED BY PASSWORD '*0589CD47DC016BC67FC7720BADEC3C1368C15F60';
USE b'sbtest';
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (6, '小赵'); #start 822 end 995 time 2019-12-23 10:38:40
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (7, '小王'); #start 1074 end 1247 time 2019-12-23 10:38:40
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (8, '小李'); #start 1326 end 1499 time 2019-12-23 10:38:40
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (9, '小钱'); #start 1578 end 1751 time 2019-12-23 10:38:40
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (10, '小孙'); #start 1830 end 2003 time 2019-12-23 10:38:41
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (10, '小孙'); #start 2900 end 3073 time 2019-12-23 11:13:28
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (9, '小钱'); #start 3152 end 3325 time 2019-12-23 11:13:28
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (8, '小李'); #start 3404 end 3577 time 2019-12-23 11:13:28
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (6, '小赵'); #start 3656 end 3829 time 2019-12-23 11:13:30
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (1, '小赵x'); #start 3908 end 4082 time 2019-12-23 11:19:55
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (2, '小赵x'); #start 4161 end 4335 time 2019-12-23 11:19:55
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (3, '小赵x'); #start 4414 end 4588 time 2019-12-23 11:19:55
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (5, '小赵x'); #start 4667 end 4841 time 2019-12-23 11:19:56
[root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' --sql-type='INSERT' --start-position=3908 --stop-position=4841
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (1, '小赵x'); #start 3908 end 4082 time 2019-12-23 11:19:55
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (2, '小赵x'); #start 4161 end 4335 time 2019-12-23 11:19:55
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (3, '小赵x'); #start 4414 end 4588 time 2019-12-23 11:19:55
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (5, '小赵x'); #start 4667 end 4841 time 2019-12-23 11:19:56
[root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py -B -h 10.10.50.60 -P3306 -uflashbak_user -pflashbak_user_pwd -dsbtest -tuser --start-file='mysql-bin.000024' --stop-file='mysql-bin.000024' --sql-type='INSERT' --start-position=3908 --stop-position=4841
DELETE FROM `sbtest`.`user` WHERE `id`=5 AND `name`='小赵x' LIMIT 1; #start 4667 end 4841 time 2019-12-23 11:19:56
DELETE FROM `sbtest`.`user` WHERE `id`=3 AND `name`='小赵x' LIMIT 1; #start 4414 end 4588 time 2019-12-23 11:19:55
DELETE FROM `sbtest`.`user` WHERE `id`=2 AND `name`='小赵x' LIMIT 1; #start 4161 end 4335 time 2019-12-23 11:19:55
DELETE FROM `sbtest`.`user` WHERE `id`=1 AND `name`='小赵x' LIMIT 1; #start 3908 end 4082 time 2019-12-23 11:19:55
[root@dba_test_002 binlog2sql]# # 应用回滚语句
mysql> INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (1, '小赵x');
Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (2, '小赵x');
Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (3, '小赵x');
INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (5, '小赵x');Query OK, 1 row affected (0.02 sec) mysql> INSERT INTO `sbtest`.`user`(`id`, `name`) VALUES (5, '小赵x');
Query OK, 1 row affected (0.00 sec) mysql> select * from user;
+----+---------+
| id | name |
+----+---------+
| 1 | 小赵x |
| 2 | 小赵x |
| 3 | 小赵x |
| 5 | 小赵x |
| 6 | 小赵 |
| 7 | 小王 |
| 8 | 小李 |
| 9 | 小钱 |
| 10 | 小孙 |
+----+---------+
9 rows in set (0.00 sec) mysql> DELETE FROM `sbtest`.`user` WHERE `id`=5 AND `name`='小赵x' LIMIT 1; #start 4667 end 4841 time 2019-12-23 11:19:56
DELETE FROM `sbtest`.`user` WHERE `id`=3 AND `name`='小赵x' LIMIT 1; #start 4414 end 4588 time 2019-12-23 11:19:55
Query OK, 1 row affected (0.00 sec) mysql> DELETE FROM `sbtest`.`user` WHERE `id`=3 AND `name`='小赵x' LIMIT 1; #start 4414 end 4588 time 2019-12-23 11:19:55
DELETE FROM `sbtest`.`user` WHERE `id`=2 AND `name`='小赵x' LIMIT 1; #start 4161 end 4335 time 2019-12-23 11:19:55
Query OK, 1 row affected (0.01 sec) mysql> DELETE FROM `sbtest`.`user` WHERE `id`=2 AND `name`='小赵x' LIMIT 1; #start 4161 end 4335 time 2019-12-23 11:19:55
Query OK, 1 row affected (0.01 sec) mysql> DELETE FROM `sbtest`.`user` WHERE `id`=1 AND `name`='小赵x' LIMIT 1; #start 3908 end 4082 time 2019-12-23 11:19:55
Query OK, 1 row affected (0.01 sec) mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 6 | 小赵 |
| 7 | 小王 |
| 8 | 小李 |
| 9 | 小钱 |
| 10 | 小孙 |
+----+--------+
5 rows in set (0.00 sec) mysql>

附录:

# binlog2sql参数
[root@dba_test_002 binlog2sql]# /usr/bin/python /opt/binlog2sql/binlog2sql/binlog2sql.py --help
File "/opt/binlog2sql/binlog2sql/binlog2sql.py", line
with temp_open(tmp_file, "w") as f_tmp, self.connection as cursor:
^
SyntaxError: invalid syntax
[root@dba_test_002 binlog2sql]# # 出现上述提示,请更换python版本即可,不要使用python2.6版本

binlog2sql闪回工具的使用的更多相关文章

  1. MySQL 闪回工具之 binlog2sql

    生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...

  2. Mysql闪回工具之binlog2sql的原理及其使用

    生产上误删数据.误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成 ...

  3. MYSQL工具之binlog2sql闪回操作

    文档结构: 在生产环境中如果遇到误删,改错数据的情况,利用mysql闪回工具binlog2sql,可以实现数据的快速回滚,从binlog中提取SQL,并能生成回滚SQL语句.Binlog以event作 ...

  4. MySQL闪回工具之myflash 和 binlog2sql

    MySQL闪回工具之:binlog2sql  https://github.com/danfengcao/binlog2sql MYSQL Binglog分析利器:binlog2sql使用详解  :h ...

  5. mysql闪回工具--binlog2sql实践

    DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...

  6. MySQL闪回工具之binlog2sql

    一.binlog2sql 1.1 安装binlog2sql git clone https://github.com/danfengcao/binlog2sql.git && cd b ...

  7. MySQL的binlog2sql闪回

    从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 用途=========== * 数据快速回滚(闪回)* 主从切换后新m ...

  8. 闪回工具flashback

    Ⅰ.背景 早先操作数据误操作后,我们一般通过全量备份+binlog的方式来实现恢复(前滚) 有时只想撤销一个几分钟前的操作,采用这种方式就会显得很笨重 大家都知道Oracle有个叫做flashback ...

  9. binlog2sql闪回恢复数据

    用途: .数据快速回滚 .从binlog生成标准sql 使用限制: .必须设置binlog_format=ROW .binlog_row_image=full,该参数默认为FULL .恢复用户拥有的最 ...

随机推荐

  1. DB2 数据库权限

    以下内容转载:  http://blog.csdn.net/xiyuan1999/article/details/8135263 DB2中的权限 DB2 中有三种主要的安全机制,可以帮助 DBA 实现 ...

  2. sql server中实现mysql的find_in_set函数

    charindex(','+'test'+',',','+Picture+',')>0

  3. Comet OJ Contest #15 D. 双十一特惠(困难版)

    以 $d(x)$ 表示正整数 $x$ 的十进制表示的数位之和.熟知下列关于 $d(x)$ 的结论: $d(x) \equiv x \pmod{9}$.从而对于任意正整数列 $a_1, a_2, \do ...

  4. Kubernetes---资源控制器

    ⒈引用 Pod的分类 自助式pod 只要pod退出了,此类型的pod不会被重建,该pod没有管理者,死亡后不会被拉起. 控制器管理的pod[生产环境中大多数都是选择控制器去管理pod] 在控制器的生命 ...

  5. 【调试经验】C++和C的混合编程以及库调用

    问题背景 这两天在移植一个开源的库,偏底层的那种,所以对架构有一些依赖.源码的编译是通过Makefile来构建,怎奈公司的架构用的是CMAKE,所以就在开源的顶层和子目录分别构建了CMakeList, ...

  6. LC 394. Decode String

    问题描述 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], wh ...

  7. QT QcustomPlot的使用(二)

    在QcustomPlot中,给横纵坐标添加箭头的方法 //在末尾添加箭头 customPlot->xAxis->setUpperEnding(QCPLineEnding::esSpikeA ...

  8. Python取整数

    1.向下取整: int()>>> a = 14.38>>> int(a)14 2.向上取整:ceil()使用ceil()方法时需要导入math模块,例如>&g ...

  9. 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末

    事情发生在5月中旬,ATN技术人员发现Token合约由于存在漏洞受到攻击.不过ATN基金会随后透露,将销毁1100万个ATN,并恢复ATN总量,同时将在主链上线映射时对黑客地址内的资产予以剔除,确保原 ...

  10. ListUtils的简单集合操作和原理

    1 Maven依赖 <dependency> <groupId>org.apache.commons</groupId> <artifactId>com ...