MySQL 主从复制配置
1. 主服务器准备
1.1 开启二进制日志并设置 server-id
确保主服务器已启用二进制日志并配置唯一的 server-id。编辑主服务器的 MySQL 配置文件(通常位于 /etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),添加以下内容:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog-do-db = your_database_name # 如需复制多个数据库可重复此行,省略则复制全部
重启 MySQL 服务使配置生效:
sudo service mysql restart
1.2 创建复制专用用户
登录主服务器 MySQL,创建用于复制的账号并授权:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
1.3 锁定主服务器并记录二进制日志位置
为获得一致的数据快照,需要锁定主库并获取当前二进制日志文件名及位置:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记录输出中的 File 和 Position 值,后续配置从库时使用。
注意:锁定期间主库将暂停写操作,建议在业务低峰期执行。
2. 备份主服务器数据并传输至从服务器
2.1 导出主库全部数据
在主服务器上执行 mysqldump 导出所有数据库(包含二进制日志位置信息):
mysqldump -u root -p --all-databases --master-data > alldb_backup.sql
--master-data 选项会自动在备份文件中记录当前的二进制日志文件和位置。
2.2 传输备份文件到从服务器
使用 scp 或其他方式将备份文件复制到从服务器:
scp alldb_backup.sql user@slave_ip:/path/to/directory/
3. 从服务器配置
3.1 修改从服务器配置文件
编辑从服务器的 MySQL 配置文件,设置唯一的 server-id 并指定中继日志路径:
[mysqld]
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
server-id 必须与主服务器不同。
3.2 重启从服务器 MySQL
sudo service mysql restart
3.3 导入主库备份
在从服务器上执行导入操作:
mysql -u root -p < /path/to/alldb_backup.sql
4. 配置从服务器连接主服务器
4.1 查看主库当前二进制日志位置(如备份时未使用 --master-data)
如果备份时未使用 --master-data 选项,可登录主库执行:
SHOW MASTER STATUS;
获取当前的 File 和 Position 值。
4.2 配置复制参数
登录从服务器 MySQL,执行 CHANGE MASTER TO 命令:
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='replica_user',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.xxxxxx', -- 主库的二进制日志文件名
MASTER_LOG_POS=xxxx; -- 主库的日志位置
4.3 启动复制线程
START SLAVE;
4.4 检查复制状态
SHOW SLAVE STATUS\G
确认以下两个字段均为 Yes:
Slave_IO_Running: YesSlave_SQL_Running: Yes
若出现错误,请查看 Last_IO_Error 或 Last_SQL_Error 字段。
5. 解除主服务器锁定
从库配置完成并开始复制后,回到主服务器解除全局读锁:
UNLOCK TABLES;
6. 验证主从同步
在主库执行一些写入操作(如插入、更新数据),然后检查从库是否成功同步。
7. 修改同步位置
当需要将复制位置调整到特定时间点或指定 binlog 位置时,可按以下步骤操作。
7.1 查看指定时间段的 binlog 事件
mysqlbinlog --no-defaults --start-datetime="2024-09-06 11:30:00" data/mysql-bin.008596
输出中的 end_log_pos 即为该事件结束后的 binlog 位置。
7.2 修改复制位置
若从库尚未配置过复制关系,使用完整的 CHANGE MASTER TO 命令:
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='replica_user',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.xxxxxx',
MASTER_LOG_POS=xxxx;
若已配置过复制,只需修改日志文件和位置:
CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.xxxxxx',
MASTER_LOG_POS=xxxx;
修改后需重启复制:
START SLAVE;
8. 常见问题处理
8.1 主从数据不一致
- 数据量较大:重新备份主库并恢复到从库,然后重新配置复制。
- 数据量较小:手动补录缺失数据,然后重启从库复制。
8.2 从库删除数据导致主库删除事件无法应用
当从库执行了删除操作,而主库后续又删除了相同数据时,从库可能因找不到对应行而中断复制。解决方法:
-
查看出错的 binlog 内容:
mysqlbinlog --no-defaults --start-position=85593000 --stop-position=85593055 data/mysql-bin.008596 -
跳过当前出错的复制事件:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE; SHOW SLAVE STATUS\G
9. 从库提升为主库
当主库故障或需要切换时,可将从库提升为新的主库。
9.1 停止从库复制
STOP SLAVE;
检查复制状态,确保从库已完全同步:
SHOW SLAVE STATUS\G
重点确认 Seconds_Behind_Master 为 0,且 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes。
9.2 记录当前 binlog 位置
在从库上执行:
SHOW MASTER STATUS;
记录 File 和 Position,供后续其他从库配置使用。
9.3 修改从库配置
编辑从库(新主库)的配置文件 my.cnf,确保:
- 没有指向原主库的配置(如
master_host)。 - 启用二进制日志:
[mysqld]
server-id = 2
log-bin = mysql-bin
重启 MySQL 服务:
sudo service mysql restart
9.4 清除复制信息
RESET SLAVE ALL;
9.5 处理原主库的连接(在原主库上执行,如仍可用)
查看当前连接:
SHOW PROCESSLIST;
终止残留的复制连接:
KILL process_id;
可选:撤销复制用户权限,防止原主库尝试连接:
REVOKE REPLICATION SLAVE ON *.* FROM 'replica_user'@'slave_ip';
FLUSH PRIVILEGES;

浙公网安备 33010602011771号