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

相关推荐
黑色的白兔No126 分钟前
deepin 25安装mysql
数据库·mysql·debian
程序员清风1 小时前
Python 操作 MySQL、Redis 与消息队列的完整实践
redis·python·mysql
风哥2号2 小时前
数据库教程FGMT28‑Windows‑MySQL5.7‑8.0‑8.4-9.7安装配置
数据库·mysql
toooooop811 小时前
MySQL source导入实战:踩坑记,phpMyAdmin 502、source导入巨慢问题解决
mysql
hasty13 小时前
Origin 校验不是身份认证:MySQL MCP Server 漏洞给 AI 平台的警告
数据库·mysql·安全
JavaPub-rodert16 小时前
Docker 安装 MySQL 完整教程:从零部署数据库,到生产环境持久化配置
数据库·mysql·docker
隔窗听雨眠16 小时前
MySQL整库迁移至KaiwuDB完全指南:从数据类型映射到生产切换的系统性实践
数据库·mysql
2301_322414280417 小时前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
YIAN21 小时前
手撸社区后端:一套可落地的用户 - 文章 - 互动体系 MySQL 表设计与优化思路
后端·mysql
码农学院1 天前
零售电商GEO踩坑复盘:把 MySQL 商品库自动映射成 Product Schema 的完整方案
人工智能·mysql·零售·geo