13.4.2.6 STOP SLAVE 语句
STOP SLAVE [thread_types] [channel_option]
thread_types:
[thread_type [, thread_type] ... ]
thread_type: IO_THREAD | SQL_THREAD
channel_option:
FOR CHANNEL channel
停止复制线程。 STOP SLAVE需要REPLICATION_SLAVE_ADMIN或SUPER特权。建议的最佳实践是在停止副本服务器之前在副本服务器上执行STOP SLAVE
(有关更多信息,请参见第 5.1.16 节“服务器关闭过程”)。
使用基于行的日志记录格式时:如果要复制使用非事务性存储引擎的任何 table,则应在关闭副本服务器之前在副本服务器上执行STOP SLAVE
或STOP SLAVE SQL_THREAD
(请参阅本节后面的* Note *) 。
与START SLAVE相似,此语句可与IO_THREAD
和SQL_THREAD
选项一起使用以命名要停止的一个或多个线程。请注意,组复制应用程序通道(group_replication_applier
)没有复制 I/O 线程,只有复制 SQL 线程。因此,使用SQL_THREAD
选项将完全停止该通道。
STOP SLAVE
导致正在进行的事务的隐式提交。参见第 13.3.3 节“导致隐式提交的声明”。
在发出此语句之前,必须将gtid_next设置为AUTOMATIC
。
您可以通过设置rpl_stop_slave_timeout系统变量来控制STOP SLAVE
await 超时的时间。这可以用来避免STOP SLAVE
和其他 SQL 语句之间使用不同 Client 端连接到副本的死锁。当达到超时值时,发布 Client 端返回错误消息并停止 await,但是STOP SLAVE
指令仍然有效。一旦复制线程不再繁忙,就执行STOP SLAVE
语句,并且副本停止。
副本运行时允许某些CHANGE MASTER TO
语句,具体取决于复制 SQL 线程和复制 I/O 线程的状态。但是,在这种情况下仍支持在执行CHANGE MASTER TO
之前使用STOP SLAVE
。有关更多信息,请参见第 13.4.2.1 节“将主 table 更改为语句”和第 16.3.7 节“故障转移期间切换源”。
可选的FOR CHANNEL channel
子句使您可以命名该语句应用于哪个复制通道。提供FOR CHANNEL channel
子句会将STOP SLAVE
语句应用于特定的复制通道。如果没有命名通道并且不存在其他通道,则该语句将应用于默认通道。如果使用多个通道时STOP SLAVE
语句未命名通道,则该语句将停止所有通道的指定线程。该语句不能与group_replication_recovery
通道一起使用。有关更多信息,请参见第 16.2.3 节“复制通道”。
使用基于语句的复制时:在打开临时 table 的情况下更改源可能是不安全的。这是不建议使用基于语句的临时 table 复制的原因之一。您可以通过检查Slave_open_temp_tables的值来找出副本上是否有任何临时 table;使用基于语句的复制时,此值在执行CHANGE MASTER TO
之前应为 0.如果副本上有任何临时 table 打开,则在发出STOP SLAVE
之后发出CHANGE MASTER TO
语句将导致ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO警告。
使用多线程副本(slave_parallel_workers为非零值)时,作为停止辅助线程的一部分,将从中继日志执行的事务序列中的所有间隙都将关闭。如果在执行STOP SLAVE语句时意外地停止了副本(例如,由于工作线程中的错误或发出KILL的另一个线程),则中继日志中已执行事务的 Sequences 可能会不一致。有关更多信息,请参见第 16.4.1.32 节,“复制和事务不一致”。
如果当前复制事件组已修改一个或多个非事务 table,则 STOP SLAVE 最多 await60 秒以使事件组完成,除非您为复制 SQL 线程发出KILL QUERY或KILL CONNECTION语句。如果超时后事件组仍然不完整,则会记录一条错误消息。