### 17.2.3 复制线程

[17.2.3.1 监控复制主线程](replication-threads-monitor-main.html)
[17.2.3.2 监控复制应用程序工作线程](replication-threads-monitor-worker.html)

MySQL 复制功能是使用三个主线程实现的，一个在源服务器上，两个在副本上：

-   **二进制日志转储线程。**当副本连接时，源创建一个线程以将二进制日志内容发送到副本。这个线程可以在输出中被识别[`显示进程列表`](show-processlist.html)在源上作为`二进制日志转储`线。

    二进制日志转储线程获取源二进制日志上的锁，以读取要发送到副本的每个事件。一旦事件被读取，锁就会被释放，甚至在事件被发送到副本之前。

-   **复制 I/O 接收器线程。**当一个[`开始复制`](start-replica.html)语句在副本服务器上发出，副本创建一个 I/O（接收器）线程，该线程连接到源并要求它发送记录在其二进制日志中的更新。

    复制接收者线程读取源的更新`二进制日志转储`线程发送（参见上一项）并将它们复制到组成副本中继日志的本地文件中。

    该线程的状态显示为`Slave_IO_running`在[`显示奴隶身份`](show-slave-status.html).

-   **复制SQL applier线程。**复制副本创建一个SQL（applier）线程来读取复制接收器线程写入的中继日志，并执行其中包含的事务。

    每个源/副本连接有三个主线程。具有多个副本的源为每个当前连接的副本创建一个二进制日志转储线程，每个副本都有自己的复制接收器和应用程序线程。

    副本使用两个线程从源中分离读取更新，并将其执行为独立的任务。因此，如果应用事务的过程很慢，那么读取事务的任务就不会慢下来。例如，如果副本服务器已经有一段时间没有运行了，那么当副本启动时，它的接收方线程可以从源中快速获取所有二进制日志内容，即使应用程序线程远远落后。如果复制副本在SQL线程执行所有获取的语句之前停止，那么接收方线程至少已经获取了所有内容，以便在复制副本的中继日志中本地存储事务的安全副本，以便在下次复制副本启动时执行。

    通过设置系统变量，可以为副本上的任务启用进一步的并行化[`复制并行工作人员`](replication-options-replica.html#sysvar_replica_parallel_workers)（来自MySQL 8.0.26）或[`奴隶工人`](replication-options-replica.html#sysvar_slave_parallel_workers)（MySQL 8.0.26之前）设置为大于0的值（默认值）。设置此系统变量后，复制副本将创建指定数量的工作线程来应用事务，并创建一个协调线程来管理事务。如果使用多个复制通道，则每个通道都有此数量的线程。复制品[`复制并行工作人员`](replication-options-replica.html#sysvar_replica_parallel_workers)或[`奴隶工人`](replication-options-replica.html#sysvar_slave_parallel_workers)设置为大于0的值称为多线程副本。通过此设置，可以重试失败的事务。

笔记

NDB Cluster当前不支持多线程副本，它会自动忽略此变量的设置。看见[第23.7.3节，“NDB群集复制中的已知问题”](mysql-cluster-replication-issues.html)了解更多信息。
