localhost:3306 -> localhost:3307(delay 600)
当前节点二状态:
chengqm-3307>>show slave status G;...Master_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000039Read_Master_Log_Pos: 15524Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 22845Relay_Master_Log_File: mysql-bin.000038Slave_IO_Running: YesSlave_SQL_Running: Yes...Seconds_Behind_Master: 600...
当前节点二表:chengqm-3307>>show tables;+------------------+| Tables_in_mytest |+------------------+| a|| b|+------------------+
在节点一删除表 b:chengqm-3306>>drop table b;Query OK, 0 rows affected (0.00 sec)chengqm-3306>>show tables;+------------------+| Tables_in_mytest |+------------------+| a|+------------------+1 row in set (0.00 sec)
接下来就是跳过这条 SQL 的操作步骤 。1. 延迟库停止同步stop slave;
- 找出执行了 drop table 语句的前一句的 pos 位置
`[mysql@mysql-test ~]$ mysqlbinlog -vv /data/mysql_log/mysql_test/mysql-bin.000039 | grep -i -B 10 'drop table `b`';`...at 35134190819 11:40:25 server id 83end_log_pos 35199 CRC32 0x02771167Anonymous_GTIDlast_committed=132sequence_number=133rbr_only=noSET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;# at 35199190819 11:40:25 server id 83end_log_pos 35317 CRC32 0x50a018aaQuerythread_id=37155exec_time=0error_code=0use `mytest`/*!*/;SET TIMESTAMP=1566186025/*!*/;DROP TABLE `b` /* generated by server */
从结果中我们可以看到 drop 所在语句的前一句开始位置是 35134 , 所以我们同步到 35134(这个可别选错了) 。3. 延迟库同步到要跳过的 SQL 前一条
change master to master_delay=0;start slave until master_log_file='mysql-bin.000039',master_log_pos=35134;
查看状态看到已经同步到对应节点:chengqm-3307>>show slave status G;...Master_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000039Read_Master_Log_Pos: 65792...Slave_IO_Running: YesSlave_SQL_Running: NoExec_Master_Log_Pos: 35134...Until_Log_File: mysql-bin.000039Until_Log_Pos: 35134
4. 跳过一条 SQL 后开始同步set global sql_slave_skip_counter=1;start slave;
查看同步状态 , 删除表 b 的语句已经被跳过:chengqm-3307>>show slave status G;...Slave_IO_Running: YesSlave_SQL_Running: Yes...1 row in set (0.00 sec)chengqm-3307>>show tables;+------------------+| Tables_in_mytest |+------------------+| a|| b|+------------------+2 rows in set (0.00 sec)
4.2.2 开启 GTID使用 GTID 跳过的步骤会简单很多 , 只要执行一条和要跳过的 SQL 的 GTID 相同的事务就可以跳过了 。- 停止同步;
- 找出执行了 drop table 语句的 GTID;
- 执行这个 GTID 的事务;
SET SESSION GTID_NEXT='对应的 GTID 值';BEGIN; COMMIT;SET SESSION GTID_NEXT = AUTOMATIC;
- 继续同步;
- 闪回 。
5.1 binlog2sqlbinlog2sql 是大众点评开源的一款用于解析 binlog 的工具 , 可以用于生成闪回语句 , 项目地址 binlog2sql 。
5.1.1 安装
wget https://github.com/danfengcao/binlog2sql/archive/master.zip -O binlog2sql.zipunzip binlog2sql.zipcd binlog2sql-master/# 安装依赖pip install -r requirements.txt
5.1.2 生成回滚SQLPython binlog2sql/binlog2sql.py --flashback-h<host> -P<port> -u<user> -p'<password>' -d<dbname> -t<table_name>--start-file='<binlog_file>'--start-datetime='<start_time>'--stop-datetime='<stop_time>' > ./flashback.sqlpython binlog2sql/binlog2sql.py --flashback-h<host> -P<port> -u<user> -p'<password>' -d<dbname> -t<table_name>--start-file='<binlog_file>'--start-position=<start_pos>--stop-position=<stop_pos> > ./flashback.sql
5.2 MyFlashMyFlash 是由美团点评公司技术工程部开发维护的一个回滚 DML 操作的工具 , 项目链接 MyFlash 。限制:
- binlog 格式必须为 row , 且 binlog_row_image=full;
推荐阅读
- 取出上一条下一条的 sql语句
- 一个用Java实现的超轻量级RESTful Web服务示例
- 教你一个万能的PPT排版小技巧,简单易学,而且什么场合都能用
- 冥王阿茶是谁 冥王阿茶百度百科
- 割双眼皮多久才能喝酒呢?
- 杨玉环的身高及体重 杨玉环体型
- 西班牙参与一战和二战吗 西班牙没有参加二战
- 小人国是指哪一个星系?
- 教师资格证审核要多久?
- 黄忠是一位什么样的人 黄忠一把年纪都活在了