Bootstrap

MySQL主从复制保姆级指南(命令详解+实操示例)

MySQL主从复制保姆级指南(命令详解+实操示例)

以下内容覆盖主从复制原理、核心命令、排错技巧及实操案例,适合零基础快速掌握

一、主从复制核心原理

  1. 核心流程

    • 主库(Master):记录所有数据变更到二进制日志(binlog),包含增删改操作

      从库(Slave):

      • I/O线程:拉取主库的binlog并写入中继日志(relay log)
      • SQL线程:解析relay log并执行SQL,保持主从数据一致
    • 异步复制:主库提交事务后即响应客户端,不等待从库同步(默认模式)

  2. 三种模式对比

    模式数据一致性性能适用场景
    异步高并发写场景(默认)
    半同步强一致性要求较高
    全同步金融级数据一致性

二、主从配置全流程

1. 主库配置

步骤1:修改配置文件(my.cnf)

[mysqld]
server-id = 1                # 唯一标识(主从不同)
log-bin = /data/mysql-bin    # 启用binlog
binlog-format = ROW          # 推荐ROW模式保证一致性
binlog-do-db = mydb         # 同步指定库(可选)

重启MySQL生效

systemctl restart mysqld     # CentOS/RHEL

步骤2:创建复制用户

-- 创建用户并授权
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

步骤3:查看主库状态

SHOW MASTER STATUS;

输出示例

 +------------------+----------+--------------+------------------+  
| File             | Position | Binlog_Do_DB | Executed_Gtid_Set |  
+------------------+----------+--------------+------------------+  
| mysql-bin.000003 |     154  | mydb         |                   |  
+------------------+----------+--------------+------------------+  

记录关键字段File(日志文件名)和 Position(日志位置)

2. 从库配置

步骤1:修改配置文件(my.cnf)

[mysqld]
server-id = 2                # 唯一标识(与主库不同)
relay-log = /data/relay-bin  # 中继日志路径
read-only = 1                # 从库只读(非强制)

重启MySQL生效

systemctl restart mysqld

步骤2:配置主库连接

-- MySQL 8.0+版本语法
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST = '192.168.1.100',
  SOURCE_USER = 'repl',
  SOURCE_PASSWORD = 'password',
  SOURCE_LOG_FILE = 'mysql-bin.000003',
  SOURCE_LOG_POS = 154;

-- 旧版本语法(兼容)
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.100',
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'password',
  MASTER_LOG_FILE = 'mysql-bin.000003',
  MASTER_LOG_POS = 154;

步骤3:启动复制

SQLSTART REPLICA;    -- 8.0+版本
START SLAVE;       -- 旧版本

步骤4:检查同步状态

SQLSHOW REPLICA STATUS\G;  -- 8.0+版本
SHOW SLAVE STATUS\G;    -- 旧版本

关键字段验证

  • Slave_IO_Running: Yes

  • Slave_SQL_Running: Yes

  • Seconds_Behind_Master: 0(无延迟)
    

三、数据初始化与同步

场景1:主库已有数据

# 主库全量备份(含binlog位置)
mysqldump -uroot -p --master-data=2 --single-transaction mydb > mydb.sql

# 从库导入数据
mysql -uroot -p mydb < mydb.sql

参数说明

  • --master-data=2:备份时记录主库的binlog位置
    

四、维护与排错命令

1. 常用维护命令
命令作用示例
STOP REPLICA;停止复制线程STOP SLAVE;(旧版本)
RESET REPLICA ALL;清除主从配置信息RESET SLAVE ALL;
SET GLOBAL sql_slave_skip_counter=1;跳过错误事务主键冲突时使用
2. 常见错误处理
  • 错误1:主键冲突(1062)

    SQL-- 跳过当前错误事务
    STOP SLAVE;
    SET GLOBAL sql_slave_skip_counter=1;
    START SLAVE;
    
  • 错误2:数据丢失(1032)

    • 主库删除数据,从库找不到记录:需手动修复数据或重新同步
  • 错误3:中继日志损坏

    -- 清除中继日志并重新同步
    STOP SLAVE;
    RESET SLAVE;
    CHANGE MASTER TO ...;  -- 重新配置主库信息
    START SLAVE;
    ```[69](@ref)  
    

五、高级技巧与扩展

1. 基于GTID的复制(推荐)
-- 主从库配置中启用GTID
gtid_mode=ON
enforce_gtid_consistency=ON

-- 从库配置
CHANGE MASTER TO MASTER_AUTO_POSITION=1;

优势:自动追踪事务位置,无需手动指定MASTER_LOG_FILEMASTER_LOG_POS

2. 并行复制(减少延迟)
SQL-- 从库启用多线程复制
SET GLOBAL slave_parallel_workers=4;  -- 并行线程数

适用场景:高并发写入导致主从延迟

六、主从切换实战

主库故障时升级从库为主库

  1. 停止从库复制:STOP SLAVE;
  2. 重置主从信息:RESET SLAVE ALL;
  3. 关闭只读模式:SET GLOBAL read_only=0;
  4. 原主库恢复后,反向配置为从库

七、测试验证

操作示例

  1. 主库插入数据:

    INSERT INTO users (name) VALUES ('Alice');
    
  2. 从库查询验证:

    SELECT * FROM users WHERE name='Alice';
    

模式:SET GLOBAL read_only=0;
4. 原主库恢复后,反向配置为从库

七、测试验证

操作示例

  1. 主库插入数据:

    INSERT INTO users (name) VALUES ('Alice');
    
  2. 从库查询验证:

    SELECT * FROM users WHERE name='Alice';
    

预期结果:主从数据完全一致

;