229_mysql_复制技术误操作后处理

举报
alexsully 发表于 2021/11/13 18:19:29 2021/11/13
【摘要】 主库 从库误操作 恢复手段

误操作后处理

  误操作分为两类:

  •  主库误操作 (利用延迟从库找回误删的数据,利用闪回工具,反向操作注入主库)
  • 从库误操作 会导致复制报错

               Primary_key或者没找到记录报错 设置slave_exec_mode=IDEMPOTENT 跳过错误 或 利用GTID特性 注入空事务,跳过报错事务

  • 如果操作的事务量过大

                         主库大批量操作: 拿全备恢复/重新搭建主从

                         从库大批量操作: 拿全备恢复/重新搭建主从

1 主库误删 通过延迟从库处理

master1 模拟删除一条数据
slave1 延迟从库
	stop slave sql_thread;
	change master to master_delay = 300;
	select * from mysql.slave_relay_log_info \G; #sql_delay = 300;
	select * from performance_schema.replication_applier_configuration\G # channel_name; DESIRED_DELAY:300;
	#master 执行删除
	show slave  status \G  # sql_delay=300; sql_remaining_delay:224
	stop slave sql_thread;
	#mysqldump工具导出被误删的数据
	mysqldump -root -ppassword  db_name table_name  --where 'id=5' --set-gtid-purged=off --no-create-db --no-create-info --replace --complete-insert > a.sql
	# --where表示只匹配 id=5; --set-gtid-purged=off 表示不生成 set global gtid_purged语句
	# --no-create-db 表示不生成create database语句 --no-create-info 不生成 create table语句
	# --replace 将insert into 替换成 replace into(防止主库insert 数据,slave有id=5而报错)
	# --complete-insert 表示 replace into语句中生成字段名
master1 恢复
	source /tmp/a.sql

slave1  恢复SQL线程 start slave sql_thread;

2 主库误删 通过闪回工具找回数据前置条件 1 知道误操作时间点 2 master binlog有保留

master1
	定位到相关binlog 
	解析binlog  mysqlbinlog -vv mysql-bin.00001 > b.sql
	根据时间or SQL 找到起始 (commit/*!*/ 之后的 at 13000 ) / 终点 (commit/*!*/之前  end_log_pos 14161)
	工具操作
		/root/flashback --binlogFileName='mysql-bin.000001' --start-position=13000 --stop-position=14161 --outBinlogFileNameBase='binlog_flashback'
		
	mysqlbinlog -vv binlog_flashback --skip-gtids > c.sql # 作用:在导出时,忽略原有的gtid信息,恢复时生成最新的gtid信息
	source /tmp/c.sql

3 从库误操作恢复 系统变量 slave_exec_mode 恢复数据

slave_exec_mode,默认是STRICT模式(严格模式),可选值有IDEMPOTENT模式(幂等模式)
设置成IDEMPOTENT模式可以让从库避免1032(从库上不存在的键)和1062(重复键,需要存在主键或则唯一键)的错误,该模式只有在ROW EVENT的binlog模式下生效

slave1 删除master要更新的数据,master1 update
	show slave status\G 报错
	select * from performance_schema.replication_applier_status_by_worker where last_error_message != ''\G 
	set global slave_exec_mode=IDEMPOTENT
	start slave sql_thread;
	# 使用pt_table_checksum &  pt_table_sync 重新同步主从
	#1 找到差异点
	pt_table_checksum --no-check-replication-filters --no-check-binlog-formt --replicate=dbname.checksums h=master_ip, u=root, p=password, P=3306 --database=dbname; # DIFF 不为0
	
	#2 打印出差异语句 
	pt-table-sync -h=master_ip -p3306 -uroot -ppwd -P3306 --replicate=dbname.checksums --database=dbname --print
	#3 主从差异同步 
	pt-table-sync -h=master_ip -p3306 -uroot -ppwd -P3306 --replicate=dbname.checksums --database=dbname --execute
	
	set global slave_exec_mode=STRICT;
	stop slave sql_thread;
	start slave sql_thread;

4  从库误操作恢复 通过GTID 特性注入空事务恢复

slave2 异常后检查复制状态
	show slave status\G;  找到 relay_log_file & relay_log_pos
	mysqlbinlog -vv --start-position='relay_log_pos'  mysql-relay-bin.00002 > aa.sql
	vim aa.sql
	# SET @@SESSION.GTID.NEXT='xxxx-xxxx-xxxx:300'/*!*/;   拿到GTID
	SET gtid_next = 'xxxx-xxxx-xxxx:300';
	begin; commit;
	start slave sql_thread;
	
	# 使用pt_table_checksum &  pt_table_sync 重新同步主从
	#1 找到差异点
	pt_table_checksum --no-check-replication-filters --no-check-binlog-formt --replicate=dbname.checksums h=master_ip, u=root, p=password, P=3306 --database=dbname; # DIFF 不为0
	
	#2 打印出差异语句 
	pt-table-sync -h=master_ip -p3306 -uroot -ppwd -P3306 --replicate=dbname.checksums --database=dbname --print
	#3 主从差异同步 
	pt-table-sync -h=master_ip -p3306 -uroot -ppwd -P3306 --replicate=dbname.checksums --database=dbname --execute

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。