0 前言
针对网站采取多服务器配置和负载均衡的情况,网站文件可以采用syncthing、verysync之类的同步软件实现同步更新,但针对mysql如果直接采用直接复制数据库文件则会存在权限和报错问题,这个时候就需要配置主从mysql服务器了,让从服务器复制主服务器的数据。
首先我们针对该问题咨询了deepseek,deepseek给出如下提示:
嗯,用户想要配置MySQL的主从服务器,我得先理清楚步骤。主从复制通常用于数据备份、负载均衡或者高可用性,对吧?首先需要确认用户使用的是哪个MySQL版本,不过可能不同版本的步骤类似,但最好还是提一下版本兼容性。
接下来,主服务器的配置。用户可能需要修改my.cnf或者my.ini文件,启用二进制日志,设置唯一的server-id。然后创建用于复制的账户,赋予REPLICATION SLAVE权限。之后需要锁定数据库,导出数据,记录当前的二进制日志位置。这部分可能会遇到问题,比如用户可能不知道如何找到正确的日志文件和位置,或者忘记锁定导致数据不一致。
然后是配置从服务器。同样需要修改配置文件,设置不同的server-id,可能还要配置中继日志的位置。用户可能在这里出错,比如server-id和主服务器重复,或者路径配置不正确。之后需要导入主服务器的数据备份,这一步如果备份文件很大,可能需要较长时间,或者导入时出现权限问题。
设置主从连接的时候,用户需要在从服务器上执行CHANGE MASTER TO命令,输入正确的主库IP、端口、用户名、密码以及日志文件和位置。这里常见的错误是输入信息错误,比如密码不对,或者主服务器的防火墙阻止了连接。启动从服务器复制后,需要检查Slave_IO_Running和Slave_SQL_Running的状态是否为Yes,如果有错误,可能需要查看错误日志来排查。
可能的故障点包括网络问题导致主从无法通信,主库的二进制日志没有开启,server-id冲突,或者时间不同步。用户可能还会遇到复制延迟的问题,或者主库有写操作而没使用事务导致数据不一致。需要提醒用户定期检查复制状态,处理可能出现的错误。
此外,用户可能需要配置更复杂的拓扑结构,比如链式复制或者多主复制,但基础的主从配置是这些的基础。安全方面也要注意,复制账户的权限应该仅限于复制,避免使用高权限账户。另外,备份和恢复策略也是必要的,以防配置过程中出现数据丢失。
最后,应该总结一下步骤,确保用户能一步步跟随操作,并提醒常见问题和解决方法。可能还需要给出一些常用的SQL命令示例,比如SHOW MASTER STATUS和SHOW SLAVE STATUS,这样用户可以直接复制粘贴使用。如果用户的环境有特殊需求,比如云服务器或者不同操作系统,可能还需要调整部分步骤,比如配置文件的位置或者服务的重启命令。
1 环境配置
1)主服务器(Master):IP 地址 192.168.1.100
2)从服务器(Slave):IP 地址 192.168.1.200
3)MySQL 版本:建议主从服务器版本一致(如 MySQL 5.7/8.0)
4)确保主从网络互通,防火墙开放 3306 端口。
2 主服务器(Master)配置
1) 修改 MySQL 配置文件
(1)编辑 my.cnf(路径一般为 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld]
server-id = 1 # 唯一ID,主从不能重复
log-bin = mysql-bin # 开启二进制日志
binlog_format = ROW # 推荐使用ROW格式
expire_logs_days = 7 # 日志保留天数
max_binlog_size = 100M # 单个日志文件大小
# 可选:指定同步的数据库(不配置则默认同步所有)
# binlog_do_db = db_name
(2)重启 MySQL 服务
service mysql restart
或
systemctl restart mysqld
用lnmp的也可以用lnmp mysql restart来启动
2) 创建复制专用账号
登录 MySQL,创建用于复制的用户:
CREATE USER 'repl'@'192.168.1.200' IDENTIFIED BY 'Repl_Password123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.200';
FLUSH PRIVILEGES;
3)备份主库数据并记录日志位置
(1)锁定数据库(防止写入变动):
FLUSH TABLES WITH READ LOCK;
(2)查看二进制日志状态(记录 File 和 Position)
SHOW MASTER STATUS;
(3)输出示例
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | | |
+------------------+----------+--------------+------------------+
(4)保持当前窗口不关闭,新开终端备份数据
mysqldump -u root -p --all-databases --master-data > master_db.sql
(5)解锁数据库
UNLOCK TABLES;
3 从服务器(Slave)配置
1)修改 MySQL 配置文件
(1)编辑 my.cnf:
[mysqld]
server-id = 2 # 唯一ID,不能与主服务器相同
relay-log = mysql-relay-bin # 中继日志
read_only = 1 # 从库只读(确保数据安全)
(2)重启 MySQL 服务
systemctl restart mysqld
2)导入主库备份数据
将 master_db.sql 复制到从服务器,并导入
mysql -u root -p < master_db.sql
3)配置主从复制连接
登录从服务器 MySQL,执行
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='Repl_Password123!',
MASTER_LOG_FILE='mysql-bin.000001', -- 主库记录的File
MASTER_LOG_POS=107; -- 主库记录的Position
启动复制:
START SLAVE;
4 验证主从同步
1)检查从服务器状态
SHOW SLAVE STATUS\G
关注以下字段:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0(表示无延迟)
2)测试数据同步
在主库创建表或插入数据,观察从库是否同步。
5 常见问题解决
1)主从连接失败
检查网络:确保主从 3306 端口互通。
验证账号权限:确认 repl 用户权限和密码正确。
查看错误日志:tail -f /var/log/mysqld.log
2)主从数据不一致
重新初始化:从库停止复制,重新导入主库完整备份。
跳过错误(谨慎使用):
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
3)二进制日志问题
主库未开启 log-bin,或 server-id 重复。
6 扩展配置
GTID 复制:在 MySQL 5.6+ 启用 GTID 简化故障转移。
半同步复制:确保主库事务至少传输到一个从库。
多主复制:配置双主架构(需处理冲突)。
完成上述操作后,主从服务器已配置成功。还需要定期监控 SHOW SLAVE STATUS 确保复制健康。
评论 (0)