Rocky Linux 8 安装 MySQL 5.7(仓库安装)SOP
说明:MySQL 5.7 已 EOL,仅在确有兼容需求时短期使用。官方 EL8 仓库已不再提供 5.7,我们采用创建 repo,指向官方 EL7 的 5.7 仓库的方式在 Rocky 8 安装(依旧属于“仓库安装”)。 本 SOP 默认你以
root
或sudo
执行。
0. 环境确认与准备
# 查看系统版本(确保是 Rocky Linux 8)
cat /etc/os-release
uname -r
# 基础更新与工具(含 repo 管理插件)
dnf -y update
dnf -y install dnf-plugins-core
# Rocky8 某些依赖在 CRB/PowerTools
dnf config-manager --set-enabled crb || true
dnf config-manager --set-enabled powertools || true
# 如系统中已安装 MariaDB/MySQL,请先备份数据!
1. 关闭系统自带 mysql 模块(避免遮蔽)
dnf -y module reset mysql
dnf -y module disable mysql
2. 创建 MySQL 5.7 仓库文件(指向官方 EL7 仓库)
tee /etc/yum.repos.d/mysql57-community.repo >/dev/null <<'EOF'
[mysql57-community]
name=MySQL 5.7 Community Server (EL7 packages)
baseurl=https://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
# 同时声明多把官方公钥,避免“钥匙不匹配”
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
# 避免被模块化遮蔽
module_hotfixes=1
EOF
# 导入官方 GPG Key(含旧钥匙与 2022/2023 新钥匙)
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
# 刷新缓存
dnf clean all
rm -rf /var/cache/dnf
dnf -y makecache
3. 预装依赖(解决 .so.5 兼容、网络工具等)
# Rocky8 提供 ncurses-compat-libs(提供 libncurses.so.5 / libtinfo.so.5)
dnf -y install ncurses-compat-libs net-tools libaio numactl-libs perl perl-Data-Dumper
若提示找不到
ncurses-compat-libs
,请先确认crb/powertools
已启用;仍无则dnf provides '*/libtinfo.so.5'
查看何者提供。
4. 安装 MySQL 5.7(仓库安装)
# 直接从我们新建的 mysql57-community 仓库安装
dnf -y install --enablerepo=mysql57-community mysql-community-server
如遇 GPG check FAILED:
确认已导入三把 key(见第 2 步);
极少数镜像/策略导致签名算法受限,可暂时放宽系统加密策略以通过旧包签名(装完记得恢复):
update-crypto-policies --show # 一般为 DEFAULT update-crypto-policies --set DEFAULT:SHA1 # 或不足时用 LEGACY dnf clean all && rm -rf /var/cache/dnf dnf -y install --enablerepo=mysql57-community mysql-community-server update-crypto-policies --set DEFAULT # 安装完成后立刻恢复
5. 启动与初始化 root 密码
# 启动并设为开机自启
systemctl enable --now mysqld
# 取初始化临时密码(复制最后一条)
grep 'temporary password' /var/log/mysqld.log | tail -1
# 仅取口令字段
awk '/temporary password/ {print $NF}' /var/log/mysqld.log | tail -1
# 使用“单引号 + 过期口令”的方式登录并立即改强口令
mysql --connect-expired-password -uroot -p'【把上面的临时口令原样粘贴】' <<'SQL'
-- 如复杂度太严可临时放宽一次(可选)
SET GLOBAL validate_password_policy = LOW;
SET GLOBAL validate_password_length = 8;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'My57!Root#2025';
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
SQL
若仍报 1045 进不去,可用一次性 init-file 方式强制改密(更安全):
systemctl stop mysqld cat >/root/mysql-init.sql <<'SQL' ALTER USER 'root'@'localhost' IDENTIFIED BY 'My57!Root#2025'; ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; SQL chmod 600 /root/mysql-init.sql /usr/sbin/mysqld --user=mysql --init-file=/root/mysql-init.sql & sleep 8 pkill -f -- "--init-file=/root/mysql-init.sql" || true rm -f /root/mysql-init.sql systemctl start mysqld mysql -uroot -p'My57!Root#2025' -e "SELECT VERSION();"
6.(可选)开启远程访问(两种方式)
6.1 放开监听 + 防火墙
# 确认 3306 监听
ss -lntp | grep :3306 || true
# 如仅 127.0.0.1,编辑 /etc/my.cnf 或 /etc/my.cnf.d/server.cnf,在 [mysqld] 段:
# bind-address=0.0.0.0 (或直接注释 bind-address)
# 可选择加速名解析:
# skip-name-resolve
# 保存后重启
systemctl restart mysqld
# 防火墙放行 3306
firewall-cmd --add-service=mysql --permanent || firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
6.2 账号授权(建议“远程用新管理员账号”,root 仅限本机)
更安全做法(推荐):
mysql -uroot -p'My57!Root#2025' <<'SQL'
CREATE USER IF NOT EXISTS 'dba'@'10.20.30.%' IDENTIFIED BY 'Str0ng!Pass#2025';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'10.20.30.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
SQL
若确需 root 远程:
mysql -uroot -p'My57!Root#2025' <<'SQL'
CREATE USER IF NOT EXISTS 'root'@'10.20.30.%' IDENTIFIED BY 'My57!Root#2025';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.20.30.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
SQL
(可选)强制加密传输:
# 生成 SSL 证书(首次)
mysql_ssl_rsa_setup
systemctl restart mysqld
# 要求远程必须使用 SSL(示例对 root@%)
mysql -uroot -p'My57!Root#2025' -e "ALTER USER 'root'@'%' REQUIRE SSL;"
7. 基本调优与开箱即用建议(可按需落盘到 /etc/my.cnf)
cp -a /etc/my.cnf /etc/my.cnf.bak.$(date +%F)
cat >/etc/my.cnf.d/10-basic.cnf <<'CFG'
[mysqld]
# 生产机器记得按内存大小调整
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
# 慢日志(便于排障)
slow_query_log = ON
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 1
#(可选)监听与解析
#bind-address = 0.0.0.0
#skip-name-resolve
CFG
systemctl restart mysqld
8. 验证
mysql -uroot -p'My57!Root#2025' -e "SELECT VERSION();"
ss -lntp | grep :3306
systemctl status mysqld --no-pager
9. 常见报错与处理
找不到
mysql-community-server
/ 总是拉到 8.x 已执行:dnf module disable mysql
;确认/etc/yum.repos.d/mysql57-community.repo
的baseurl
正确、enabled=1
、module_hotfixes=1
。dnf repolist --enabled | egrep -i 'mysql|baseos|appstream|crb|powertools'
缺
libtinfo.so.5
/libncurses.so.5
dnf -y install ncurses-compat-libs
GPG check FAILED 先导入三把 key(见第 2 步);仍失败则临时
update-crypto-policies --set DEFAULT:SHA1
安装,完成后立刻--set DEFAULT
恢复。与 MariaDB 冲突
dnf -y remove mariadb-connector-c mariadb-libs mariadb-* dnf -y install mysql-community-libs-compat dnf -y install --enablerepo=mysql57-community mysql-community-server
root 无法登录 / 初始口令含特殊符号 使用
mysql --connect-expired-password -uroot -p'临时口令'
(单引号);或按第 5 步的 init-file 方案强制改密。
10. 卸载(如需回滚)
systemctl stop mysqld
dnf -y remove mysql-community-server mysql-community-client mysql-community-libs mysql-community-common
rm -rf /var/lib/mysql /var/log/mysqld.log /var/log/mysql-slow.log
rm -f /etc/yum.repos.d/mysql57-community.repo
⚠️ 卸载会删除数据目录(上面命令包含
rm -rf /var/lib/mysql
),务必先备份。