MySQL主从复制通过Binlog进行数据传输,主库写入数据,生成Binlog,通过dump线程将Binlog发送给从库,从库IO线程接收Binlog并写入自己的relay log,SQL线程应用relay log里的事务。本文结合MySQL源码,分析SQL线程的主要处理过程。
MySQL源码版本:5.7.19
原文地址:
https://mytecdb.com/blogDetail.php?id=90
1. SQL线程启动
MySQL从库在执行start slave命令时,在MySQL内部依次调用下面的函数来启动IO线程和SQL线程。
- mysql_execute_command(),sql/sql_parse.cc
- start_slave_cmd(),sql/rpl_slave.cc
- start_slave(),sql/rpl_slave.cc
- start_slave_threads(),sql/rpl_slave.cc
- start_slave_thread(),sql/rpl_slave.cc
其中SQL线程在 start_slave_thread() 函数中被创建。
start_slave_threads 函数在另外一个地方也会被调用,init_slave()函数,这个函数是在MySQL启动时调用,如果没有指定skip-slave-start,主从复制随着MySQL启动而自动启动。