wei/个人文档/mysql主从.md
2026-06-04 13:57:41 +08:00

380 lines
8.5 KiB
Markdown
Raw 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.

下面是一份从零开始在 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` 信息进一步排查。