376 lines
7.9 KiB
Markdown
376 lines
7.9 KiB
Markdown
# MySQL主从复制配置步骤(数据已一致场景)
|
||
|
||
## 📋 前置条件
|
||
|
||
✅ **数据已同步**:两个数据库中的`hzdyjs_xg`数据库数据已经一致
|
||
✅ **网络互通**:两台机器可以互相访问
|
||
✅ **MySQL运行正常**:两台机器的MySQL服务都在运行
|
||
|
||
---
|
||
|
||
## 🚀 配置步骤
|
||
|
||
### 第一步:在主库(67)配置主库
|
||
|
||
```bash
|
||
# 1. 进入部署脚本目录
|
||
cd /path/to/部署脚本/
|
||
|
||
# 2. 赋予执行权限
|
||
chmod +x setup-mysql-replication.sh
|
||
|
||
# 3. 执行主库配置脚本
|
||
./setup-mysql-replication.sh
|
||
```
|
||
|
||
**脚本会自动完成以下操作:**
|
||
- ✅ 配置主库的`/etc/my.cnf`(添加binlog配置)
|
||
- ✅ 重启MySQL服务
|
||
- ✅ 创建复制用户`repl@172.16.0.68`
|
||
- ✅ 显示`SHOW MASTER STATUS`的输出
|
||
|
||
**⚠️ 重要:记录输出的binlog信息**
|
||
|
||
脚本执行后会显示类似以下输出:
|
||
```
|
||
File: mysql-bin.000001
|
||
Position: 154
|
||
```
|
||
|
||
**请记录这两个值:**
|
||
- `MASTER_LOG_FILE`: `mysql-bin.000001`
|
||
- `MASTER_LOG_POS`: `154`
|
||
|
||
---
|
||
|
||
### 第二步:在从库(68)配置从库
|
||
|
||
```bash
|
||
# 1. 进入部署脚本目录
|
||
cd /path/to/部署脚本/
|
||
|
||
# 2. 赋予执行权限(如果还没执行过)
|
||
chmod +x setup-mysql-replication.sh
|
||
|
||
# 3. 执行从库配置脚本
|
||
./setup-mysql-replication.sh
|
||
```
|
||
|
||
**脚本会提示输入主库的binlog信息:**
|
||
```
|
||
请输入主库的 MASTER_LOG_FILE 和 MASTER_LOG_POS:
|
||
MASTER_LOG_FILE: mysql-bin.000001
|
||
MASTER_LOG_POS: 154
|
||
```
|
||
|
||
**输入第一步记录的值后,脚本会自动完成:**
|
||
- ✅ 配置从库的`/etc/my.cnf`(添加从库配置)
|
||
- ✅ 重启MySQL服务
|
||
- ✅ 配置主从复制关系
|
||
- ✅ 启动从库复制
|
||
- ✅ 显示从库状态
|
||
|
||
---
|
||
|
||
### 第三步:验证主从复制状态
|
||
|
||
#### 3.1 在从库检查复制状态
|
||
|
||
```bash
|
||
# 检查从库IO和SQL线程是否运行
|
||
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i "slave_io_running\|slave_sql_running\|seconds_behind_master"
|
||
```
|
||
|
||
**正常输出应该是:**
|
||
```
|
||
Slave_IO_Running: Yes
|
||
Slave_SQL_Running: Yes
|
||
Seconds_Behind_Master: 0
|
||
```
|
||
|
||
#### 3.2 在主库检查连接
|
||
|
||
```bash
|
||
# 查看主库的连接信息
|
||
mysql -u root -p -e "SHOW PROCESSLIST;" | grep repl
|
||
```
|
||
|
||
应该能看到从库的连接。
|
||
|
||
#### 3.3 测试数据同步
|
||
|
||
```bash
|
||
# 在主库插入测试数据
|
||
mysql -u root -p hzdyjs_xg -e "CREATE TABLE IF NOT EXISTS test_replication (id INT PRIMARY KEY, name VARCHAR(50));"
|
||
mysql -u root -p hzdyjs_xg -e "INSERT INTO test_replication VALUES (1, 'test');"
|
||
|
||
# 在从库查询测试数据
|
||
mysql -u root -p hzdyjs_xg -e "SELECT * FROM test_replication;"
|
||
|
||
# 如果能看到数据,说明主从复制正常
|
||
# 清理测试数据
|
||
mysql -u root -p hzdyjs_xg -e "DROP TABLE test_replication;"
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 手动配置方法(如果脚本执行失败)
|
||
|
||
### 主库手动配置
|
||
|
||
#### 1. 编辑主库配置文件
|
||
|
||
```bash
|
||
# 编辑 /etc/my.cnf
|
||
vi /etc/my.cnf
|
||
```
|
||
|
||
添加以下配置:
|
||
```ini
|
||
[mysqld]
|
||
# 主从复制配置
|
||
server-id = 1
|
||
log-bin = mysql-bin
|
||
binlog-format = ROW
|
||
binlog-do-db = hzdyjs_xg
|
||
expire_logs_days = 7
|
||
max_binlog_size = 500M
|
||
|
||
# 性能优化配置
|
||
sync_binlog = 0
|
||
binlog_cache_size = 2M
|
||
max_binlog_cache_size = 512M
|
||
```
|
||
|
||
#### 2. 重启MySQL
|
||
|
||
```bash
|
||
systemctl restart mysqld
|
||
sleep 5
|
||
```
|
||
|
||
#### 3. 创建复制用户
|
||
|
||
```bash
|
||
mysql -u root -p <<EOF
|
||
CREATE USER IF NOT EXISTS 'repl'@'172.16.0.68' IDENTIFIED BY 'Repl@123456';
|
||
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.0.68';
|
||
FLUSH PRIVILEGES;
|
||
SHOW MASTER STATUS;
|
||
EOF
|
||
```
|
||
|
||
**记录输出的`File`和`Position`值。**
|
||
|
||
---
|
||
|
||
### 从库手动配置
|
||
|
||
#### 1. 编辑从库配置文件
|
||
|
||
```bash
|
||
# 编辑 /etc/my.cnf
|
||
vi /etc/my.cnf
|
||
```
|
||
|
||
添加以下配置:
|
||
```ini
|
||
[mysqld]
|
||
# 主从复制配置
|
||
server-id = 2
|
||
relay-log = mysql-relay-bin
|
||
read-only = 1
|
||
replicate-do-db = hzdyjs_xg
|
||
```
|
||
|
||
#### 2. 重启MySQL
|
||
|
||
```bash
|
||
systemctl restart mysqld
|
||
sleep 5
|
||
```
|
||
|
||
#### 3. 配置主从复制
|
||
|
||
```bash
|
||
# 替换下面的值为主库的实际值
|
||
MASTER_LOG_FILE="mysql-bin.000001" # 从主库SHOW MASTER STATUS获取
|
||
MASTER_LOG_POS=154 # 从主库SHOW MASTER STATUS获取
|
||
|
||
mysql -u root -p <<EOF
|
||
STOP SLAVE;
|
||
CHANGE MASTER TO
|
||
MASTER_HOST='172.16.0.67',
|
||
MASTER_USER='repl',
|
||
MASTER_PASSWORD='Repl@123456',
|
||
MASTER_LOG_FILE='$MASTER_LOG_FILE',
|
||
MASTER_LOG_POS=$MASTER_LOG_POS;
|
||
START SLAVE;
|
||
SHOW SLAVE STATUS\G
|
||
EOF
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ 常见问题排查
|
||
|
||
### 问题1:从库IO线程未运行(Slave_IO_Running: No)
|
||
|
||
**可能原因:**
|
||
- 网络不通
|
||
- 复制用户密码错误
|
||
- 防火墙阻止连接
|
||
|
||
**解决方法:**
|
||
```bash
|
||
# 1. 检查网络连通性
|
||
ping 172.16.0.67
|
||
telnet 172.16.0.67 3306
|
||
|
||
# 2. 检查复制用户权限
|
||
mysql -u root -p -e "SELECT user, host FROM mysql.user WHERE user='repl';"
|
||
|
||
# 3. 检查防火墙
|
||
firewall-cmd --list-all | grep 3306
|
||
|
||
# 4. 查看详细错误信息
|
||
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i error
|
||
```
|
||
|
||
### 问题2:从库SQL线程未运行(Slave_SQL_Running: No)
|
||
|
||
**可能原因:**
|
||
- 数据不一致
|
||
- 主从binlog位置不匹配
|
||
- 从库有写操作(read-only未生效)
|
||
|
||
**解决方法:**
|
||
```bash
|
||
# 1. 查看具体错误
|
||
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i "last_error\|last_sql_error"
|
||
|
||
# 2. 如果是因为数据不一致,可以跳过错误(谨慎使用)
|
||
mysql -u root -p -e "STOP SLAVE; SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;"
|
||
|
||
# 3. 检查从库是否可写
|
||
mysql -u root -p -e "SHOW VARIABLES LIKE 'read_only';"
|
||
```
|
||
|
||
### 问题3:主从延迟较大(Seconds_Behind_Master > 0)
|
||
|
||
**可能原因:**
|
||
- 从库性能不足
|
||
- 网络延迟
|
||
- 主库写入压力大
|
||
|
||
**解决方法:**
|
||
```bash
|
||
# 1. 检查从库性能
|
||
top
|
||
iostat -x 1
|
||
|
||
# 2. 检查网络延迟
|
||
ping -c 10 172.16.0.67
|
||
|
||
# 3. 优化从库配置(增加缓冲)
|
||
# 在从库 /etc/my.cnf 中添加:
|
||
# relay_log_recovery = 1
|
||
# slave_parallel_workers = 4
|
||
```
|
||
|
||
### 问题4:binlog位置不匹配
|
||
|
||
**解决方法:**
|
||
```bash
|
||
# 1. 在主库获取当前binlog位置
|
||
mysql -u root -p -e "SHOW MASTER STATUS;"
|
||
|
||
# 2. 在从库重新配置
|
||
mysql -u root -p <<EOF
|
||
STOP SLAVE;
|
||
CHANGE MASTER TO
|
||
MASTER_LOG_FILE='新的File值',
|
||
MASTER_LOG_POS=新的Position值;
|
||
START SLAVE;
|
||
EOF
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 主从复制监控命令
|
||
|
||
### 日常监控
|
||
|
||
```bash
|
||
# 查看从库状态摘要
|
||
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Master_Log_File|Read_Master_Log_Pos"
|
||
|
||
# 查看主库binlog信息
|
||
mysql -u root -p -e "SHOW MASTER STATUS;"
|
||
|
||
# 查看从库延迟
|
||
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master"
|
||
```
|
||
|
||
### 性能监控
|
||
|
||
```bash
|
||
# 查看主库binlog写入情况
|
||
mysql -u root -p -e "SHOW VARIABLES LIKE 'binlog%';"
|
||
|
||
# 查看从库复制线程状态
|
||
mysql -u root -p -e "SHOW PROCESSLIST;" | grep -i slave
|
||
|
||
# 查看主库连接数
|
||
mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
|
||
```
|
||
|
||
---
|
||
|
||
## 🔄 主从切换(故障转移)
|
||
|
||
如果需要将从库切换为主库:
|
||
|
||
```bash
|
||
# 1. 在从库停止复制
|
||
mysql -u root -p -e "STOP SLAVE;"
|
||
|
||
# 2. 取消只读模式
|
||
mysql -u root -p -e "SET GLOBAL read_only = OFF;"
|
||
|
||
# 3. 更新应用配置,指向新的主库IP
|
||
|
||
# 4. 原主库恢复后,可以重新配置为主从关系
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 配置检查清单
|
||
|
||
配置完成后,请确认以下项目:
|
||
|
||
- [ ] 主库binlog已开启
|
||
- [ ] 从库relay-log已配置
|
||
- [ ] 复制用户已创建并授权
|
||
- [ ] 从库IO线程运行正常(Slave_IO_Running: Yes)
|
||
- [ ] 从库SQL线程运行正常(Slave_SQL_Running: Yes)
|
||
- [ ] 主从延迟为0(Seconds_Behind_Master: 0)
|
||
- [ ] 测试数据同步正常
|
||
- [ ] 防火墙规则已配置
|
||
- [ ] 监控脚本已配置
|
||
|
||
---
|
||
|
||
## 📚 相关文档
|
||
|
||
- [生产环境双机部署方案.md](../生产环境双机部署方案.md) - 完整部署方案
|
||
- [MySQL主从复制性能影响分析.md](./MySQL主从复制性能影响分析.md) - 性能分析
|
||
- [MySQL系统数据库说明.md](./MySQL系统数据库说明.md) - 系统数据库处理说明
|
||
- [部署脚本/setup-mysql-replication.sh](./部署脚本/setup-mysql-replication.sh) - 自动化配置脚本
|
||
|
||
---
|
||
|
||
**📝 文档版本**: v1.0
|
||
**🔄 最后更新**: 2025-01-27
|
||
|