centos7 离线安装mysql8 并实现主从架构
centos7 离线安装mysql8 并实现主从架构
整体架构概述
主服务器 (Master): 负责处理写操作,并将数据的变更记录到二进制日志 (Binary Log) 中。
从服务器 (Slave): 从主服务器复制二进制日志,并在本地重放这些操作,以保持与主服务器的数据一致。
第一阶段:准备工作 (在主、从服务器上执行)
1. 环境确认
确保您有两台安装了 CentOS 7 的服务器,并且它们之间网络互通(可以互相 ping 通)。假设它们的 IP 地址如下:
主服务器 (Master): 192.168.88.128
从服务器 (Slave): 192.168.88.102
关闭防火墙和 SELinux(生产环境请谨慎操作,建议配置防火墙规则)
# 临时关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭 SELinux
setenforce 0
# 永久禁用 SELinux,需要重启生效
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2. 离线下载 MySQL 8 安装包
在一台有网络的机器上,访问 MySQL 官方 Yum 仓库或直接下载 RPM Bundle:
https://dev.mysql.com/downloads/mysql/
选择对应的版本,例如 Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit) 的 RPM Bundle (mysql-8.0.*-el7.x86_64.rpm-bundle.tar)。
将下载好的 mysql-8.0.*-el7.x86_64.rpm-bundle.tar 文件通过 U 盘或内部网络传输到两台 CentOS 7 服务器的相同目录下,例如 /opt/mysql。
3. 卸载系统自带的 MariaDB
CentOS 7 默认可能安装了 MariaDB,它会与 MySQL 冲突,必须先卸载。
# 检查是否已安装
rpm -qa | grep mariadb
# 如果存在,则卸载
rpm -e --nodeps mariadb-libs
第二阶段:离线安装 MySQL 8 (在主、从服务器上执行)
1. 解压并安装 RPM 包
进入存放安装包的目录。
cd /opt/mysql
tar -xvf mysql-8.0.*-el7.x86_64.rpm-bundle.tar
# 使用 rpm 命令按顺序安装必要的包
# 注意:安装顺序很重要,因为存在依赖关系。
rpm -ivh mysql-community-common-8.0.*.rpm
rpm -ivh mysql-community-client-plugins-8.0.*.rpm
rpm -ivh mysql-community-libs-8.0.*.rpm
rpm -ivh mysql-community-client-8.0.*.rpm
rpm -ivh mysql-community-icu-data-files-8.0.*.rpm
rpm -ivh mysql-community-server-8.0.*.rpm
# 如果想安装开发包,可以继续安装
# rpm -ivh mysql-community-devel-8.0.*.rpm
2. 初始化 MySQL 并设置开机自启
# 初始化数据库,会生成 root 的临时密码
mysqld --initialize --user=mysql --console
# 请务必记录最后一行显示的临时密码,例如:`[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Jqkfg&a!h1Q?`
查看 MySQL 日志:查看默认密码
MySQL 在安装和初始化时会记录一些信息,包括临时密码。你可以查看 MySQL 的错误日志文件来找到这个密码。通常,
日志文件的位置在 /var/log/mysqld.log 或 /var/log/mysql/mysql.log
# 更改数据目录的权限
chown -R mysql:mysql /var/lib/mysql/
# 启动 MySQL 服务并设置开机自启
systemctl start mysqld
systemctl enable mysqld
3. 修改 root 密码并进行安全设置
使用初始密码登录,并立即修改密码。
mysql -u root -p
# 输入刚才记录的临时密码
在 MySQL 提示符下执行:
-- 修改 root 用户密码,请将 'YourNewStrongPassword!123' 替换为你的强密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword!123';
-- 可选:运行安全安装脚本,可以移除测试数据库、匿名用户等
-- mysql_secure_installation 的命令行版本
DELETE FROM mysql.user WHERE User='';
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
message from server: "Host '192.168.88.1' is not allowed to connect to this MySQL server" 使用客户端连接报错
use mysql;
update user set host = '%' where user='root';
flush privileges;
如果使用的是 dbveaver 需要将alowPublickKeyRetrieval 的客户端配置值改为 true
第三阶段:配置主从复制
1. 配置主服务器 (Master: 192.168.1.128)
a. 编辑 MySQL 配置文件
vim /etc/my.cnf
[mysqld]
server-id = 1 # 服务器唯一ID,主从不能相同
log-bin = mysql-bin # 启用二进制日志
binlog_format = ROW # 推荐使用 ROW 格式
binlog-do-db = your_database_name # 可选:指定要复制的数据库,多个则写多行。不配置则复制所有库。
# binlog-ignore-db = mysql # 可选:指定忽略的数据库
# 8.0 版本新增,保证全局事务ID的一致性
gtid-mode = on
enforce-gtid-consistency = on
b. 重启 MySQL 服务使配置生效
c. 创建用于复制的用户
登录 MySQL:
mysql -u root -p
-- 创建一个用户 'repl',允许从 '192.168.1.102' 登录,密码为 'ReplPassword!123'
CREATE USER 'repl'@'192.168.1.102' IDENTIFIED WITH mysql_native_password BY 'ReplPassword!123';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.102';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看主服务器状态,记录 File 和 Position 的值(如果未开启GTID)
SHOW MASTER STATUS;
执行 SHOW MASTER STATUS; 后,会显示类似下面的信息,请记下 File 和 Position 的值(如果使用 GTID,则不需要这两个值)
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 155 | | | |
+------------------+----------+--------------+------------------+-------------------+
2. 配置从服务器 (Slave: 192.168.1.102)
vim /etc/my.cnf
[mysqld]
server-id = 2 # 服务器唯一ID,必须与主服务器不同
relay-log = mysql-relay-bin # 启用中继日志
read_only = 1 # 设置从库为只读(对拥有 SUPER 权限的用户无效)
# 8.0 版本新增,保证全局事务ID的一致性
gtid-mode = on
enforce-gtid-consistency = on
b. 重启 MySQL 服务使配置生效
systemctl restart mysqld
c. 配置主从复制链接
登录从服务器 MySQL:
mysql -u root -p
执行 SQL 来设置主库信息:
方法一:使用 GTID 方式(推荐,更简单)
CHANGE MASTER TO
MASTER_HOST='192.168.1.128',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPassword!123',
MASTER_AUTO_POSITION = 1;
方法二:使用传统的 binlog 文件位置方式(如果未启用 GTID)
CHANGE MASTER TO
MASTER_HOST='192.168.1.128',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPassword!123',
MASTER_LOG_FILE='mysql-bin.000001', -- 替换为主库 SHOW MASTER STATUS 查到的 File
MASTER_LOG_POS=155; -- 替换为主库 SHOW MASTER STATUS 查到的 Position
START SLAVE; -- 在 MySQL 8.0.22 及以下版本使用
-- 或
START REPLICA; -- 在 MySQL 8.0.23 及以上版本推荐使用
e. 检查从库复制状态
SHOW SLAVE STATUS\G -- 在 MySQL 8.0.22 及以下版本使用
-- 或
SHOW REPLICA STATUS\G -- 在 MySQL 8.0.23 及以上版本推荐使用
3. 验证主从复制
关键指标检查:
在 SHOW REPLICA STATUS\G 的输出中,查看以下两个关键参数:
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
如果这两个状态都是 Yes,则表示主从复制链路正常。
功能测试:
在主服务器上创建一个新数据库或一张新表,并插入一些数据。
CREATE DATABASE test_repl;
USE test_repl;
CREATE TABLE t1 (id INT, name VARCHAR(20));
INSERT INTO t1 VALUES (1, 'Master');
在从服务器上检查数据是否已同步。
USE test_repl;
SELECT * FROM t1;
如果能看到 (1, 'Master') 这条记录,说明主从复制成功!
常见问题与故障排除
Replica_IO_Running: Connecting
原因: 从服务器无法连接主服务器。
排查:
检查网络是否通畅:ping 192.168.1.100
检查主服务器防火墙是否关闭或是否放行了 3306 端口。
检查 CHANGE MASTER TO 语句中的 MASTER_HOST, MASTER_USER, MASTER_PASSWORD 是否正确。
在主服务器上检查 repl 用户的 host 限制是否正确。
Replica_SQL_Running: No 且报错 Error '...' on query
原因: 通常是因为从服务器上已经存在一些数据,与主服务器发过来的 SQL 冲突。
解决:
方法一(谨慎): 跳过这个错误(适用于测试环境)。STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
方法二(推荐): 重新初始化从库。先在主库做全量备份,然后在从库恢复,再重新配置主从。
UUID 冲突
现象: 如果克隆虚拟机,可能导致 auto.cnf 文件中的 server-uuid 相同。
解决: 删除从库的 auto.cnf 文件,重启 MySQL 服务会自动生成新的。
bash
rm -f /var/lib/mysql/auto.cnf
systemctl restart mysqld
CentOS 7 离线环境下 MySQL 8 的主从架构搭建完成!