mysql 延时从库

延时从库

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

企业中一般会延时3-6小时
延时从库配置方法

#停止主从
mysql>stop slave;

#设置延时为180秒
mysql>CHANGE MASTER TO MASTER_DELAY = 180;

#开启主从
mysql>start slave;

#查看状态
mysql> show slave status G
SQL_Delay: 60

3.延时从库停止方法
#停止主从
mysql> stop slave;

#设置延时为0
mysql> CHANGE MASTER TO MASTER_DELAY = 0;

#开启主从
mysql> start slave;

延时从库恢复数据案例

0.思考

#延时从库到底在哪里延时的?
	当配置了延时从库,延时从库是在sql线程进行的延时,主库执行完sql语句,
        IO线程已经将binlog拿到了从库的relay-log,只不过sql线程没有执行,需要等待设置的延时时间归0后执行语句

1.场景

总数据量级500G,正常备份去恢复需要1.5-2小时
1.配置延时3600秒
mysql> CHANGE MASTER TO MASTER_DELAY = 3600;
2.主库
drop database db;
3.怎么利用延时从库,恢复数据?

提示:
1.从库relaylog存放在datadir目录下
2.mysqlbinlog 可以截取relaylog内容
3.show relaylog events in 'db01-relay-bin.000001';

2.环境准备

1.日常备份
	[root@db01 ~]# mysqldump -uroot -p123 -A -R --triggers --single-transaction --master-data=2 > /tmp/full$(date +%F).sql
	
2.设置延时从库
	mysql> stop slave;
	mysql> change master to master_delay=3600;
	mysql> start slave;

3.插入新数据
	mysql> use master;
	mysql> insert test values(100),(200);

3.模拟删除数据库

mysql> drop database master;

4.使用延时从库恢复数据

1.停止从库的sql线程
	mysql> stop slave sql_thread;

2.查看状态
	mysql> show slave statusG
             Slave_IO_Running: Yes
            Slave_SQL_Running: No

3.导出从库相应的库
	[root@db02 ~]# mysqldump -uroot -p123 -B master > /tmp/master.sql
	
4.截取relay-log位置点
	1)确认起始位置点
		[root@db02 ~]# cat /usr/local/mysql/data/relay-log.info
		./db02-relay-bin.000002
		283
	2)确认结束位置点
		[root@db02 ~]# mysqlbinlog /usr/local/mysql/data/db02-relay-bin.000002
		COMMIT/*!*/;
		# at 504
	3)截取数据
		[root@db02 ~]# mysqlbinlog --start-position=283 --stop-position=504 /usr/local/mysql/data/db02-relay-bin.000002 > /tmp/huifu.sql
		
5.将sql文件推送至主库
	[root@db02 ~]# scp /tmp/master.sql 172.16.1.51:/tmp
	[root@db02 ~]# scp /tmp/huifu.sql 172.16.1.51:/tmp
	
6.恢复数据到主库
	mysql> source /tmp/master.sql;
	mysql> source /tmp/huifu.sql;
	
7.查看主库数据是否恢复
8.开启从库的sql线程
	mysql> start slave sql_thread;

#注意,有时为了数据准确在主库恢复数据时我们会关闭binlog,要是使用延时从库恢复数据,主库千万不要关闭binlog