380 lines
8.5 KiB
Markdown
380 lines
8.5 KiB
Markdown
下面是一份从零开始在 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`
|
||
|
||
```bash
|
||
# 安装依赖
|
||
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 创建数据目录并设置权限
|
||
|
||
```bash
|
||
cd /usr/local/mysql
|
||
mkdir -p data
|
||
chown -R mysql:mysql .
|
||
```
|
||
|
||
### 2.3 创建配置文件 `/etc/my.cnf`
|
||
|
||
**主库配置**(`10.101.2.197`):
|
||
|
||
```ini
|
||
[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):
|
||
|
||
```ini
|
||
[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 初始化数据库
|
||
|
||
**仅在新安装时执行**(如果主库已有数据,跳过初始化,直接使用现有数据)。
|
||
|
||
```bash
|
||
/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
|
||
|
||
```bash
|
||
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
|
||
```
|
||
|
||
检查进程和端口:
|
||
|
||
```bash
|
||
ps aux | grep mysqld
|
||
netstat -tulnp | grep 3306
|
||
```
|
||
|
||
### 2.6 设置 root 密码
|
||
|
||
用临时密码登录后修改(密码示例:`by2024_trader!#`):
|
||
|
||
```bash
|
||
/usr/local/mysql/bin/mysql -uroot -p
|
||
```
|
||
|
||
```sql
|
||
ALTER USER 'root'@'localhost' IDENTIFIED BY 'by2024_trader!#';
|
||
FLUSH PRIVILEGES;
|
||
EXIT;
|
||
```
|
||
|
||
---
|
||
|
||
## 三、主库额外配置(复制账号与备份)
|
||
|
||
### 3.1 创建复制账号
|
||
|
||
登录主库:
|
||
|
||
```sql
|
||
CREATE USER 'replicator'@'%' IDENTIFIED BY '<)U]t3QiH]';
|
||
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
|
||
FLUSH PRIVILEGES;
|
||
```
|
||
|
||
验证:
|
||
|
||
```sql
|
||
SELECT User, Host FROM mysql.user WHERE User='replicator';
|
||
```
|
||
|
||
### 3.2 确认主库 binlog 状态
|
||
|
||
```sql
|
||
SHOW VARIABLES LIKE 'log_bin';
|
||
SHOW VARIABLES LIKE 'binlog_format';
|
||
SHOW VARIABLES LIKE 'server_id';
|
||
```
|
||
|
||
应输出 `ON`、`ROW`、`1`。
|
||
|
||
### 3.3 使用 mysqldump 创建一致性备份并记录坐标
|
||
|
||
在主库执行:
|
||
|
||
```bash
|
||
/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 坐标:
|
||
|
||
```bash
|
||
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 将备份文件传输到从库
|
||
|
||
```bash
|
||
scp /tmp/all_dbs.sql root@<从库IP>:/tmp/
|
||
```
|
||
|
||
---
|
||
|
||
## 四、从库配置(导入数据并启动复制)
|
||
|
||
### 4.1 导入全量备份
|
||
|
||
**前提**:从库 MySQL 已安装并启动,但除系统库外无其他业务数据(或允许覆盖数据)。
|
||
|
||
```bash
|
||
/usr/local/mysql/bin/mysql -u root -p'从库当前root密码或临时密码' < /tmp/all_dbs.sql
|
||
```
|
||
|
||
> 导入后,从库的 root 密码会变成与主库一致(`by2024_trader!#`)。如果忘记当前密码,可使用 `--skip-grant-tables` 方式重置。
|
||
|
||
### 4.2 配置复制
|
||
|
||
登录从库 MySQL:
|
||
|
||
```sql
|
||
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 检查复制状态
|
||
|
||
```sql
|
||
SHOW SLAVE STATUS\G
|
||
```
|
||
|
||
关键字段需为:
|
||
|
||
- `Slave_IO_Running: Yes`
|
||
- `Slave_SQL_Running: Yes`
|
||
- `Seconds_Behind_Master: 0`(或逐渐减少)
|
||
- `Last_IO_Error` / `Last_SQL_Error` 为空
|
||
|
||
### 4.4 设置从库只读(持久化)
|
||
|
||
在线生效:
|
||
|
||
```sql
|
||
SET GLOBAL read_only = ON;
|
||
```
|
||
|
||
同时已在 `/etc/my.cnf` 中包含 `read_only = ON`,确保重启后生效。
|
||
|
||
### 4.5 将 MySQL 加入 systemd(可选)
|
||
|
||
创建 `/etc/systemd/system/mysql.service`:
|
||
|
||
```ini
|
||
[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
|
||
```
|
||
|
||
启用并启动:
|
||
|
||
```bash
|
||
systemctl daemon-reload
|
||
systemctl enable mysql
|
||
systemctl start mysql
|
||
```
|
||
|
||
---
|
||
|
||
## 五、验证主从同步
|
||
|
||
### 5.1 在主库创建测试数据
|
||
|
||
```sql
|
||
CREATE DATABASE test_repl;
|
||
USE test_repl;
|
||
CREATE TABLE t1 (id INT PRIMARY KEY);
|
||
INSERT INTO t1 VALUES (1),(2),(3);
|
||
```
|
||
|
||
### 5.2 在从库查询
|
||
|
||
```sql
|
||
USE test_repl;
|
||
SELECT * FROM t1;
|
||
```
|
||
|
||
应返回相同数据。
|
||
|
||
### 5.3 查看从库状态
|
||
|
||
```sql
|
||
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`),也可手动:
|
||
|
||
```sql
|
||
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` 信息进一步排查。 |