MySQL 主从同步配置及操作步骤

主从同步是一种常见的数据复制技术,它通过将主库的数据同步到一个或多个从数据库中来保证数据的一致性。从库通过读取主库的 binlog 文件来获取更新并进行同步。

主从复制的方式有三种:

  1. 异步复制:不需要从库确认,主库提交数据后立即返回。
  2. 同步复制:所有从库都必须确认接收到数据后,主库才能提交事务。
  3. 半同步复制 :至少一个从库确认接收到数据后,主库才能提交事务,MySQL5.7 之后才能启用。

当主库提交事务时,它会将变更记录写入 binlog 文件。一个 dump 线程负责监听这些 binlog 文件的变更,当文件发生更新时,dump 线程会推送更新事件给从库。从库接收到这些更新事件后,通过 I/O 线程将其写入中继日志(relay log),然后通过 SQL 线程执行这些更新操作。

配置主从同步步骤

主库配置步骤

  1. 启用 binlog 日志

    在主库的配置文件中设置以下参数,开启 binlog:

    sql 复制代码
    server-id = 1  # 主库的唯一 ID
    log-bin = mysql-bin  # 启用二进制日志
  2. 创建复制用户

    在主库上创建一个专用于复制的用户,并授予 REPLICATION SLAVE 权限:

    sql 复制代码
    CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
    FLUSH PRIVILEGES;
  3. 记录主库状态

    获取主库的 binlog 文件名和位置。这些信息会在配置从库时使用:

    sql 复制代码
    mysql> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 |      843 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

从库配置步骤

  1. 配置从库

    在从库的配置文件中启用中继日志,并设置从库为只读:

    sql 复制代码
    server-id = 2  # 从库的唯一 ID,必须与主库不同
    relay-log = mysql-relay-bin  # 启用中继日志
    log-bin = mysql-bin  # 启用二进制日志(可选,若从库也需要提供复制)
    read-only = 1  # 设置为只读
  2. 配置从库信息

    进入从库并设置主库的信息,启动复制进程:

    sql 复制代码
    mysql> CHANGE MASTER TO MASTER_HOST = '主库的IP', MASTER_PORT=主库的端口, MASTER_USER = 'replica_user', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 843;
    Query OK, 0 rows affected, 9 warnings (0.05 sec)
    
    mysql> START SLAVE;
    Query OK, 0 rows affected, 1 warning (0.02 sec)l
  3. 检查状态

    使用以下命令检查从库的同步状态。若 Slave_IO_RunningSlave_SQL_Running 都显示为 Yes,表示复制配置正常:

    sql 复制代码
    mysql> SHOW SLAVE STATUS\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for source to send event
                      Master_Host: 主库IP
                      Master_User: replica_user
                      Master_Port: 主库端口
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000003
              Read_Master_Log_Pos: 843
                   Relay_Log_File: mysql-relay-bin.000002
                    Relay_Log_Pos: 326
            Relay_Master_Log_File: mysql-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                ......

    通过以上这些配置步骤,主从复制就完成了。

  4. 验证同步是否成功

    可以在主库插入一些数据,看看从库中是否正常复制数据。

dump线程和从库线程

使用 show processlist 命令查看主库和从库的线程信息

主库信息

sql 复制代码
mysql> show processlist;
+----+-----------------+------------------+-------+-------------+------+-----------------------------------------------------------------+------------------+
| Id | User            | Host             | db    | Command     | Time | State                                                           | Info             |
+----+-----------------+------------------+-------+-------------+------+-----------------------------------------------------------------+------------------+
|  5 | event_scheduler | localhost        | NULL  | Daemon      | 1034 | Waiting on empty queue                                          | NULL             |
|  8 | root            | localhost        | test1 | Query       |    0 | init                                                            | show processlist |
|  9 | replica_user    | 172.25.0.1:62302 | NULL  | Binlog Dump |  619 | Source has sent all binlog to replica; waiting for more updates | NULL             |
| 10 | replica_user    | 172.25.0.1:62306 | NULL  | Binlog Dump |   61 | Source has sent all binlog to replica; waiting for more updates | NULL             |
+----+-----------------+------------------+-------+-------------+------+-----------------------------------------------------------------+------------------+
4 rows in set (0.00 sec)

从库信息

sql 复制代码
mysql> show processlist;
+----+-----------------+-----------------+-------+---------+------+----------------------------------------------------------+------------------+
| Id | User            | Host            | db    | Command | Time | State                                                    | Info             |
+----+-----------------+-----------------+-------+---------+------+----------------------------------------------------------+------------------+
|  5 | event_scheduler | localhost       | NULL  | Daemon  | 2337 | Waiting on empty queue                                   | NULL             |
|  8 | root            | localhost       | test1 | Query   |    0 | init                                                     | show processlist |
|  9 | system user     | connecting host | NULL  | Connect | 2144 | Waiting for source to send event                         | NULL             |
| 10 | system user     |                 | NULL  | Query   | 1529 | Replica has read all relay log; waiting for more updates | NULL             |
| 11 | system user     |                 | NULL  | Query   | 1529 | Waiting for an event from Coordinator                    | NULL             |
| 12 | system user     |                 | NULL  | Connect | 2144 | Waiting for an event from Coordinator                    | NULL             |
| 13 | system user     |                 | NULL  | Connect | 2144 | Waiting for an event from Coordinator                    | NULL             |
| 14 | system user     |                 | NULL  | Connect | 2144 | Waiting for an event from Coordinator                    | NULL             |
+----+-----------------+-----------------+-------+---------+------+----------------------------------------------------------+------------------+
8 rows in set (0.00 sec)

dump 线程 是在从库执行 START SLAVE 命令后,成功与主库建立通信并开始拉取 binlog 数据的线程。

从库中 system user 线程就是拉取到 binlog 信息,然后执行 SQL 的线程。

相关推荐
隔壁阿布都3 小时前
MySQL 间隙锁死锁问题处理
数据库·mysql
ywl4708120875 小时前
mysql 锁定读和非锁定读
数据库·mysql
流浪0016 小时前
MySQL数据库基础篇(三):MySQL 数据库库级操作全解:创建、字符集、管理与备份恢复实战
数据库·mysql
钝挫力PROGRAMER6 小时前
MySQL 数据截断错误 #22001:原因分析与解决方案
数据库·mysql
万亿少女的梦1687 小时前
基于Spring Boot与MySQL的乡镇群众服务系统设计与实现
java·spring boot·mysql·权限管理·前后端分离
数据库小学妹10 小时前
MySQL做报表太慢?引入ClickHouse列式存储,同一个查询快240倍
mysql·clickhouse·列式存储·分析型数据库·向量化执行·olap数据库·mysql对比
—Miss. Z—11 小时前
计算机二级MySQL——基本操作题
数据库·mysql·oracle
️学习的小王11 小时前
Python + MySQL 学生信息管理系统实战教程
android·python·mysql
eddietao11 小时前
MySQL+SQLServer数据库-笔记
数据库·笔记·mysql
宠友信息12 小时前
消息撤回与已读状态如何在即时通讯源码中统一管理
java·spring boot·websocket·mysql·uni-app