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 的线程。

相关推荐
咖啡Beans29 分钟前
6分钟慢速搭建MySQL服务器
mysql
花月C11 小时前
高效查找数据的数据结构—MySQL 索引
数据结构·数据库·mysql
PiscesCanon12 小时前
达梦开启awr功能报错:[-7160]:Object [DBMS_WORKLOAD_REPOSITORY_DATA_LOW] is invalid
数据库·mysql
冻咸鱼13 小时前
数据库操作
数据库·mysql·数据库操作
duqiao_wang13 小时前
Mysql数据库系统库数据恢复
数据库·mysql
计算机学姐14 小时前
基于微信小程序的垃圾分类管理系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
Albert Edison16 小时前
【MySQL】数据类型
数据库·mysql·adb·oracle
遇见火星16 小时前
MYSQL-物理备份(xtrabackup)使用指南
数据库·mysql·adb
huihuihuanhuan.xin17 小时前
后端八股之mysql
数据库·mysql
洋不写bug17 小时前
数据库数据类型,数据值类型,字符串类型,日期类型详解
数据库·mysql