JiFu's Wiki JiFu's Wiki
首页
  • HTML
  • JavaScript
  • NodeJS
  • Vuejs
  • 微信小程序
  • Python
  • 数据库
  • 中间件
  • 算法
  • 软件工程
  • Wordpress
  • iOS开发
  • Android开发
  • Linux
  • Windows
  • MacOS
  • Docker
  • Vim
  • VSCode
  • Office
  • 其他
  • Photoshop
  • Sketch
  • Mac
  • 游戏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • HTML
  • JavaScript
  • NodeJS
  • Vuejs
  • 微信小程序
  • Python
  • 数据库
  • 中间件
  • 算法
  • 软件工程
  • Wordpress
  • iOS开发
  • Android开发
  • Linux
  • Windows
  • MacOS
  • Docker
  • Vim
  • VSCode
  • Office
  • 其他
  • Photoshop
  • Sketch
  • Mac
  • 游戏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据库

    • MySQL

      • MySQL介绍
      • MySQL 排序的艺术:你真的懂 Order By 吗?
      • MySQL延迟复制
        • 查看 slave 状态
      • MySQL 调优优化的 101 个建议
      • 分库分表 vs NewSQL数据库
    • Redis

  • Python

  • 中间件

  • 算法

  • 软件工程

  • Wordpress

  • 后端技术
  • 数据库
  • MySQL
JiFu
2023-10-18
目录

MySQL延迟复制

# 什么是延迟复制

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

# 延迟复制使用场景

  • 利用延迟复制做误操作恢复

提供 Master 节点意外错误的快速恢复机制,若 Master 节点出现误改、误删等操作,造成数据丢失的情况,由于 Slave 节点有延迟因素的存在,那么我们 DBA 可以通过 Slave 节点仍然保存的数据,快速地将之恢复回去。不过通常延迟时间不会太长,如果出现误操作,而且 Slave 节点恰好还没有应用这些事件,那就必须争分夺秒进行恢复才可以。

  • 测试复制环境出现延迟时,评估对系统应用可能造成的影响。

# 启用延迟复制

启用延迟复制非常简单,只需要指定 Slave 节点中 MASTER_DELAY 的选项值即可,语句如下:

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

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

# 延迟复制状态查看

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 的状态; 该值一般会有两种情况: 当 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

# 查看 slave 状态

# master状态

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
..........
1
2
3
4
5
6

说明一下:我设置的是 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
1
2
3
4

# 怎么从延迟复制变为不延迟复制

只需要把 master_delay 的值改为 0 即可。

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

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

  • 库出现误操作后,首先我们把 sql_thread 线程停止执行,并把延迟复制 master_delay 这个值改为 0,表示取消延迟复制;
mysql> stop slave sql_thread;
mysql> change master to master_delay=0;
1
2
  • 让 sql_thread 执行到出现问题之前停止;

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

  • 然后把 slave 库上恢复的数据使用 mysqldump 备份出来;
  • 把 mysqldump 备份的数据导入到 master 库上;

到此数据恢复成功;

如果数据太大,例如 1TB 数据,我们应该怎么传输这些数据。我们可以使用 rsync 传输数据。

# 参考资料

-MySQL 延迟复制 (opens new window)

上次更新: 2024/08/11, 01:59:03
MySQL 排序的艺术:你真的懂 Order By 吗?
MySQL 调优优化的 101 个建议

← MySQL 排序的艺术:你真的懂 Order By 吗? MySQL 调优优化的 101 个建议→

最近更新
01
Disable notification "to get future google chrome updates you'll need macos 10.13 or later" on mac
05-14
02
MacOS软件推荐
04-30
03
Debian Sway开发机安装手册
03-26
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Ji Fu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式