MySQL主从复制部署实操指南
一、环境准备
1.1 系统要求
- CentOS 7/8 或 Ubuntu 18.04/20.04/22.04
- MySQL 5.7 或 8.0 版本
- 至少两台服务器(主库和从库)
- 网络互通,防火墙开放3306端口
1.2 服务器规划示例
| 角色 | IP地址 | 主机名 |
|---|---|---|
| 主库 | 192.168.1.10 | mysql-master |
| 从库 | 192.168.1.11 | mysql-slave |
二、MySQL安装(CentOS)
2.1 安装MySQL 8.0
# 添加MySQL YUM仓库
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm
# 安装MySQL
sudo yum install -y mysql-community-server
# 启动服务
sudo systemctl start mysqld
sudo systemctl enable mysqld
2.2 获取初始密码
sudo grep 'temporary password' /var/log/mysqld.log
三、MySQL安装(Ubuntu)
3.1 安装MySQL 8.0
# 更新包列表
sudo apt update
# 安装MySQL
sudo apt install -y mysql-server
# 启动服务
sudo systemctl start mysql
sudo systemctl enable mysql
3.2 安全配置
sudo mysql_secure_installation
四、主库配置
4.1 修改主库配置文件
# CentOS
sudo vi /etc/my.cnf
# Ubuntu
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
添加以下配置:
[mysqld]
# 服务器ID,主库必须唯一
server-id = 1
# 启用二进制日志
log-bin = mysql-bin
# 需要复制的数据库(可选)
# binlog-do-db = mydb
# 不需要复制的数据库(可选)
# binlog-ignore-db = mysql
# binlog-ignore-db = information_schema
# binlog-ignore-db = performance_schema
# 二进制日志格式(推荐ROW)
binlog_format = ROW
# 自动清理过期日志(可选)
expire_logs_days = 7
max_binlog_size = 100M
4.2 重启MySQL服务
# CentOS
sudo systemctl restart mysqld
# Ubuntu
sudo systemctl restart mysql
4.3 创建复制用户
-- 登录MySQL
mysql -u root -p
-- 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Repl@123456';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看主库状态
SHOW MASTER STATUS;
记录输出中的 File 和 Position 值:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
五、从库配置
5.1 修改从库配置文件
# CentOS
sudo vi /etc/my.cnf
# Ubuntu
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
添加以下配置:
[mysqld]
# 服务器ID,从库必须唯一且不同于主库
server-id = 2
# 启用中继日志
relay-log = mysql-relay-bin
# 可选:设置只读(确保从库不会写入)
read_only = 1
# 可选:记录从库的二进制日志(用于级联复制)
# log-bin = mysql-bin
# log-slave-updates = 1
5.2 重启MySQL服务
# CentOS
sudo systemctl restart mysqld
# Ubuntu
sudo systemctl restart mysql
5.3 配置复制链路
-- 登录MySQL
mysql -u root -p
-- 停止从库复制
STOP SLAVE;
-- 配置主库信息(使用主库的IP和前面记录的File、Position)
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
-- 启动从库复制
START SLAVE;
-- 查看从库状态
SHOW SLAVE STATUSG
六、验证复制状态
6.1 检查从库状态
SHOW SLAVE STATUSG
关键指标检查:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Seconds_Behind_Master: 0(或很小的数字)
- Last_IO_Error: 空
- Last_SQL_Error: 空
6.2 测试数据同步
在主库创建测试数据:
-- 在主库执行
CREATE DATABASE test_replication;
USE test_replication;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'test_data');
在从库验证:
-- 在从库执行
SELECT * FROM test_replication.test_table;
七、常用维护命令
7.1 主库操作
-- 查看主库状态
SHOW MASTER STATUS;
-- 查看所有二进制日志
SHOW BINARY LOGS;
-- 刷新日志
FLUSH LOGS;
-- 清理过期日志
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
7.2 从库操作
-- 停止复制
STOP SLAVE;
-- 启动复制
START SLAVE;
-- 重置复制
RESET SLAVE ALL;
-- 跳过错误(谨慎使用)
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
-- 查看复制进程
SHOW PROCESSLIST;
八、故障排查
8.1 常见问题及解决
问题1:Slave_IO_Running = Connecting
# 检查网络连通性
ping 192.168.1.10
# 检查防火墙
sudo firewall-cmd --list-all # CentOS
sudo ufw status # Ubuntu
# 检查MySQL用户权限
问题2:Slave_SQL_Running = No
-- 查看具体错误
SHOW SLAVE STATUSG
-- 常见解决方法
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
问题3:数据不一致
# 使用工具检查
sudo apt install percona-toolkit # Ubuntu
sudo yum install percona-toolkit # CentOS
# 检查数据一致性
pt-table-checksum h=192.168.1.10,u=root,p=password
九、安全建议
- 网络隔离:主从服务器应在同一安全网络
- 强密码策略:复制用户使用复杂密码
- 权限最小化:只授予必要的复制权限
- SSL加密:考虑启用SSL加密复制流量
- 定期监控:设置监控告警
- 备份策略:定期备份二进制日志
十、自动化脚本示例
10.1 一键部署脚本(主库)
#!/bin/bash
# master_setup.sh
MASTER_IP="192.168.1.10"
SLAVE_IP="192.168.1.11"
REPL_USER="repl"
REPL_PASSWORD="Repl@123456"
# 配置主库
cat >> /etc/my.cnf << EOF
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
EOF
systemctl restart mysqld
# 创建复制用户
mysql -u root -p << EOF
CREATE USER '${REPL_USER}'@'${SLAVE_IP}' IDENTIFIED BY '${REPL_PASSWORD}';
GRANT REPLICATION SLAVE ON *.* TO '${REPL_USER}'@'${SLAVE_IP}';
FLUSH PRIVILEGES;
EOF
echo "主库配置完成!"
注意事项
- 版本兼容性:主从MySQL版本尽量保持一致
- 数据一致性:部署前确保主库已有数据通过备份恢复到从库
- 时间同步:确保主从服务器时间同步
- 监控告警:建议部署监控系统(如Prometheus+Granafa)
- 定期维护:定期检查复制状态和日志文件
这个指南涵盖了MySQL主从复制部署的主要步骤。实际部署时,请根据具体环境调整配置参数。
CLOUD技术笔记