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

相关推荐
IT成长日记7 小时前
【MySQL基础】 JSON函数入门
mysql·json·json函数
天狼12227 小时前
第1章-3 MySQL的逻辑架构
mysql·逻辑架构
码觉客9 小时前
MySQL 5.7+ for Windows 解压缩版配置安装说明
mysql
THRUSTER1111110 小时前
MySQL-- 函数(单行函数):数值函数, 字符串函数
数据库·mysql·函数·navicat·单行函数
橙序研工坊10 小时前
MySQL的进阶语法7(索引-B+Tree 、Hash、聚集索引 、二级索引(回表查询)、索引的使用及设计原则
数据库·sql·mysql
Bonnie_121510 小时前
07-MySQL-事务的隔离级别以及底层原理
数据库·mysql
王强你强11 小时前
MySQL 高级查询:JOIN、子查询、窗口函数
数据库·mysql
草巾冒小子11 小时前
brew 安装mysql,启动,停止,重启
数据库·mysql
振鹏Dong14 小时前
MySQL 事务底层和高可用原理
数据库·mysql
·云扬·14 小时前
深度剖析 MySQL 与 Redis 缓存一致性:理论、方案与实战
redis·mysql·缓存