单机多实例主从复制在MySQL 5.7下可行,但必须确保每个实例server-id唯一、log-bin开启、datadir隔离、端口不冲突,且my.cnf需显式配置port/socket/datadir/pid-file/log-error等参数,启动必须用--defaults-file指定配置文件,否则CHANGE MASTER TO失败或同步中断。

单机多实例主从复制在 MySQL 5.7 下完全可行,但必须确保每个实例的 server-id 唯一、log-bin 开启、数据目录隔离、端口不冲突——漏掉任一条件,CHANGE MASTER TO 会失败或同步中断。
每个实例的 my.cnf 必须显式配置独立路径与端口
不能复用默认配置,也不能靠启动参数临时覆盖关键路径。常见错误是 datadir 指向非空目录,或 socket 文件被多个实例共用导致连接混乱。
-
port、socket、datadir、pid-file、log-error全部需按实例区分,例如 3307 实例的socket=/tmp/mysql3307.sock -
datadir对应目录必须为空,初始化前用mysqld --initialize-insecure --user=mysql --datadir=/www/server/data/3307/data初始化 - Windows 下注意
basedir和datadir使用正斜杠或双反斜杠,单反斜杠会被识别为转义符
主从角色由 server-id 和 log-bin 决定,不是启动顺序
MySQL 不关心哪个实例先启,只认配置。若从库误开 log-bin 且未设 read_only=1,可能造成写入污染或 GTID 冲突。
- 主库必须启用:
log-bin=mysql-bin+server-id=3307(数字要唯一,不能是 1) - 从库必须禁用写入:
read_only=1(仅限 SUPER 用户可写),并设置不同server-id=3308 - GTID 模式下还需统一开启:
gtid_mode=ON、enforce_gtid_consistency=ON,否则START SLAVE报错ERROR 1786 (HY000)
CHANGE MASTER TO 的参数必须严格匹配主库 show master status 输出
尤其容易忽略的是:主库执行 FLUSH TABLES WITH READ LOCK 后,必须在**同一会话**中立刻执行 SHOW MASTER STATUS,否则 Position 可能漂移;从库配置时若用错 MASTER_LOG_FILE 或 MASTER_LOG_POS,SQL Thread 会卡在 Waiting for master to send event。
- 主库锁表后获取信息示例:
mysql> FLUSH TABLES WITH READ LOCK;<br>mysql> SHOW MASTER STATUS;<br>+------------------+----------+--------------+------------------+-------------------+<br>| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |<br>+------------------+----------+--------------+------------------+-------------------+<br>| mysql-bin.000002 | 1547 | | | |<br>+------------------+----------+--------------+------------------+-------------------+
- 从库执行:
CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3307, MASTER_USER='repl', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=1547; - 复制用户需提前创建:
CREATE USER 'repl'@'localhost' IDENTIFIED BY 'xxx'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';
启动多实例必须指定配置文件路径,不能依赖默认搜索顺序
直接运行 mysqld_safe 会加载 /etc/my.cnf,导致所有实例行为一致。必须用 --defaults-file 显式指定,否则 server-id 冲突,START SLAVE 直接报错 ERROR 2013 (HY000) 或无法连接 Master。
- 正确启动方式:
mysqld_safe --defaults-file=/www/server/data/3307/3307.cnf & - 验证是否生效:
mysql -S /tmp/mysql3307.sock -e "SELECT @@server_id, @@log_bin;",输出应为3307和1 - 进程检查:
ps aux | grep mysqld | grep 3307,确认参数中含--defaults-file
最常被跳过的一步是:从库启动后没执行 START SLAVE,或者执行后没立刻查 SHOW SLAVE STATUS\G 看 Seconds_Behind_Master 和两个 Yes 标志;一旦 IO_Running 或 SQL_Running 是 No,得立刻看 Last_IO_Error 或 Last_SQL_Error——90% 的问题出在 socket 路径、权限、网络地址(localhost vs 127.0.0.1)、或 GTID 设置不一致。


















