#### 13.4.2.10 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
```

停止复制线程。从 MySQL 8.0.22 开始，使用[`停止复制`](stop-replica.html)代替[`停止奴隶`](stop-slave.html), 现在已弃用。在 MySQL 8.0.22 之前的版本中，使用[`停止奴隶`](stop-slave.html).

`停止复制`需要[`REPLICATION_SLAVE_ADMIN`](privileges-provided.html#priv_replication-slave-admin)特权（或已弃用的[`极好的`](privileges-provided.html#priv_super)特权）。推荐的最佳实践是执行`停止复制`在停止副本服务器之前在副本上（请参阅[第 5.1.19 节，“服务器关闭过程”](server-shutdown.html)， 了解更多信息）。

喜欢[`开始复制`](start-replica.html)，此语句可与`IO_THREAD`和`SQL_THREAD`命名复制线程或要停止的线程的选项。请注意，组复制应用程序通道 (`group_replication_applier`) 没有复制 I/O（接收者）线程，只有一个复制 SQL（应用程序）线程。使用`SQL_THREAD`因此选项会完全停止该通道。

`停止复制`导致正在进行的事务的隐式提交。看[第 13.3.3 节，“导致隐式提交的语句”](implicit-commit.html).

[`gtid_next`](replication-options-gtids.html#sysvar_gtid_next)必须设置为`自动的`在发表此声明之前。

你可以控制多长时间`停止复制`通过设置系统变量在超时之前等待[`rpl_stop_replica_timeout`](replication-options-replica.html#sysvar_rpl_stop_replica_timeout)（来自 MySQL 8.0.26）或[`rpl_stop_slave_timeout`](replication-options-replica.html#sysvar_rpl_stop_slave_timeout)（在 MySQL 8.0.26 之前）。这可以用来避免之间的死锁`停止复制`和其他使用不同客户端连接到副本的 SQL 语句。当达到超时值时，发布客户端返回错误消息并停止等待，但`停止复制`指令仍然有效。一旦复制线程不再忙，`停止复制`语句被执行并且副本停止。

一些[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)副本运行时允许使用语句，具体取决于复制线程的状态。但是，使用`停止复制`在执行之前[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)在这种情况下的声明仍然得到支持。看[第 13.4.2.3 节，“将复制源更改为语句”](change-replication-source-to.html),[第 13.4.2.1 节，“将 MASTER 更改为语句”](change-master-to.html)， 和[第 17.4.8 节，“在故障转移期间切换源”](replication-solutions-switch.html)， 了解更多信息。

可选的`对于频道 *`渠道`*`子句使您能够命名该语句适用于哪个复制通道。提供一个`对于频道 *`渠道`*`条款适用于`停止复制`声明到特定的复制通道。如果没有命名通道并且不存在额外的通道，则该语句适用于默认通道。如果一个`停止复制`使用多个通道时，该语句不命名通道，该语句停止所有通道的指定线程。该语句不能与`group_replication_recovery`渠道。看[第 17.2.2 节，“复制通道”](replication-channels.html)了解更多信息。

当副本是多线程的（[`replica_parallel_workers`](replication-options-replica.html#sysvar_replica_parallel_workers)要么[`slave_parallel_workers`](replication-options-replica.html#sysvar_slave_parallel_workers)是一个非零值），从中继日志执行的事务序列中的任何间隙都将作为停止工作线程的一部分关闭。如果副本意外停止（例如由于工作线程中的错误或另一个线程发出[`杀`](kill.html)) 而一个`停止复制`语句正在执行，中继日志中执行的事务顺序可能会变得不一致。看[第 17.5.1.34 节，“复制和事务不一致”](replication-features-transaction-inconsistencies.html)， 了解更多信息。

当源使用基于行的二进制日志记录格式时，您应该执行`停止复制`要么`停止复制 SQL_THREAD`如果要复制任何使用非事务性存储引擎的表，请在关闭副本服务器之前在副本上执行此操作。如果当前复制事件组修改了一个或多个非事务表，`停止复制`最多等待 60 秒以使事件组完成，除非您发出[`终止查询`](kill.html)要么[`终止连接`](kill.html)复制 SQL 线程的语句。如果事件组在超时后仍然不完整，则会记录一条错误消息。

当源使用基于语句的二进制日志记录格式时，在它具有打开的临时表时更改源可能是不安全的。这也是不建议对临时表进行基于语句的复制的原因之一。您可以通过检查的值来了解副本上是否有任何临时表[`Replica_open_temp_tables`](server-status-variables.html#statvar_Replica_open_temp_tables)要么[`Slave_open_temp_tables`](server-status-variables.html#statvar_Slave_open_temp_tables).使用基于语句的复制时，执行前该值应为 0[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html).如果副本上有任何临时表打开，则发出[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)发出后的声明`停止复制`导致[`ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_warn_open_temp_tables_must_be_zero)警告。
