MySQL 主从复制(日志核心)完整教程

下面为你整理了MySQL 主从复制(日志核心)完整教程 ,聚焦 binlog(主库日志)、relay log(从库日志)的配置与管理,适配 MySQL 5.7/8.0 版本,新手可直接跟着操作。

文章目录

      • 一、核心日志概念(先理解再配置)
      • 二、环境准备(必做)
      • [三、主库配置(核心:开启 binlog)](#三、主库配置(核心:开启 binlog))
        • [步骤 1:修改主库配置文件](#步骤 1:修改主库配置文件)
        • [步骤 2:重启主库 MySQL 生效](#步骤 2:重启主库 MySQL 生效)
        • [步骤 3:主库创建复制专用用户](#步骤 3:主库创建复制专用用户)
        • [步骤 4:查看主库 binlog 状态(关键!)](#步骤 4:查看主库 binlog 状态(关键!))
      • [四、从库配置(核心:同步主库 binlog 到 relay log)](#四、从库配置(核心:同步主库 binlog 到 relay log))
        • [步骤 1:修改从库配置文件](#步骤 1:修改从库配置文件)
        • [步骤 2:重启从库 MySQL](#步骤 2:重启从库 MySQL)
        • [步骤 3:配置从库连接主库(核心命令)](#步骤 3:配置从库连接主库(核心命令))
      • 五、验证主从复制(日志同步状态)
        • [1. 从库查看复制状态(核心命令)](#1. 从库查看复制状态(核心命令))
        • [2. 日志同步测试](#2. 日志同步测试)
      • 六、日志管理(日常维护)
        • [1. 查看 binlog(主库)](#1. 查看 binlog(主库))
        • [2. 查看 relay log(从库)](#2. 查看 relay log(从库))
        • [3. 清理过期日志(避免磁盘满)](#3. 清理过期日志(避免磁盘满))
      • 七、常见日志相关故障排查

一、核心日志概念(先理解再配置)

主从复制的核心是日志同步,先搞懂 2 个关键日志:

日志类型 作用 存储位置(默认)
二进制日志(binlog) 主库记录所有数据修改操作(增删改、DDL),是主从同步的数据源 /var/lib/mysql/mysql-bin.*
中继日志(relay log) 从库读取主库 binlog 后,本地保存的日志文件,从库执行该日志完成数据同步 /var/lib/mysql/relay-log.*

二、环境准备(必做)

角色 IP MySQL版本 核心要求
主库(Master) 192.168.1.10 5.7/8.0 开启 binlog、唯一 server-id
从库(Slave) 192.168.1.11 5.7/8.0 唯一 server-id、开启 relay log

前置条件

  1. 主从服务器网络互通(ping 通、3306 端口开放);
  2. 主从 MySQL 版本尽量一致;
  3. 主从服务器时间同步(ntpdate ntp.aliyun.com)。

三、主库配置(核心:开启 binlog)

步骤 1:修改主库配置文件

编辑 MySQL 配置文件(不同系统路径不同):

bash 复制代码
# CentOS/RHEL:/etc/my.cnf
# Ubuntu/Debian:/etc/mysql/mysql.conf.d/mysqld.cnf
sudo nano /etc/my.cnf

添加/修改以下配置(重点开启 binlog):

ini 复制代码
[mysqld]
# 1. 必须:唯一server-id(主从不能重复,建议用IP最后一段)
server-id = 10
# 2. 必须:开启binlog,指定日志前缀
log-bin = mysql-bin
# 3. 可选:binlog格式(推荐ROW,最安全)
binlog_format = ROW
# 4. 可选:同步的数据库(仅同步db_test,不写则同步所有)
# binlog-do-db = db_test
# 5. 可选:忽略同步的数据库
# binlog-ignore-db = mysql
# 6. 可选:binlog过期时间(自动清理,避免日志占满磁盘)
expire_logs_days = 7
步骤 2:重启主库 MySQL 生效
bash 复制代码
# CentOS 7+
sudo systemctl restart mysqld
# Ubuntu/Debian
sudo systemctl restart mysql
步骤 3:主库创建复制专用用户

登录主库 MySQL,创建仅用于主从复制的用户(最小权限原则):

sql 复制代码
-- 登录主库
mysql -uroot -p

-- 创建用户(MySQL 5.7/8.0 通用,指定从库IP访问)
CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'Repl@123456';

-- 授权复制权限(仅需REPLICATION SLAVE)
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';

-- MySQL 8.0 需刷新权限(5.7可选)
FLUSH PRIVILEGES;
步骤 4:查看主库 binlog 状态(关键!)
sql 复制代码
-- 主库执行,记录2个值:File、Position
SHOW MASTER STATUS;

输出示例(后续从库配置需要这两个值):

复制代码
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 | db_test      | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+

四、从库配置(核心:同步主库 binlog 到 relay log)

步骤 1:修改从库配置文件
bash 复制代码
sudo nano /etc/my.cnf  # 同主库路径规则

添加/修改配置:

ini 复制代码
[mysqld]
# 1. 必须:唯一server-id(不能和主库重复)
server-id = 11
# 2. 可选(默认开启):指定relay log前缀
relay-log = mysql-relay-bin
# 3. 必须:关闭从库binlog(如果从库不做其他从库的主库)
# log-bin = mysql-bin  # 注释掉或删除
# 4. 可选:从库只读(避免直接修改从库数据)
read_only = 1
# 5. 可选:超级用户也只读(MySQL 5.7+)
super_read_only = 1
步骤 2:重启从库 MySQL
bash 复制代码
sudo systemctl restart mysqld  # 同主库命令
步骤 3:配置从库连接主库(核心命令)

登录从库 MySQL,执行以下命令(替换括号内的主库信息):

sql 复制代码
-- 登录从库
mysql -uroot -p

-- 停止从库复制(首次配置先停止)
STOP SLAVE;

-- 配置主从连接(关键!替换以下参数)
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',  -- 主库IP
MASTER_USER='repl',          -- 主库创建的复制用户
MASTER_PASSWORD='Repl@123456',  -- 复制用户密码
MASTER_LOG_FILE='mysql-bin.000001',  -- 主库SHOW MASTER STATUS的File值
MASTER_LOG_POS=154;  -- 主库SHOW MASTER STATUS的Position值

-- 启动从库复制
START SLAVE;

MySQL 8.0 注意 :如果主库默认认证插件是 caching_sha2_password,需在 CHANGE MASTER TO 后追加:

sql 复制代码
MASTER_AUTH_PLUGIN='mysql_native_password';

五、验证主从复制(日志同步状态)

1. 从库查看复制状态(核心命令)
sql 复制代码
SHOW SLAVE STATUS\G;

重点看 2 个参数(均为 Yes 则正常):

  • Slave_IO_Running: Yes → 从库 IO 线程正常(读取主库 binlog 到 relay log)
  • Slave_SQL_Running: Yes → 从库 SQL 线程正常(执行 relay log 中的操作)
2. 日志同步测试
  • 主库创建数据库/表/插入数据:

    sql 复制代码
    CREATE DATABASE test_db;
    USE test_db;
    CREATE TABLE t1 (id INT);
    INSERT INTO t1 VALUES (1);
  • 从库查看是否同步:

    sql 复制代码
    SHOW DATABASES;  -- 能看到test_db
    USE test_db;
    SELECT * FROM t1;  -- 能查到id=1

六、日志管理(日常维护)

1. 查看 binlog(主库)
sql 复制代码
-- 查看所有binlog文件
SHOW BINARY LOGS;

-- 查看binlog内容(指定文件)
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
2. 查看 relay log(从库)
sql 复制代码
-- 查看relay log文件
SHOW RELAYLOG EVENTS IN 'mysql-relay-bin.000001';
3. 清理过期日志(避免磁盘满)
sql 复制代码
-- 主库清理binlog(保留7天)
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

-- 从库清理relay log
PURGE RELAY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

七、常见日志相关故障排查

故障现象 原因及解决方案
Slave_IO_Running: No 1. 主库IP/端口/账号密码错误; 2. 主库binlog文件/位置错误; 3. 主从server-id重复; 4. 主库3306端口未开放。
Slave_SQL_Running: No 1. 从库数据与主库不一致; 2. relay log 损坏(删除损坏的relay log,重新同步); 3. 从库执行了主库没有的操作。
binlog 不生成 主库未开启 log-binserver-id 未设置;重启主库后检查。
relay log 持续增长 从库 SQL 线程卡住,先修复 Slave_SQL_Running,再清理过期relay log。

相关推荐
liqianpin11 天前
完美解决phpstudy安装后mysql无法启动
数据库·mysql
小Tomkk1 天前
化繁为简:Access 与 SQL 创新指南(第四篇)
数据库·sql
cyber_两只龙宝1 天前
【MySQL】MySQL主从复制架构
linux·运维·数据库·mysql·云原生·架构
D.不吃西红柿1 天前
【无标题】
数据库·database·ai编程·数据库设计
Dylan~~~1 天前
PostgreSQL 数据库性能问题定位完全指南
数据库·postgresql
原来是猿1 天前
MySQL数据库基础
数据库
江不清丶1 天前
Text-to-SQL实战:从自然语言到数据库查询的智能数据分析Agent设计
数据库·sql·ai·数据分析
初次攀爬者1 天前
Redis与数据库的数据一致性方案解析
数据库·redis·分布式
xiaoye37081 天前
docker 迁移mysql容器
mysql·docker
橘颂TA1 天前
【MySQL】内置函数
数据库·mysql