已有数据的两个mysql8数据库,如何配置主从服务,且指定同步的数据库

MySQL 8.0 的主从复制(Replication)配置相比旧版本有一些重要变化,主要体现在:

  • 默认使用 基于 GTID 的复制(推荐)
  • 弃用了 MASTER_* 参数,改用 SOURCE_*
  • 更强调 安全性(如 SSL、密码存储)
  • 支持 并行复制多源复制 等高级特性

下面我将 详细、完整、安全地 说明如何在 MySQL 8.0 中配置 一主一从 的经典异步复制。


🧩 环境准备

角色主机 IPMySQL 版本
主库(Source)192.168.1.100MySQL 8.0+
从库(Replica)192.168.1.101MySQL 8.0+

✅ 确保两台服务器网络互通,防火墙开放 3306 端口。


第一步:配置主库(Source)

1. 修改主库配置文件(/etc/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
# 唯一服务器 ID(必须不同)
server-id = 1

# 启用二进制日志(必须)
log-bin = mysql-bin

# 可选:指定 binlog 格式(推荐 ROW)
binlog-format = ROW

# 启用 GTID(推荐,简化故障切换)
gtid_mode = ON
enforce_gtid_consistency = ON

# 可选:设置 binlog 过期时间(自动清理)
expire_logs_days = 7

🔁 修改后重启 MySQL:

sudo systemctl restart mysql

2. 创建复制专用用户

-- 登录主库
mysql -u root -p

-- 创建用户(注意:MySQL 8.0 默认认证插件是 caching_sha2_password)
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'StrongPass!2025';

-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

💡 建议限制 IP(如 'repl_user'@'192.168.1.101')以提高安全性。


第二步:配置从库(Replica)

1. 修改从库配置文件

[mysqld]
server-id = 2          # 必须与主库不同!
read_only = ON         # 防止误写(可选但推荐)
relay-log = relay-bin  # 中继日志(可选)

# 如果使用 GTID,也需开启
gtid_mode = ON
enforce_gtid_consistency = ON

🔁 重启从库 MySQL:

sudo systemctl restart mysql

第三步:启动复制(关键步骤)

方式 A:推荐 —— 使用 GTID 自动定位(无需手动查 binlog 文件和位置)

在从库执行:

-- 停止已有复制(首次配置可跳过)
STOP REPLICA;

-- 配置复制源(不指定 binlog 文件和位置!)
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='192.168.1.100',
  SOURCE_USER='repl_user',
  SOURCE_PASSWORD='StrongPass!2025',
  SOURCE_SSL=0;  -- 若未配 SSL,设为 0;若已配 SSL,设为 1

-- 启动复制
START REPLICA;

✅ 因为启用了 GTID,MySQL 会自动找到正确的同步点!


方式 B:传统方式(基于 binlog 文件 + Position)

仅在未启用 GTID 时使用(不推荐)

在主库查看当前 binlog 位置:

SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     1567 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

在从库配置:

STOP REPLICA;

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='192.168.1.100',
  SOURCE_USER='repl_user',
  SOURCE_PASSWORD='StrongPass!2025',
  SOURCE_LOG_FILE='mysql-bin.000003',
  SOURCE_LOG_POS=1567;

START REPLICA;

第四步:验证复制状态

从库 执行:

SHOW REPLICA STATUS\G

重点关注以下字段:

字段正常值
Replica_IO_RunningYes
Replica_SQL_RunningYes
Seconds_Behind_Source0(表示无延迟)
Last_IO_Error / Last_SQL_Error应为空

⚠️ 如果出现错误,检查网络、用户权限、防火墙、SSL 设置等。


第五步(可选):提升安全性

1. 启用 SSL 加密(避免明文传输密码)

在主库生成 SSL 证书(或使用已有 CA):

-- 查看是否支持 SSL
SHOW VARIABLES LIKE '%ssl%';

若已配置 SSL,在从库连接时加上:

CHANGE REPLICATION SOURCE TO
  ...
  SOURCE_SSL=1,
  SOURCE_SSL_CA='/path/to/ca.pem',
  SOURCE_SSL_CERT='/path/to/client-cert.pem',
  SOURCE_SSL_KEY='/path/to/client-key.pem';

2. 避免在配置中存储密码

使用 START REPLICA 动态传参(临时有效):

STOP REPLICA;

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='192.168.1.100',
  SOURCE_USER='repl_user',
  SOURCE_SSL=1;

START REPLICA USER='repl_user' IDENTIFIED BY 'StrongPass!2025';

✅ 这样密码不会写入元数据表(如 mysql.slave_master_info


常见问题排查

问题解决方法
Access denied for user检查用户名、密码、IP 白名单、权限
Could not find first log file name in binary log index file主库 binlog 被清理,需重新做全量备份
复制延迟大检查网络、主库写入压力、从库性能
GTID_MODE mismatch主从必须同时开启或关闭 GTID

✅ 最佳实践总结

  1. 始终使用 GTID 模式gtid_mode=ON
  2. 使用 SOURCE_* 语法(MySQL 8.0+ 标准)
  3. 创建专用复制用户,最小权限原则
  4. 启用 SSL/TLS 防止中间人攻击
  5. 避免在 CHANGE 命令中写明文密码
  6. 定期监控 SHOW REPLICA STATUS

📚 官方文档参考


如有具体报错信息,可提供 SHOW REPLICA STATUS\G 输出,我可以帮你精准诊断。

Comments

No comments yet. Why don’t you start the discussion?

发表回复