当中断对 Master 的查询时,它会复制到 Slave 吗?

Ala*_* C. 6 mysql replication

在 MySQL 中,master 什么时候向 slaves 发送查询?

这是我试图理解的一个特定场景。

  • 管理员在 master 上输入了一个需要很长时间才能执行的更新。
  • 管理员点击Ctrl-C停止查询。

我看到可能发生的四种情况:

  1. 从站上什么也没发生,因为主站等待查询执行完毕,然后再将查询发送给从站。
  2. 从站上发生了巨大的更新,因为主站立即传递了查询,并没有将查询传递^C给从站。
  3. 在从站上发生与主站相同的更新,因为主站立即将查询传递^C给从站,并将查询传递给从站。
  4. 在从站上发生与主站相同的更新,因为主站将每个单独的更新传递给从站。

其中哪一项是实际发生的?

Rol*_*DBA 3

这是 MySQL 复制架构中的一个局部现象。以下是当您中断主服务器上的查询时有时会出现的示例消息

查询在主服务器上部分完成(主服务器上的错误:1053)并被中止。此时您的主人可能会不一致。如果您确定主服务器正常,请在从服务器上手动运行此查询,然后使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1 重新启动从服务器;启动从机;。查询:(INSERT vhc (v_id, vc_id) SELECT 7421594, vc_id FROM vc WHERE label='st' AND value='re')

错误 1053 是服务器关闭。显然,其目的不是关闭 mysql 也不告诉连接的从站。在 Master 上按 Ctrl-C 会终止数据库连接。然而,这种断开连接被简单地解释为关闭。在我的旧帖子中MySQL 支持复制所有数据库吗?,我描述了MySQL如何从Master复制到Slave:

  • Master 已启用二进制日志记录
  • 主记录已完成的 SQL 语句
  • Master 将注入“USE dbname;” 它记录的SQL语句中
  • 从机连接到主机(IO 线程)
  • 从属 IO 线程从二进制日志请求下一条 SQL 语句
  • 从属 IO 线程将其复制到其中继日志
  • 从属 SQL 线程处理其中继日志条目 FIFO(队列)

回顾我描述的错误消息,从站在其中继日志中检测到来自主站的 binlog 事件。它预期另一个事件,实际的 SQL 表明 Master 上一切顺利。相反,出现了错误 1053(由 Ctrl-C 引起的幻像关机)。这将使您有机会说“哦,主人,该查询已中断”。我会查看数据,看看它们是否匹配

当谈到你的实际问题时,我会选择#1

从站上没有发生任何事情,因为主站会等到查询执行完毕后才将查询发送到从站。

但有一个警告

由于在Master上执行了Ctrl-C,Master将SQL连同错误1053一起记录在binlog中。Slave拦截了这一场景。