229_mysql_复制技术误操作后处理
【摘要】 主库 从库误操作 恢复手段
误操作后处理
误操作分为两类:
- 主库误操作 (利用延迟从库找回误删的数据,利用闪回工具,反向操作注入主库)
- 从库误操作 会导致复制报错
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)