在 Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步(Master-Slave Replication) 的过程略有不同,因为两者的 MySQL 版本和环境存在差异。以下是详细步骤,帮助你完成跨平台的主从复制配置。
📝 前提条件
- 主服务器(Master):Windows 上的 MySQL 8.4.3
- 从服务器(Slave):WSL Ubuntu 上的 MySQL 8.0.40
- 确保主从服务器之间网络可以互相访问。
🚀 步骤 1:在主服务器(Windows MySQL 8.4.3)上配置
📌 1. 修改 MySQL 配置文件
-
打开
my.ini
文件,路径通常为:C:\ProgramData\MySQL\MySQL Server 8.4\my.ini
-
添加或修改以下配置:
[mysqld] server-id=1 log-bin=mysql-bin binlog-format=row
server-id=1
:主服务器的唯一标识。log-bin=mysql-bin
:启用二进制日志。binlog-format=row
:推荐的二进制日志格式。
-
保存配置文件后,重启 MySQL 服务:
net stop mysql net start mysql
📌 2. 创建复制用户
在主服务器上,登录 MySQL 并创建一个用于复制的用户:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
📌 3. 获取二进制日志信息
运行以下命令,获取主服务器的二进制日志文件名和位置:
SHOW BINARY LOG STATUS;
示例输出:
+------------------+----------+
| Log_name | Position |
+------------------+----------+
| mysql-bin.000001 | 154 |
+------------------+----------+
记下 Log_name
和 Position
的值。
🚀 步骤 2:在从服务器(WSL MySQL 8.0.40)上配置
📌 1. 修改 MySQL 配置文件
-
在 WSL Ubuntu 中,编辑
my.cnf
文件:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
-
添加或修改以下配置:
[mysqld] server-id=2 relay-log=relay-log
server-id=2
:从服务器的唯一标识。relay-log=relay-log
:启用中继日志。
-
保存并退出,然后重启 MySQL 服务:
sudo systemctl restart mysql
📌 2. 配置主从同步
登录从服务器的 MySQL:
mysql -u root -p
执行以下命令,设置主服务器的信息:
CHANGE REPLICATION SOURCE TOSOURCE_HOST='your_master_ip',SOURCE_USER='replica_user',SOURCE_PASSWORD='your_password',SOURCE_LOG_FILE='mysql-bin.000001',SOURCE_LOG_POS=154;
your_master_ip
:主服务器的 IP 地址(Windows 的本地 IP 地址)。replica_user
和your_password
:主服务器上创建的复制用户和密码。mysql-bin.000001
:主服务器的二进制日志文件名。154
:主服务器的二进制日志位置。
📌 3. 启动从服务器的复制
在从服务器上执行以下命令:
START REPLICA;
🚀 步骤 3:验证主从同步状态
📌 在从服务器上检查复制状态
在从服务器上执行:
SHOW REPLICA STATUS\G;
检查以下关键字段:
字段 | 说明 |
---|---|
Replica_IO_Running | 应为 Yes |
Replica_SQL_Running | 应为 Yes |
Last_Error | 应为空 |
如果 Replica_IO_Running
和 Replica_SQL_Running
都是 Yes,说明主从复制已正常运行。
✅ 步骤 4:测试主从同步
📌 在主服务器上创建一个测试数据库
在主服务器上执行:
CREATE DATABASE test_db;
📌 在从服务器上验证
在从服务器上执行:
SHOW DATABASES;
如果你在从服务器上看到了 test_db
,说明主从复制已成功。
🛠 常见问题排查
问题 | 解决方法 |
---|---|
无法连接主服务器 | 确保主服务器的防火墙允许从服务器的 IP 访问 MySQL 端口 |
Replica_IO_Running: No | 确认主服务器的 IP 地址和用户权限设置正确 |
从服务器显示错误日志 | 检查 SHOW REPLICA STATUS\G 的 Last_Error 字段 |
🔧 防火墙配置(Windows)
如果 Windows 防火墙阻止了 WSL 的访问,需要允许 MySQL 3306 端口的入站流量:
New-NetFirewallRule -DisplayName "Allow MySQL 3306" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow
🎯 总结
主服务器 | 从服务器 |
---|---|
Windows MySQL 8.4.3 | WSL MySQL 8.0.40 |
server-id=1 | server-id=2 |
SHOW BINARY LOG STATUS; | SHOW REPLICA STATUS\G; |
使用 CHANGE REPLICATION SOURCE TO 替代旧的 CHANGE MASTER TO 命令 |
#主库
SHOW BINARY LOG STATUS;CREATE USER 'root'@'%' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
FLUSH PRIVILEGES;SHOW PLUGINS;#从库
SELECT VERSION();CHANGE REPLICATION SOURCE TOSOURCE_HOST='192.168.110.206',SOURCE_USER='root',SOURCE_PASSWORD='root',SOURCE_LOG_FILE='KONG-bin.000016',SOURCE_LOG_POS=15597;#启动io
START REPLICA;
#查看状态
SHOW REPLICA STATUS;#停止io
STOP REPLICA IO_THREAD;select * from s_sys_user;