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_THREAD
和 SQL_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_applier
和 group_replication_recovery
)由服务器实例自动管理。对于 group_replication_recovery
通道, STOP REPLICA
根本无法使用,并且仅应在组复制未运行时与 group_replication_applier
通道一起使用。 group_replication_applier
通道只有应用器线程,没有接收器线程,因此如果需要,可以使用 SQL_THREAD
选项(不使用 IO_THREAD
选项)来停止它。
当副本是多线程的(replica_parallel_workers
是非零值)时,作为停止工作线程的一部分,从中继日志执行的事务序列中的任何间隙都会被关闭。如果副本意外停止(例如,由于工作线程中的错误,或另一个线程发出 KILL
),而 STOP REPLICA
语句正在执行,则从中继日志执行的事务序列可能会变得不一致。有关更多信息,请参阅 第 19.5.1.35 节,“复制和事务不一致”。
当源使用基于行的二进制日志格式时,如果要复制任何使用非事务性存储引擎的表,您应该在关闭副本服务器之前在副本上执行 STOP REPLICA
或 STOP REPLICA SQL_THREAD
。如果当前复制事件组修改了一个或多个非事务性表, STOP REPLICA
会最多等待 60 秒以使事件组完成,除非您发出 KILL QUERY
或 KILL CONNECTION
语句来处理复制 SQL 线程。如果事件组在超时后仍然未完成,则会记录一条错误消息。
当源使用基于语句的二进制日志格式时,在源具有打开的临时表时更改源可能会不安全。这是不建议对临时表进行基于语句的复制的原因之一。您可以通过检查 Replica_open_temp_tables
的值来了解副本上是否存在任何临时表。使用基于语句的复制时,在执行 CHANGE REPLICATION SOURCE TO
之前,该值应为 0。如果副本上存在任何打开的临时表,则在发出 STOP REPLICA
后发出 CHANGE REPLICATION SOURCE TO
语句会导致 ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO
警告。