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;


可以把原主库当做从,就可以了。

猜你喜欢

转载自www.cnblogs.com/jim-xu/p/11651259.html