MySQL主从复制实操:授权、配置与数据同步指南
掌握MySQL主从复制可实现故障快速切换、降低主库压力及独立备份。本文基于两台服务器(Master 192.168.10.1 / Slave 192.168.10.2),详细讲解用户授权、Binlog配置、初始数据同步及主从连接设置,并附带常见同步错误的修复方案。
操作目标与准备条件
MySQL主从复制的核心优势在于提升系统可用性、分担读负载以及避免备份期间锁表。本案例旨在搭建一个稳定的主从环境,前提条件是:
- 主服务器 (Master):IP 192.168.10.1,需拥有root权限或能执行grant语句的用户。
- 从服务器 (Slave):IP 192.168.10.2,网络互通,且已安装相同版本的MySQL。
- 端口限制:确保双方3306端口防火墙允许通信。
第1步:主库用户授权与Binlog配置
第1.1步:创建同步专用账号
为了安全起见,不建议使用root进行远程复制。我们需要在Master上创建一个专门用于复制的用户。
- 目的:赋予Slave特定权限以读取主库日志。
- 操作:登录MySQL,查看现有用户后执行授权。
mysql> mysql -uroot -p123123;
mysql> SELECT user, host, password FROM mysql.user;
-- 创建用于复制的用户,允许来自192.168.10.2的连接
mysql> GRANT REPLICATION SLAVE ON *.* TO 'user1'@'192.168.10.2' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;验证结果:SELECT user, host FROM mysql.user; 应能看到 user1 @ 192.168.10.2。此时可从从库测试连接:mysql -uuser1 -p123456 -h192.168.10.1。
第1.2步:开启二进制日志 (Binlog)
风险提醒:修改配置文件后需重启服务,建议在维护窗口期操作。
- 入口:主服务器配置文件
/etc/mysql/my.cnf。 - 动作:在
[mysqld]段落下添加以下配置:
log-bin = /var/log/mysql/mysql-bin.log
server-id = 1注意:务必设置唯一的 server-id,此处设为主库ID为1。保存后重启MySQL服务: sudo /etc/init.d/mysql restart。
验证开启状态:
mysql> SHOW VARIABLES LIKE '%log_bin%';
-- 若 Variable_name=log_bin 且 Value=ON,则配置成功。第2步:初始化数据全量同步
配置好主库后,必须先将主库现有的历史数据迁移到从库,以保证数据基线一致。
第2.1步:锁定并导出主库数据
- 参数说明:
-l(Lock Tables) 锁定表防止写入,-F(Flush Logs) 刷新日志以确保一致性。 - 操作:
# 建议先重置主库日志,获取干净的起始点(可选)
mysql> RESET MASTER;
# 导出数据库 test 到 /tmp/test.sql
mysqldump -uroot -p123123 test -l -F > /tmp/test.sql第2.2步:传输并导入从库
- 动作:使用SCP将文件传至从库,然后在从库导入。
# 传输文件
scp /tmp/test.sql 192.168.10.2:/tmp/
# 在从库(192.168.10.2)上执行导入
mysql -uroot -p123123 test < /tmp/test.sql导入完成后,从库拥有了与主库一致的快照数据。
第3步:从库配置与同步启动
第3.1步:配置从服务器参数
- 入口:从服务器配置文件
/etc/mysql/my.cnf。 - 关键参数:
[mysqld]
server-id = 2 # 从库ID必须唯一,且不同于主库
# 注意:新版的MySQL通常不再使用master-host等全局变量配置,
# 而是通过 CHANGE MASTER TO 命令动态配置。重要修正:原文中使用的 master-host 等参数在现代MySQL版本(5.7+ / 8.0+)中已被弃用。推荐在运行时通过SQL命令配置主库地址。
第3.2步:动态建立主从连接
由于我们在第1步导出了数据并查看了主库状态,现在需要在从库上指向这个起点。
- 获取主库当前Binlog位置(在主库执行):
mysql> SHOW MASTER STATUS;
-- 记录 File (如 mysql-bin.000002) 和 Position (如 107)- 配置并启动Slave(在从库执行):
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.10.1',
-> MASTER_USER='user1',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000002', -- 替换为实际文件名
-> MASTER_LOG_POS=107; -- 替换为实际位置号
mysql> START SLAVE;完成情况判断与排错
在从库执行 SHOW SLAVE STATUS\G,关键检查项如下:
-
Slave_IO_Running: Yes:表示IO线程正常读取主库日志。 -
Slave_SQL_Running: Yes:表示SQL线程正常执行日志中的事件。 -
Seconds_Behind_Master:数值越小越好,0表示实时同步。
常见错误:Slave_SQL_Running 为 NO
如果变为NO,通常是因为数据冲突或误操作。处理步骤:
- 跳过错误事务(适用于可忽略的错误):
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;- 重新指定主库位置(适用于严重数据不一致):
参考第3.2步,再次从主库获取最新的File和Pos,执行 CHANGE MASTER TO 并重启Slave。
简要总结
MySQL主从复制通过授权专用账号、开启Binlog、全量数据迁移及动态配置连接来实现。关键在于保证主从 server-id 的唯一性以及 MATRIX_LOG_FILE/POS 的准确匹配。定期监控 SHOW SLAVE STATUS 可及时发现同步延迟或中断问题。
以上就是MySQL主从复制配置与实际操作的详细内容,更多关于数据库高可用的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









