8.5 KiB
下面是一份从零开始在 CentOS 7 上安装 MySQL 5.7.44,并完成主从复制配置的完整文档。文档中会使用你实际的环境参数(主库 IP、复制账号密码、binlog 坐标等),可直接参考使用。
MySQL 5.7.44 主从复制部署文档(CentOS 7)
一、环境说明
| 角色 | IP 地址 | 主机名 | 说明 |
|---|---|---|---|
| 主库 | 10.101.2.197 | sh_2_197 | 已有业务数据,需要开启 binlog |
| 从库 | 待分配 | - | 全新安装的 MySQL 5.7.44 |
- 操作系统:CentOS 7.x
- MySQL 版本:5.7.44
- 安装方式:二进制包(tar.gz)
- 复制账号:
replicator/ 密码<)U]t3QiH] - 数据目录:
/usr/local/mysql/data
注意:所有命令建议使用
root用户执行,或通过sudo提权。
二、主库与从库共同操作(安装 MySQL 5.7.44)
以下步骤需要在主库和从库服务器上都执行。
2.1 下载并解压安装包
选择适合 CentOS 7 的包:mysql-5.7.44-el7-x86_64.tar.gz
# 安装依赖
yum install -y libaio numactl
# 创建 mysql 用户和组
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 上传安装包到 /root 或 /opt,然后解压到 /usr/local
cd /root
tar -zxvf mysql-5.7.44-el7-x86_64.tar.gz -C /usr/local/
# 重命名
cd /usr/local
mv mysql-5.7.44-el7-x86_64 mysql
2.2 创建数据目录并设置权限
cd /usr/local/mysql
mkdir -p data
chown -R mysql:mysql .
2.3 创建配置文件 /etc/my.cnf
主库配置(10.101.2.197):
[client]
default-character-set=utf8
socket=/tmp/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
user=mysql
pid-file=/usr/local/mysql/data/mysql.pid
log-error=/usr/local/mysql/data/error.log
character-set-server=utf8
collation-server=utf8_general_ci
# 主库特有配置
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7
从库配置(待分配 IP):
[client]
default-character-set=utf8
socket=/tmp/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
user=mysql
pid-file=/usr/local/mysql/data/mysql.pid
log-error=/usr/local/mysql/data/error.log
character-set-server=utf8
collation-server=utf8_general_ci
# 从库特有配置
server-id = 2
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
read_only = ON
2.4 初始化数据库
仅在新安装时执行(如果主库已有数据,跳过初始化,直接使用现有数据)。
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
# 记录临时 root 密码
grep 'temporary password' /usr/local/mysql/data/error.log
2.5 启动 MySQL
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
检查进程和端口:
ps aux | grep mysqld
netstat -tulnp | grep 3306
2.6 设置 root 密码
用临时密码登录后修改(密码示例:by2024_trader!#):
/usr/local/mysql/bin/mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'by2024_trader!#';
FLUSH PRIVILEGES;
EXIT;
三、主库额外配置(复制账号与备份)
3.1 创建复制账号
登录主库:
CREATE USER 'replicator'@'%' IDENTIFIED BY '<)U]t3QiH]';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
验证:
SELECT User, Host FROM mysql.user WHERE User='replicator';
3.2 确认主库 binlog 状态
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';
SHOW VARIABLES LIKE 'server_id';
应输出 ON、ROW、1。
3.3 使用 mysqldump 创建一致性备份并记录坐标
在主库执行:
/usr/local/mysql/bin/mysqldump -u root -p'by2024_trader!#' \
--single-transaction \
--master-data=2 \
--all-databases \
--routines --events --triggers \
> /tmp/all_dbs.sql
从备份文件中提取 binlog 坐标:
head -100 /tmp/all_dbs.sql | grep "CHANGE MASTER TO"
输出示例:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000170', MASTER_LOG_POS=203801517;
记下这两个值,后续从库配置时需要用到。
3.4 将备份文件传输到从库
scp /tmp/all_dbs.sql root@<从库IP>:/tmp/
四、从库配置(导入数据并启动复制)
4.1 导入全量备份
前提:从库 MySQL 已安装并启动,但除系统库外无其他业务数据(或允许覆盖数据)。
/usr/local/mysql/bin/mysql -u root -p'从库当前root密码或临时密码' < /tmp/all_dbs.sql
导入后,从库的 root 密码会变成与主库一致(
by2024_trader!#)。如果忘记当前密码,可使用--skip-grant-tables方式重置。
4.2 配置复制
登录从库 MySQL:
CHANGE MASTER TO
MASTER_HOST='10.101.2.197',
MASTER_USER='replicator',
MASTER_PASSWORD='<)U]t3QiH]',
MASTER_LOG_FILE='mysql-bin.000170', -- 替换为实际值
MASTER_LOG_POS=203801517; -- 替换为实际值
START SLAVE;
4.3 检查复制状态
SHOW SLAVE STATUS\G
关键字段需为:
Slave_IO_Running: YesSlave_SQL_Running: YesSeconds_Behind_Master: 0(或逐渐减少)Last_IO_Error/Last_SQL_Error为空
4.4 设置从库只读(持久化)
在线生效:
SET GLOBAL read_only = ON;
同时已在 /etc/my.cnf 中包含 read_only = ON,确保重启后生效。
4.5 将 MySQL 加入 systemd(可选)
创建 /etc/systemd/system/mysql.service:
[Unit]
Description=MySQL Server
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=5000
[Install]
WantedBy=multi-user.target
启用并启动:
systemctl daemon-reload
systemctl enable mysql
systemctl start mysql
五、验证主从同步
5.1 在主库创建测试数据
CREATE DATABASE test_repl;
USE test_repl;
CREATE TABLE t1 (id INT PRIMARY KEY);
INSERT INTO t1 VALUES (1),(2),(3);
5.2 在从库查询
USE test_repl;
SELECT * FROM t1;
应返回相同数据。
5.3 查看从库状态
SHOW SLAVE STATUS\G
确认 Seconds_Behind_Master 为 0。
六、日常维护与监控
6.1 常用监控命令
- 查看主库状态:
SHOW MASTER STATUS; - 查看从库状态:
SHOW SLAVE STATUS\G - 暂停复制:
STOP SLAVE; - 恢复复制:
START SLAVE; - 跳过错误(慎用):
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;
6.2 主库 binlog 清理
设置自动清理(已在配置中添加 expire_logs_days = 7),也可手动:
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 7 DAY;
6.3 从库 relay log 管理
从库会自动清理已应用的 relay log,一般无需手动干预。
七、常见问题与解决方法
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
Slave_IO_Running: Connecting |
网络不通 / 复制账号权限不足 | 检查防火墙、MySQL 端口;确认 replicator 用户有 REPLICATION SLAVE 权限 |
Last_IO_Error: Got fatal error 1236 |
binlog 坐标错误或文件已被清理 | 重新执行 mysqldump 并记录正确坐标 |
Last_SQL_Error: Duplicate entry |
从库已经存在该行数据 | 使用 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1 跳过,或重建从库 |
Seconds_Behind_Master 持续增长 |
从库性能不足 / 主库写入量大 | 开启并行复制(slave_parallel_workers=4) |
| 导入备份后 root 密码不对 | 备份覆盖了 mysql.user |
使用主库的 root 密码登录;或通过 --skip-grant-tables 重置 |
八、文档附录
8.1 使用的文件路径
- 安装目录:
/usr/local/mysql - 数据目录:
/usr/local/mysql/data - 配置文件:
/etc/my.cnf - 错误日志:
/usr/local/mysql/data/error.log - binlog 位置:
/usr/local/mysql/data/mysql-bin.* - relay log 位置:
/usr/local/mysql/data/slave-relay-bin.*
8.2 密码清单
| 用途 | 账号 | 密码 | 备注 |
|---|---|---|---|
| 主库 root | root | by2024_trader!# |
从库导入后相同 |
| 复制账号 | replicator | <)U]t3QiH] |
仅用于主从同步 |
安全提醒:生产环境请使用复杂密码并定期更换,上述密码仅供测试参考。
文档结束。按照以上步骤操作,你应该能完成 MySQL 5.7.44 在 CentOS 7 上的安装和主从复制配置。如有问题,可根据错误日志和 SHOW SLAVE STATUS 信息进一步排查。