延时从库
普通的主从复制可能存在不足
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 status\G
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