宝塔面板默认并不支持MySQL主从复制,但您可以通过手动方式配置
-
登录到宝塔面板。
-
在左侧菜单中,点击“数据库”。
-
在“MySQL”选项卡下,您将看到两个服务器:主服务器和从服务器,在“从服务器”上,点击“管理”按钮。
宝塔面板下配置MySQL主从复制保姆级教程,从零到生产级高可用
-
点击“设置”按钮,进入从服务器的配置页面。
-
在“服务器类型”下拉菜单中,选择“只读”。
-
在“服务器名称”中输入从服务器的域名或IP地址。
-
在“数据库”下拉菜单中,选择从服务器要使用的数据库。
-
在“端口”中输入从服务器的MySQL端口号,默认为3306。
-
在“主服务器信息”部分,输入主服务器的域名或IP地址、端口号、用户名和密码。
-
返回宝塔面板,回到MySQL管理页面,在“主服务器”下拉菜单中选择您刚刚添加的从服务器。
-
在“从服务器”设置页面中,您还可以设置其他选项,如自动切换故障转移的主服务器等,这些设置可能会影响到从服务器的性能,所以请谨慎配置。
完成以上步骤后,宝塔面板将为您配置好MySQL主从复制,从服务器将开始复制主服务器的数据,为了检查复制状态,您可以登录到从服务器的MySQL命令行,运行以下命令:
SHOW SLAVE STATUS\G;
确保“Slave_IO_Running”和“Slave_SQL_Running”都显示为“Yes”,表示主从复制正在正常运行,您还可以查看“Last_IOErrNo”和“Last_SQLErrNo”以检查是否有任何错误发生。
为什么你需要MySQL主从复制?
在业务增长到一定规模,或者对数据可靠性要求较高时,单数据库实例往往存在两个核心痛点:
- 单点故障风险:数据库服务器宕机,整个应用不可用
- 读写性能瓶颈:所有查询都压在一台机器上,高峰期响应变慢
MySQL主从复制正是为了解决这些问题而生,它将数据实时同步到多台服务器,主库负责写入,从库负责读取,实现读写分离的同时,也为数据备份提供了安全副本。
环境准备与规划
1 服务器准备
假设我们有两台服务器(也可以是同一台机器上的两个MySQL实例):
| 角色 | 内网IP | 系统 | MySQL版本 |
|---|---|---|---|
| 主库 | 168.1.100 | CentOS 7+ | 7+ 或 8.0 |
| 从库 | 168.1.101 | CentOS 7+ | 7+ 或 8.0 |
版本一致性提示:强烈建议主从使用相同MySQL大版本(如都是5.7.40),避免因版本差异导致的复制兼容问题。
2 宝塔面板安装
如果尚未安装宝塔面板,在每台服务器上执行:
curl -sSO https://download.bt.cn/install/install_panel.sh && bash install_panel.sh
安装完成后,在宝塔后台的“软件商店”中安装MySQL(建议选择5.7或8.0版本)。
配置主库(Master)
1 开启二进制日志
通过宝塔面板→“数据库”→MySQL→“配置修改”,找到[mysqld]部分,添加或修改以下参数:
[mysqld] # 开启二进制日志 log-bin=mysql-bin # 服务器唯一ID(主从不一致) server-id=1 # 需要同步的数据库(可选,不设则同步所有库) binlog-do-db=my_database # 不需要同步的数据库(如mysql系统库) binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=sys
点击“保存”后,在宝塔面板中重启MySQL。
2 创建复制专用用户
在宝塔面板的“数据库”→ “phpMyAdmin”中执行SQL,或在服务器命令行连接MySQL:
-- 登录MySQL mysql -u root -p -- 创建用户(密码请使用强密码) CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'YourStrongPassword123!'; -- 授予复制权限 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%'; -- 刷新权限 FLUSH PRIVILEGES;
3 查看主库状态
执行:
SHOW MASTER STATUS;
记下返回的File和Position两个值,
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 154 | my_database | mysql |
+------------------+----------+--------------+------------------+
请注意:在进行下一步备份前,不要再对主库写入数据,否则Position值会变化。
备份主库并恢复到从库
1 锁定主库防止新写入
FLUSH TABLES WITH READ LOCK;
2 导出主库数据
在服务器命令行导出(假设需要同步的数据库是my_database):
mysqldump -u root -p --databases my_database > /root/master_backup.sql
如果同步所有库,则使用:
mysqldump -u root -p --all-databases --master-data=2 > /root/all_backup.sql
导出完成后,解锁主库:
UNLOCK TABLES;
3 将备份文件传到从库
scp /root/master_backup.sql root@192.168.1.101:/root/
4 在从库恢复数据
登录从库服务器,执行:
mysql -u root -p < /root/master_backup.sql
配置从库(Slave)
1 修改从库配置
同样在宝塔“配置修改”中添加:
[mysqld] # 服务器唯一ID(与主库不同) server-id=2 # 开启中继日志(一般默认已开启,可显式指定) relay-log=mysql-relay-bin # 只读模式(防止误写) read-only=1 # 如果需要过滤同步的库 replicate-do-db=my_database # 不需要同步的库 replicate-ignore-db=mysql replicate-ignore-db=information_schema replicate-ignore-db=performance_schema replicate-ignore-db=sys
保存后重启从库MySQL。
2 设置从库连接主库
登录从库MySQL,执行:
CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='YourStrongPassword123!', MASTER_LOG_FILE='mysql-bin.000003', -- 使用前面主库状态中的File MASTER_LOG_POS=154; -- 使用前面主库状态中的Position
3 启动复制
START SLAVE;
4 检查复制状态
SHOW SLAVE STATUS\G;
重点关注以下两个字段是否均为Yes:
Slave_IO_Running: YesSlave_SQL_Running: Yes
如果出现No,请检查错误信息(Last_IO_Error或Last_SQL_Error)。
验证与常见问题排查
1 简单验证
在主库创建一个测试表或插入一条数据:
USE my_database; CREATE TABLE test_repl (id INT PRIMARY KEY, name VARCHAR(20)); INSERT INTO test_repl VALUES (1, 'hello');
在从库查询:
SELECT * FROM my_database.test_repl;
应该能立刻看到刚刚插入的记录。
2 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| Slave_IO_Running: Connecting | 网络不通、用户名密码错误、主库防火墙未放行3306端口 | 检查网络,在从库telnet 主库IP 3306测试,检查主库firewalld/iptables |
| Slave_SQL_Running: No | 主从数据不一致,或SQL冲突(如主键重复) | 查看错误日志,通常需要跳过错误或重新同步 |
| Last_IO_Error: Got fatal error 1236 | 主库binlog被清理或损坏 | 检查主库expire_logs_days设置,重新设置复制起点 |
| 数据同步延迟大 | 主库写入压力大、从库配置低、网络延迟 | 使用SHOW SLAVE STATUS中的Seconds_Behind_Master监控延迟 |
3 跳过复制的错误
如果在从库遇到可以忽略的错误(例如误插入重复数据),可以临时跳过:
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;
宝塔面板的便捷监控
- 在宝塔面板首页,可以看到MySQL的运行状态和负载。
- 安装“宝塔任务管理器”插件,可以监控主从复制的延迟。
- 建议设置定时任务:每隔5分钟检查
Slave_IO_Running和Slave_SQL_Running状态,如异常自动告警。
从单机到主从后的注意事项
- 写入只在主库:应用层需修改代码,写操作连接主库,读操作连接从库。
- 从库不要手动写入:已设置
read-only=1防止误写,但拥有SUPER权限的用户仍可写入。 - 定期检查一致性:可以使用
pt-table-checksum工具检查主从数据是否一致。 - 备份从库数据:主从复制不是备份的替代品,定期从从库进行物理备份更安全。
进阶:配置GTID复制(MySQL 5.7+)
如果主库和从库MySQL版本都在5.7及以上,建议使用GTID(全局事务标识符)方式,更易维护:
- 在主库和从库配置中添加:
gtid_mode=ON enforce_gtid_consistency=ON
- 重启双方MySQL。
- 重新设置从库时,
CHANGE MASTER TO中可以不指定MASTER_LOG_FILE和MASTER_LOG_POS,改为:CHANGE MASTER TO MASTER_HOST='...', MASTER_USER='...', MASTER_PASSWORD='...', MASTER_AUTO_POSITION=1;
通过宝塔面板配置MySQL主从复制,本质上是将复杂的底层配置通过可视化界面简化,但核心原理和步骤与传统方式完全一致,本文带你从零搭建了一套可用的主从架构,但在生产环境中,还需要考虑高可用切换(如MHA、Orchestrator)、负载均衡、SSL加密复制等更完善的方案。
主从复制只是高可用的第一站,运维之路,且行且完善。
