面试题答案
一键面试1. 关键线程
- 主库(Master):
- Binlog Dump 线程:当从库连接主库时,主库会为每个连接的从库创建一个 Binlog Dump 线程。该线程负责读取主库的二进制日志(Binlog),并将其发送给从库。
- 从库(Slave):
- I/O 线程:负责与主库建立连接,向主库发送请求,请求获取主库的二进制日志。从主库的 Binlog Dump 线程接收二进制日志,并将其写入到从库的中继日志(Relay Log)中。
- SQL 线程:从库的 SQL 线程负责读取中继日志中的事件,并按照顺序在从库上执行这些事件,从而使从库的数据与主库保持一致。
2. 关键日志
- 二进制日志(Binlog):
- 记录内容:主库上所有修改数据的操作都会记录到二进制日志中,如
INSERT
、UPDATE
、DELETE
等语句,以及一些可能会影响数据的 DDL 语句(如CREATE TABLE
、ALTER TABLE
等)。 - 作用:用于主从复制时主库向从库传输数据修改信息,同时也用于数据库的恢复(如基于时间点恢复 PITR)。
- 记录内容:主库上所有修改数据的操作都会记录到二进制日志中,如
- 中继日志(Relay Log):
- 记录内容:从库的 I/O 线程从主库获取的二进制日志内容会被写入中继日志。它包含了主库上数据修改的事件记录。
- 作用:作为从库 SQL 线程执行数据同步的数据源,SQL 线程按顺序读取中继日志并执行其中的事件,使从库数据与主库同步。
3. 数据同步具体流程
- 配置主从关系:
- 在主库配置文件(如
my.cnf
)中开启二进制日志功能,设置server - id
(一个唯一的标识,整个复制拓扑中每个节点的server - id
都不同)等相关参数。 - 在从库配置文件中同样设置唯一的
server - id
等参数。然后在从库上使用CHANGE MASTER TO
语句指定主库的地址、端口、复制用户及密码,以及主库二进制日志文件名和位置(这些信息可通过在主库执行SHOW MASTER STATUS
获得)。
- 在主库配置文件(如
- 建立连接:
- 从库启动 I/O 线程,该线程根据配置连接到主库。主库为这个连接创建一个 Binlog Dump 线程。
- 主库发送 Binlog:
- 主库的 Binlog Dump 线程开始读取主库的二进制日志,并将其发送给从库的 I/O 线程。
- 从库接收并写入 Relay Log:
- 从库的 I/O 线程接收主库发送的二进制日志内容,并将其写入到中继日志中。同时,I/O 线程会记录当前读取到主库二进制日志的位置(Master_Log_File 和 Read_Master_Log_Pos),这些信息记录在从库的
relay - log.info
文件中。
- 从库的 I/O 线程接收主库发送的二进制日志内容,并将其写入到中继日志中。同时,I/O 线程会记录当前读取到主库二进制日志的位置(Master_Log_File 和 Read_Master_Log_Pos),这些信息记录在从库的
- 从库执行 Relay Log:
- 从库的 SQL 线程读取中继日志中的事件,并在从库上按顺序执行这些事件。SQL 线程也会记录自己执行到中继日志的位置(Relay_Log_File 和 Relay_Log_Pos),这些信息记录在从库的
relay - log.info
文件中。通过不断重复上述步骤,主库的数据修改会持续同步到从库,保持主从数据的一致性。
- 从库的 SQL 线程读取中继日志中的事件,并在从库上按顺序执行这些事件。SQL 线程也会记录自己执行到中继日志的位置(Relay_Log_File 和 Relay_Log_Pos),这些信息记录在从库的