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

8.5 KiB
Raw Permalink Blame History

下面是一份从零开始在 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';

应输出 ONROW1

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: Yes
  • Slave_SQL_Running: Yes
  • Seconds_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 信息进一步排查。