10 : mysql 主从复制 - 延时从库
延时从库
主从复制很好的解决了物理损坏,但是如果主库有个误删除写入的操作怎么办?
正常情况下从库也会同步这个错误的,企业中应该怎么避免这个情况?
这个时候就需要使用延时同步来解决:
延时从库?delay(延时)从节点同步数据。
对SQL线程进行延时设置。IO线程正常的执行。
企业中一般延迟3-6小时
延时从库的配置过程:
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = 60; (延时60s)
mysql>start slave;
mysql> show slave status \G
Master_UUID: c1bc62f5-e643-11e9-8060-000c29d5441f
Master_Info_File: /data/3308/data/master.info
SQL_Delay: 60
SQL_Remaining_Delay: NULL (没有数据的时候显示NULL)
主库执行个插入数据,会发现开始倒计时。倒计时结束sql线程才会把数据同步到从库里面
... ...
SQL_Delay: 60
SQL_Remaining_Delay: 56 (倒计时秒速)
... ...
停止延时:
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_DELAY = 0;
mysql> start slave;
--------------------------------------------
模拟故障,思考:
0、总数据量级500G,正常备份去恢复需要1.5-2小时
1、配置延时3600秒
mysql>CHANGE MASTER TO MASTER_DELAY = 3600;
2、主库做了drop database db;
3、怎么利用延时从库,恢复数据?
-------------------------------------------
提示:
1、从库relaylog存放在/data/3308/data
2、mysqlbinlog 可以截取relaylog内容
3、show relay log events in 'db01-relay-bin.000001';
处理的思路:
1、停止SQL线程
mysql> stop slave sql_thread;
2、截取relaylog到误删除之前点
(1)relay-log.info 获取到上次运行到的位置点,作为恢复起点
(2)分析relay-log的文件内容。,获取到误删除之前position
----------------------------------------
****** 模拟故障处理过程,并利用延时从库处理故障
0、关闭延时
mysql -S /data/3308/mysql.sock
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_DELAY = 0;
mysql> start slave;
模拟数据:
mysql -S /data/3307/mysql.sock
source /root/world.sql
use world;
create table c1 select * from city;
create table c2 select * from city;
1、开启从库延时5分钟(这里是模拟,所以时间短。企业是3-6小时)
mysql -S /data/3308/mysql.sock
show slave status \G
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = 300;
mysql>start slave;
主库:
mysql -S /data/3307/mysql.sock
use world;
create table c3 select * from city;(把word库的city表数据给c3)
create table c4 select * from mysql.user;(把mysql库的user表数据给c4)
2、破坏,模拟删库故障。(以下步骤在5分钟内操作完成。)
mysql -S /data/3307/mysql.sock
drop database world;
3、从库,关闭SQL线程(从库这时候会倒计时,在倒计时之前关闭sql线程)
mysql -S /data/3308/mysql.sock
stop slave sql_thread; (在5分钟内停掉sql线程,不然超过5分就同步到从库 了。)
4、截取relay-log
起点:(relaylog 的起始位置)
cd /data/3308/data/
cat relay-log.info
./db01-relay-bin.000002
283
终点:(执行drop那条语句的前一条位置)
mysql -S /data/3308/mysql.sock
show relaylog events in 'db01-relay-bin.000002' (找到drop语句的前一位置点条。)
db01-relay-bin.000002 | 268047 | Query | 3307 | 1781140 | drop database word
从relaylog里面导出这一段数据。
mysqlbinlog --start-position=283 --stop-position=268047 /data/3308/data/db01-relay-bin.000002 >/tmp/relay.sql
5、恢复relay.sql
(1)取消从库身份:
mysql> stop slave;
mysql> reset slave all;
(2)恢复数据(从库执行,这样从库就是一个完成的数据了,从变成主,)
mysql> set sql_log_bin=0;
mysql> source /tmp/relay.sql
mysql> use world
mysql> show tables;
6 . 可以把从当做主库,就可以了。
mysql -uroot -p123 -S /data/3308/mysql.sock
mysql>stop slave;
mysql>reset slave all;