图片.png


MySQL复制功能使用三个线程实现,一个在主服务器上,另一个在从服务器上:

Binlog(二进制日志)转储线程。主站创建一个线程,在从站连接时将二进制日志内容发送给从站。该线程可以在主服务器上的SHOW PROCESSLIST输出中标识为Binlog转储线程。

二进制日志转储线程在主服务器的二进制日志上获取一个锁,用于读取要发送给从服务器的每个事件。一旦事件被读取,即使在事件被发送到从设备之前,锁也被释放。


        从属I / O线程。当从服务器上发出START SLAVE语句时,从服务器创建一个I / O线程,该线程连接到主服务器并要求它发送记录在其二进制日志中的更新。

    

        从I / O线程读取主服务器的Binlog转储线程发送的更新(请参阅上一项),并将它们复制到包含从服务器中继日志的本地文件中。


    此线程的状态在SHOW SLAVE STATUS的输出中显示为Slave_IO_running,或在SHOW STATUS的输出中显示为Slave_running。


    从属SQL线程。从站创建一个SQL线程来读取由从站I / O线程写入的中继日志并执行其中包含的事件。


在前面的描述中,每个主/从连接有三个线程。拥有多个从站的主站为每个当前连接的从站创建一个二进制日志转储线程,并且每个从站都有自己的I / O和SQL线程。


从机使用两个线程将读取更新与主机分离,并将其执行为独立任务。因此,如果语句执行速度较慢,则阅读语句的任务不会减慢。例如,如果从服务器没有运行一段时间,它的I / O线程可以在从服务器启动时快速地从主服务器获取所有二进制日志内容,即使SQL线程远远落后。如果从站在SQL线程执行完所有提取的语句之前停止,那么I / O线程至少会提取所有内容,以便将语句的安全副本本地存储在从站的中继日志中,以备下次执行奴隶开始。


SHOW PROCESSLIST语句提供了一些信息,告诉你在主服务器和从服务器上发生的复制事件


以下示例说明了SHOW PROCESSLIST的输出中三个线程是如何显示的。


在主服务器上,SHOW PROCESSLIST的输出如下所示:

mysql> SHOW PROCESSLIST\G

*************************** 1. row ***************************

Id: 2   #Binlog转储复制线程ID

User: root

Host: localhost:32931

db: NULL

Command: Binlog Dump

Time: 94

State: Has sent all binlog to slave; waiting for binlog to #状态信息表明所有未完成的更新已发送到从站,并且主站正在等待更多更新发生

be updated

Info: NULL


这里,线程2是一个Binlog转储复制线程,它为连接的从服务器提供服务。 状态信息表明所有未完成的更新已发送到从站,并且主站正在等待更多更新发生。 如果在主服务器上看不到Binlog Dump线程,则表示复制未运行; 也就是说,目前没有奴隶连接。


#——————————————————————————————————————————————————————————————————————————————————————————————————————


在从属服务器上,SHOW PROCESSLIST的输出如下所示:

mysql> SHOW PROCESSLIST\G

*************************** 1. row ***************************

Id: 10 #线程10是与主服务器通信的I/O线程

User: system user

Host:

db: NULL

Command: Connect

Time: 11

State: Waiting for master to send event

Info: NULL

*************************** 2. row ***************************

Id: 11 #线程11是处理存储在中继日志中的更新的SQL线程

User: system user

Host:

db: NULL

Command: Connect

Time: 11

State: Has read all relay log; waiting for the slave I/O

thread to update it

Info: NULL


状态信息指示线程10是与主服务器通信的I / O线程,线程11是处理存储在中继日志中的更新的SQL线程。 当SHOW PROCESSLIST运行时,两个线程都处于空闲状态,等待进一步更新。