Files
2025-11-27 00:02:01 +08:00

376 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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