跳转至

23. 主从复制-延时从库

1. 概念

#主库做了一个变更,从库很久才能追上

2. 原因

1.主库写binlog不及时
#解决办法
sync_binlog=1; #每次事务提交都立即刷新binlog到磁盘(双一标准之一)
2.dump线程压力大
#从库越多,压力越大
3.IO线程阻塞
#大事务---拆成小事务
#事务量大----group commit
4.SQL线程慢
#默认只有一个SQL线程,从库中的事务都是一个一个执行
#如果主库并发事务数很多、大事务,都会造成从库延时
#解决办法----
    1.多线程复制,有局限性,针对不同库的事务进行并发,很少用,很鸡肋,在有些情况下可以解决并发事务问题
    2.对于大事务问题,只能在主库方面,将大事务拆成小事务

面试中经常会问到,第4点出现几率比较高

3. 查看主从延时

show slave status\G

show processlist;

面试中经常会问到!

4. 普通主从复制存在的不足

1.逻辑损坏怎么办
2.过滤复制
3.不能保证主库做的操作,从库一定能做。
4.高可用?自动failover

5. 延时从库设置

#延时从库:从库落后于主库一段时间
#原理:SQL线程延时:数据已经写入relaylog中了,SQL线程慢点运行
#从库设置
stop slave;

change master to master_delay=300;

start slave;

#查看
show slave status\G
SQL_Delay: 300

企业中一般建议3-6小时延时

6. 主库误操作,怎么使用延时从库

1.停止主库业务

2.停止从库SQL线程
    stop slave sql_thread;

3.手工模拟sql线程工作,并截止到误操作之前
    读取relay-log.info,获取到上次执行到的位置,作为继续执行relay-log的起点
    分析relay-log内容,获取到误操作的位置点
    截取这段日志,恢复到从库

4.切为主库

7. 模拟

#1.模拟数据及故障
#主库
create database delay charset utf8;
use delay;
create table t1(id int);
insert into t1 values(1),(2);
commit;

drop database delay;
#2.停从库sql线程
stop slave sql_thread;
#3.读取relay-log或者(show slave status\G),找到起点
#4.找得到误删除位置,即终点
show relaylog events in 'db01-relay-bin.000002';
#5.截取relaylog
mysqlbinlog --start-position=283 --stop-position=693 db01-relay-bin.000002 >/tmp/relay.sql
#6.从库恢复relaylog
source /tmp/relay.sql

最后更新: 2022-02-25 03:53:42