下面是纯标准 Markdown 格式 完整文档,你可以直接复制保存为 MySQL主从部署教程.md 使用:
单服务器 MySQL 主从同步部署教程(宝塔 + MySQL 8.0)
包含:配置详解 + 完整步骤 + 所有报错解决方案 + 真实环境可直接复用
一、环境说明
- 系统:CentOS 7
- 面板:宝塔 BT-Panel
- MySQL 版本:8.0.x
- 部署模式:单服务器双实例
- 主库(Master):3306 端口
- 从库(Slave):3307 端口
账号信息
- 主库 root 密码:
e800ffb698b8e2e2 - 从库 root 密码:
123456 - 主从同步账号:
repl / Repl@123456 - 业务库:
ry-glass,业务账号:root-glass / root-glass
二、从库(3307)配置文件及说明
2.1 创建从库配置
bash
vi /etc/my_slave.cnf
2.2 完整配置(逐行解释)
ini
[mysqld]
# 从库端口,不能与主库 3306 重复
port=3307
# 从库数据目录,必须独立
datadir=/www/server/data_slave
# 从库本地连接用 socket
socket=/tmp/mysql_slave.sock
# 服务器唯一 ID,主库必须为 1,从库不能相同
server-id=2
# 开启二进制日志
log-bin=mysql-bin
# 从库中继日志,用于接收主库日志
relay-log=relay-bin
# 从库设为只读(普通用户无法写入)
read_only=1
# 超级管理员也强制只读(生产必开)
super_read_only=1
symbolic-links=0
# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 错误日志
log-error=/www/server/data_slave/error.log
# PID 进程文件
pid-file=/www/server/data_slave/mysql.pid
2.3 关键配置说明
| 配置项 | 作用 |
|---|---|
| port | 从库端口,必须与主库不同 |
| server-id | 全局唯一,主库=1,从库必须不同 |
| log-bin | 开启 binlog,主从同步必须开启 |
| relay-log | 从库专用,接收并回放主库日志 |
| read_only | 从库只读,防止误写入 |
| super_read_only | 强制超级权限只读,生产环境必备 |
三、从库初始化与启动
bash
# 创建数据目录
mkdir -p /www/server/data_slave
# 授权
chown -R mysql:mysql /www/server/data_slave
chmod 700 /www/server/data_slave
# 初始化(无密码)
/www/server/mysql/bin/mysqld --defaults-file=/etc/my_slave.cnf --initialize-insecure --user=mysql
# 启动从库
/www/server/mysql/bin/mysqld_safe --defaults-file=/etc/my_slave.cnf --user=mysql &
设置从库 root 密码
bash
/www/server/mysql/bin/mysql -uroot -S /tmp/mysql_slave.sock -P3307
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
exit;
四、主库(3306)配置
4.1 主库配置检查
主库 /etc/my.cnf 必须包含:
ini
server-id=1
log-bin=mysql-bin
修改后重启:
bash
systemctl restart mysqld
4.2 创建同步账号
bash
/www/server/mysql/bin/mysql -uroot -p'e800ffb698b8e2e2'
sql
CREATE USER 'repl'@'localhost' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';
FLUSH PRIVILEGES;
4.3 查看主库 binlog 位置
sql
SHOW MASTER STATUS;
记录:
File: mysql-bin.000007Position: 156
五、配置从库连接主库
bash
/www/server/mysql/bin/mysql -uroot -p123456 -S /tmp/mysql_slave.sock -P3307
sql
STOP SLAVE;
RESET SLAVE ALL;
CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=156;
START SLAVE;
查看同步状态
sql
SHOW SLAVE STATUS\G
成功标志
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
六、所有常见报错及解决方案(真实环境全覆盖)
错误 1:Can't connect to MySQL server on '127.0.0.1:3306' (111)
-
原因:主库未启动 / 网络不通
-
解决:
bashsystemctl start mysqld systemctl stop firewalld
错误 2:Access denied for user 'repl'@'localhost'
- 原因:同步账号或密码错误
- 解决:重新创建 repl 账号
错误 3:Unknown database 'ry-glass'
-
原因:从库缺少业务库
-
解决:
sqlCREATE DATABASE IF NOT EXISTS `ry-glass`; CREATE USER 'root-glass'@'%' IDENTIFIED BY 'root-glass'; GRANT ALL ON `ry-glass`.* TO 'root-glass'@'%';
错误 4:Table 'ry-glass.device_glass' doesn't exist
- 原因:从库有库无表
- 解决:重新配置主从,从最新 binlog 开始同步
错误 5:Slave_SQL_Running: No,Operation DROP USER failed
-
原因:主库删除不存在用户
-
解决:
sqlSTOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
错误 6:ERROR 2002:Can't connect to socket
- 原因:未指定从库 socket
- 解决:登录必须加
-S /tmp/mysql_slave.sock
错误 7:GTID_MODE = OFF 无法使用 AUTO_POSITION
- 原因:未开启 GTID
- 解决:改用
MASTER_LOG_FILE + POS模式
错误 8:The server is not configured as slave
- 原因:未执行 CHANGE MASTER TO
- 解决:先配置主从信息再启动 slave
七、同步测试
主库执行
sql
USE ry-glass;
CREATE TABLE test(id INT);
INSERT INTO test VALUES(666);
从库查询
sql
USE ry-glass;
SELECT * FROM test;
能查到数据即同步正常。
八、生产安全规范
- 从库必须开启
read_only=1 - 从库不提供写入业务
- 禁止在从库手动建表
- 主库定期全量备份
- 同步账号权限最小化
九、开机自启
bash
echo "/www/server/mysql/bin/mysqld_safe --defaults-file=/etc/my_slave.cnf --user=mysql &" >> /etc/rc.local
chmod +x /etc/rc.local
十、常用运维命令
sql
-- 查看主从状态
SHOW SLAVE STATUS\G;
-- 重启同步
STOP SLAVE;
START SLAVE;
-- 跳过一条错误 SQL
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
-- 重置主从配置
RESET SLAVE ALL;