初次部署主从复制猜的坑

5 阅读2分钟

MySQL 主从复制配置完整记录(含踩坑总结)


📌 一、目标

搭建 MySQL 主从复制,用于:

  • 数据备份
  • 容灾恢复
  • 可扩展读写分离

🧱 二、主库(Master)配置

1️⃣ 修改配置文件(my.ini / my.cnf)

[mysqld] 节点下添加(⚠️必须顶格写):

# 主库唯一标识(必须唯一)
server-id=1

# 开启二进制日志(主从复制核心)
log-bin=mysql-bin

# binlog格式(推荐ROW)
binlog-format=ROW

# 指定需要同步的数据库(可选)
binlog-do-db=test_db

# 忽略系统库(必须)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys

# binlog保留时间(天)
expire_logs_days=7

# 保证数据一致性
sync-binlog=1

2️⃣ 重启 MySQL

systemctl restart mysqld

3️⃣ 创建从库账号(重要)

CREATE USER 'slave_user'@'%' IDENTIFIED BY 'Slave@123456';

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';

FLUSH PRIVILEGES;

⚠️ 坑点 1:认证插件问题(云服务器常见)

检查:

SELECT user, host, plugin FROM mysql.user WHERE user = 'slave_user';

如果是:

caching_sha2_password

执行:

ALTER USER 'slave_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Slave@123456';
FLUSH PRIVILEGES;

4️⃣ 获取主库位点(关键)

SHOW MASTER STATUS;

记录:

File: mysql-bin.000003
Position: 128576

🧱 三、从库(Replica)配置

1️⃣ 修改配置文件

[mysqld]

server-id=2

relay-log=relay-log-bin

2️⃣ 重启 MySQL

systemctl restart mysqld

⚠️ 坑点 2:提前创建数据库

必须保证:

  • 数据库存在
  • 表结构存在

否则报错:

ERROR 1049 (Unknown database)

🔗 四、建立主从关系

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='111.228.49.96',
  SOURCE_USER='slave_user',
  SOURCE_PASSWORD='Slave@123456',
  SOURCE_LOG_FILE='mysql-bin.000003',
  SOURCE_LOG_POS=128576;

⚠️ 坑点 3:位点必须正确

必须来自:

SHOW MASTER STATUS;

否则报错:

Could not find first log file

▶️ 五、启动复制

START REPLICA;

📊 查看状态

SHOW REPLICA STATUS\G;

✅ 成功标志:

Replica_IO_Running: Yes
Replica_SQL_Running: Yes

🛠 六、常用命令

START REPLICA;
STOP REPLICA;
SHOW REPLICA STATUS\G;
RESET REPLICA ALL;

🚨 七、常见坑总结


❌ 坑 1:binlog 不存在

报错:

Could not find first log file

解决:

SHOW MASTER STATUS;

❌ 坑 2:权限问题

报错:

Access denied for user

解决:

CREATE USER 'slave_user'@'%';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';

❌ 坑 3:认证插件问题

原因:

caching_sha2_password

解决:

ALTER USER ... mysql_native_password

❌ 坑 4:数据库不存在

报错:

ERROR 1049 (Unknown database)

解决:

CREATE DATABASE xxx;

❌ 坑 5:未做全量同步

问题:

  • 表不存在
  • 数据错乱

建议:

  • 先导出主库
  • 再导入从库

⏱ 八、同步机制说明

MySQL 主从复制是:

实时同步(非定时)

查看延迟:

SHOW REPLICA STATUS\G;

关注:

Seconds_Behind_Source

⚠️ 九、重要提醒

主从复制 ≠ 安全备份


❗危险操作会同步:

DROP DATABASE xxx;
DELETE FROM table;

🛡 十、推荐生产方案

1️⃣ 主从复制(实时)

2️⃣ 延迟复制(防误删)

CHANGE REPLICATION SOURCE TO SOURCE_DELAY = 600;

3️⃣ 定时备份

0 3 * * * mysqldump -uroot -p --all-databases > backup.sql

🎯 总结

  • 主从复制是实时机制

  • 核心依赖 binlog

  • 最大坑:

    • 权限
    • 位点
    • 数据不一致
  • 最佳实践:

    主从复制 + 延迟复制 + 定时备份