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