MySQL 延迟复制

1、什么是延迟复制

延迟复制就是将 Slaves 节点与 Master 节点保持指定时间的复制间隔。
所谓的延迟 ,只是对 SQL_Thread 的线程的延迟。IO_Thread 主库发生的任何操做的日志都会同步到 slave,也就是说 IO_Thread 线程和主库是没有延迟的。只是 SQL_Thread 与主库有延迟。只是执行时间延迟,而不是读取 binlog 时间延迟。mysql

2、延迟复制使用场景

(1) 利用延迟复制作误操做恢复
提供 Master 节点意外错误的快速恢复机制,若 Master 节点出现误改、误删等操做,形成数据丢失的状况,因为 Slave 节点有延迟因素的存在,那么咱们 DBA 能够经过 Slave 节点仍然保存的数据,快速地将之恢复回去。不过一般延迟时间不会太长,若是出现误操做,并且 Slave 节点刚好尚未应用这些事件,那就必须争分夺秒进行恢复才能够。
(2) 测试复制环境出现延迟时,评估对系统应用可能形成的影响。sql

3、启用延迟复制

启用延迟复制很是简单,只须要指定 Slave 节点中 MASTER_DELAY 的选项值便可,语句以下:测试

stop slave sql_thread;
change master to master_delay=N;  #N 单位秒
start slave;

设置完成以后,START SLAVE 就可使之生效,无需从新启动 MySQL 服务。
这样设置了以后,Slaves 节点接收到 Master 节点生成的二进制日志,不会立刻应用,而是等待,直到时间符合设定的延迟条件后才开始应用。spa

4、延迟复制状态查看

Slave 开通延迟复制后,Slave 节点应用状态如何,咱们能够经过 SHOW SLAVE STATUS\G 查看如下 3 个状态值便可。线程

  • SQL_Delay:显示当前设定的延迟时间,以秒为单位。
  • SQL_Remaining_Delay: 当 Slave_SQL_Running_State 列的状态是“Waiting until MASTER_DELAY seconds after master executed event''时,本列显示的值就是距离延迟阈值的时间,也就是说还有多长时间才能开始应用,不然本列值应该是 NULL。复制完成后没有可复制的 events 时这个值就是 NULL。日志

  • Slave_SQL_Running_State: 该值显示的是当前 SQL_THREAD 的状态;code

该值通常会有两种状况:
当 SQL_THREAD 没有处于延迟等待阶段时显示:Slave has read all relay log; waiting for more updates
当 SQL_THREAD 处于延迟等待阶段,SHOW SLAVE STATUS\G 或者 SHOW PROCESSLIST 显示该进程的状态将会是:Waiting until MASTER_DELAY seconds after master executed event进程

我在 master 上执行了一个语句后,查看 slave 状态事件

mysql> show slave status\G
.........
                    SQL_Delay: 300  
          SQL_Remaining_Delay: 54
      Slave_SQL_Running_State: Waiting until MASTER_DELAY seconds after master executed event
..........

说明一下:我设置的是 300 秒延迟复制,master_delay=30。因此上面显示 SQL_Delay:300
SQL_Remaining_Delay: 54 表示还有 54 秒后才能够应用 master 上执行的语句。
复制完成后 slave 状态:同步

mysql> show slave status\G
                    SQL_Delay: 300
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

5、怎么从延迟复制变为不延迟复制

只须要把 master_delay 的值改成 0 便可。

mysql> stop slave sql_thread;
mysql> change master to master_delay=0;
mysql> start slave;

6、延迟复制恢复数据方法和步骤

(1)主库出现误操做后,首先咱们把 sql_thread 线程中止执行,并把延迟复制 master_delay 这个值改成 0,表示取消延迟复制;

mysql> stop slave sql_thread;
mysql> change master to master_delay=0;

(2)让 sql_thread 执行到出现问题以前中止;

start slave  sql_thread until master_log_file='xxxx',master_log_pos='xxxxx';

(3)而后把 slave 库上恢复的数据使用 mysqldump 备份出来;
(4)把 mysqldump 备份的数据导入到 master 库上;
到此数据恢复成功;

若是数据太大,例如 1TB 数据,咱们应该怎么传输这些数据。咱们可使用 rsync 传输数据。