xampp默认不支持主从复制,因其mysql为单实例设计,仅配置一套参数、监听一个端口(3306);主从需两个独立实例,各自拥有不同port、server-id、datadir和日志路径,否则将因冲突导致启动失败或同步异常。

不能直接在 XAMPP 默认安装上配主从复制——它只跑一个 mysqld 进程,server-id、port、datadir 全部唯一,强行启动第二个实例会报错 Can't start server: Bind on TCP/IP port. Got error: 10048 或拒绝执行 CHANGE MASTER TO(提示 ERROR 1238 (HY000): Variable 'server_id' is a read only variable)。
为什么 XAMPP 默认不支持主从?
XAMPP 的 MySQL 是单实例封装:一套 my.ini、一个 datadir、监听固定端口 3306。主从本质是两个独立 MySQL 实例协同工作,必须各自拥有:
-
server-id唯一(比如1和2) - 不同
port(比如3306和3307) - 隔离的
datadir(绝不能共用同一目录,否则 InnoDB 表空间损坏) - 独立的 binlog / relay-log 路径(混用会导致日志覆盖或解析失败)
试图只改 server-id 就重启同一个服务,mysqld 启动时会忽略该变更(它是只读变量),最终 SHOW SLAVE STATUS 里 Slave_IO_Running 永远是 No。
如何在 Windows 上跑两个 MySQL 实例(Master + Slave)
复用 XAMPP 的 MySQL 二进制文件,但用两套配置、两个数据目录、两个 Windows 服务。关键动作不是“改配置”,而是“复制+隔离”:
- 复制整个
D:\xampp\mysql目录为D:\xampp\mysql_slave(路径不含空格/中文) - 原
my.ini只保留 Master 配置:port=3306、server-id=1、log-bin=mysql-bin、binlog-format=ROW - 新
mysql_slave\my.ini必须不同:port=3307、server-id=2、datadir="D:/xampp/mysql_slave/data"、relay-log=mysql-relay-bin、log-slave-updates=1、read-only=1—— 不加log-bin(除非你要级联复制) - 分别初始化数据目录:
mysqld --initialize-insecure --datadir="D:/xampp/mysql/data"和mysqld --initialize-insecure --datadir="D:/xampp/mysql_slave/data"(管理员 CMD 执行) - 注册为服务:
mysqld install mysql_master --defaults-file="D:/xampp/mysql/my.ini"和mysqld install mysql_slave --defaults-file="D:/xampp/mysql_slave/my.ini"
启动后,net start mysql_master 和 net start mysql_slave 才真正跑起两个进程。
主从连接与验证常见卡点
即使两个实例都起来了,START SLAVE 后仍可能卡在 Slave_IO_Running: No 或 Slave_SQL_Running: No,多数源于以下细节:
-
CHANGE MASTER TO中的master_log_file和master_log_pos必须严格匹配SHOW MASTER STATUS输出(注意大小写、有无前导零) - Slave 实例的
server-id若和 Master 相同,START SLAVE会静默失败,SHOW SLAVE STATUS里Last_IO_Error显示空,但Seconds_Behind_Master为NULL - Master 的防火墙需放行
3306(Slave 连 Master 是出站,但 Windows 防火墙默认入站拦截) - 账号权限必须显式授予
REPLICATION SLAVE,仅GRANT ALL PRIVILEGES不够;且host不能写localhost(Windows 下解析为 socket 连接,应写127.0.0.1或%) - 若用
mysqldump同步初始数据,务必在 Slave 执行SET SQL_LOG_BIN=0;再SOURCE,否则 dump 里的CREATE DATABASE会被记入 Slave 的 binlog,引发循环写入
最易被忽略的是:Slave 实例的 datadir 初始化后,mysql 系统库必须存在且结构完整——如果只复制了业务库子目录进去,START SLAVE 会因找不到 mysql.slave_master_info 表而失败,错误日志里提示 Table 'mysql.slave_master_info' doesn't exist。











