15.4.2.5 停止副本语句
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
特权)。推荐的最佳实践是,在停止副本服务器(见第7.1.19节,“服务器关闭过程”)之前执行 STOP REPLICA
语句。
与START REPLICA
语句类似,这个语句可以与 IO_THREAD
和 SQL_THREAD
选项一起使用,以命名要停止的副本线程或线程。注意,Group Replication applier channel (group_replication_applier
) 没有复制 I/O(接收)线程,只有复制 SQL(applier)线程。使用 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 (group_replication_applier
和 group_replication_recovery
) 的复制通道由服务器实例自动管理。STOP REPLICA
不能与group_replication_recovery
通道一起使用,并且在 Group Replication 不运行时只能使用group_replication_applier
通道。group_replication_applier
通道只有一个应用线程,没有接收线程,因此可以在需要时使用SQL_THREAD
选项,而不使用IO_THREAD
选项。
当复制服务器是多线程的(replica_parallel_workers
的值不是零)时,任何relay日志中执行的事务序列中的空隙将在停止工作线程时被关闭。如果复制服务器在执行STOP REPLICA
语句时突然停止(例如,由于工作线程的错误或另一个线程发出KILL
语句),从relay日志中执行的事务序列可能会变得不一致。请参阅第19.5.1.34节,“复制和事务不一致”获取更多信息。
当源服务器使用行基于的二进制日志格式时,您应该在关闭复制服务器之前在复制服务器上执行STOP REPLICA
或STOP REPLICA SQL_THREAD
语句,如果您正在复制使用非事务存储引擎的表。如果当前复制事件组已经修改了一个或多个非事务表,STOP REPLICA
将等待最长60秒以等待事件组完成,除非您发出KILL QUERY
或KILL CONNECTION
语句。如果事件组仍然不完整,错误信息将被记录。
当源使用语句级别二进制日志格式时,改变源同时存在临时表时可能不安全。这是临时表语句级别复制的不推荐原因。你可以通过检查Replica_open_temp_tables
的值来确定是否存在临时表在复制服务器上。当使用语句级别复制时,在执行CHANGE REPLICATION SOURCE TO
语句前,这个值应该为0。否则,在复制服务器上存在临时表时,执行CHANGE REPLICATION SOURCE TO
语句后,会出现一个ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO
警告。