文档首页
MySQL 8.4 参考手册
相关文档 下载本手册

15.4.2.5 STOP REPLICA 语句

STOP REPLICA [thread_types] [channel_option]

thread_types:
    [thread_type [, thread_type] ... ]

thread_type: IO_THREAD | SQL_THREAD

channel_option:
    FOR CHANNEL channel

停止复制线程。

STOP REPLICA 需要 REPLICATION_SLAVE_ADMIN 权限(或已弃用的 SUPER 权限)。建议的最佳做法是在停止副本服务器之前在副本上执行 STOP REPLICA(有关详细信息,请参阅 第 7.1.19 节“服务器关闭流程”)。

START REPLICA 类似,此语句可以使用 IO_THREADSQL_THREAD 选项来命名要停止的复制线程。请注意,组复制应用器通道(group_replication_applier)没有复制 I/O(接收器)线程,只有一个复制 SQL(应用器)线程。因此,使用 SQL_THREAD 选项将完全停止此通道。

STOP REPLICA 会导致正在进行的事务隐式提交。请参阅 第 15.3.3 节“导致隐式提交的语句”

在发出此语句之前,gtid_next 必须设置为 AUTOMATIC

您可以通过设置系统变量 rpl_stop_replica_timeout 来控制 STOP REPLICA 在超时之前等待的时间。这可以用来避免 STOP REPLICA 与使用不同客户端连接到副本的其他 SQL 语句之间的死锁。当达到超时值时,发出指令的客户端会返回一条错误消息并停止等待,但 STOP REPLICA 指令仍然有效。一旦复制线程不再繁忙,STOP REPLICA 语句就会被执行,副本就会停止。

一些 CHANGE REPLICATION SOURCE TO 语句在副本运行时是允许的,具体取决于复制线程的状态。但是,在这些情况下,在执行 CHANGE REPLICATION SOURCE TO 语句之前使用 STOP REPLICA 仍然是支持的。有关更多信息,请参见 第 15.4.2.2 节,“CHANGE REPLICATION SOURCE TO 语句”第 19.4.8 节,“故障转移期间切换源”

可选的 FOR CHANNEL channel 子句使您能够命名该语句应用于哪个复制通道。提供 FOR CHANNEL channel 子句会将 STOP REPLICA 语句应用于特定的复制通道。如果未命名通道且不存在额外通道,则该语句将应用于默认通道。如果在使用多个通道时,STOP REPLICA 语句未命名通道,则该语句将停止所有通道的指定线程。有关更多信息,请参见 第 19.2.2 节,“复制通道”

组复制的复制通道(group_replication_appliergroup_replication_recovery)由服务器实例自动管理。STOP REPLICA 根本不能与 group_replication_recovery 通道一起使用,并且仅应在组复制未运行时与 group_replication_applier 通道一起使用。group_replication_applier 通道只有一个应用线程,没有接收线程,因此如果需要,可以使用带有 SQL_THREAD 选项但不带 IO_THREAD 选项来停止它。

当副本是多线程的(replica_parallel_workers 是一个非零值)时,从中继日志执行的事务序列中的任何间隙都会在停止工作线程的过程中被关闭。如果在执行 STOP REPLICA 语句时意外停止副本(例如,由于工作线程中的错误或另一个线程发出 KILL),则从中继日志执行的事务序列可能会变得不一致。有关更多信息,请参见 第 19.5.1.34 节,“复制和事务不一致”

当源使用基于行的二进制日志格式时,如果您正在复制任何使用非事务性存储引擎的表,则应在关闭副本服务器之前在副本上执行 STOP REPLICASTOP REPLICA SQL_THREAD。如果当前复制事件组已修改了一个或多个非事务性表,则 STOP REPLICA 将等待最多 60 秒以完成该事件组,除非您为复制 SQL 线程发出 KILL QUERYKILL CONNECTION 语句。如果超时后事件组仍未完成,则会记录一条错误消息。

当源使用基于语句的二进制日志格式时,在其具有打开的临时表时更改源可能是不安全的。这就是不建议对临时表进行基于语句的复制的原因之一。您可以通过检查 Replica_open_temp_tables 的值来确定副本上是否有任何临时表。使用基于语句的复制时,在执行 CHANGE REPLICATION SOURCE TO 之前,该值应为 0。如果副本上有任何打开的临时表,则在发出 STOP REPLICA 后发出 CHANGE REPLICATION SOURCE TO 语句会导致 ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO 警告。