尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RHEL 8 安装 MySQL 9.1 完整指南:从 Yum 源配置到远程访问排查

RHEL 8 安装 MySQL 9.1 完整指南:从 Yum 源配置到远程访问排查 在 Red Hat Enterprise Linux 8 上装 MySQL 9.1说难不难说简单也容易踩坑。我前阵子刚好在一台全新的 RHEL 8 服务器上从零部署 MySQL 9.1中间遇到了一堆源、依赖、认证相关的坑花了一下午才顺利跑起来。这篇文章就把我这次完整操作过程记录下来包括更换 yum 源、添加 MySQL 官方仓库、初始化数据库、改密码、开放远程访问以及几个典型报错的排查思路。无论你是刚入门的运维还是需要在测试环境快速装库的开发者都可以直接照着走一遍。需要注意MySQL 9.1 属于创新版本特性更新比较激进如果你要在生产环境长期使用我更推荐等 8.4 LTS 渠道。但如果你想尝鲜新特性或者只是搭个实验环境9.1 完全可以跑。下面所有步骤我都基于 RHEL 8.8 验证过CentOS 8、Rocky Linux 8、AlmaLinux 8 同样适用。1. 安装前的环境准备1.1 检查系统版本与基础配置动手安装前先把系统基本信息确认一遍避免装到一半才发现架构不匹配。先看系统版本cat /etc/redhat-release如果输出是Red Hat Enterprise Linux release 8.x (Ootpa)那就没问题。还要确认 CPU 架构MySQL 9.1 官方提供了 x86_64 和 aarch64 两种 RPM 包如果你的服务器是 ARM 架构后面下载仓库包时也要选对应版本uname -m接着看一下内存和磁盘空间。MySQL 9.1 最低内存要求是 512MB但实际跑起来建议至少 2GB磁盘剩余空间至少有 5GB 以上因为 MySQL 数据文件、binlog、undo log 都比较占空间。我这次装的服务器是 8GB 内存、100GB 磁盘比较充裕。如果空间不足建议先清理日志或挂载新盘不然数据库初始化到一半磁盘满了报错会很莫名其妙。还有一个基础要求RHEL 8 自带的 glibc 版本是 2.28满足 MySQL 9.1 对 glibc 的要求所以不需要额外升级系统组件。这点放心。1.2 更换 yum 源与安装依赖RHEL 8 原生的 yum 源需要订阅才能正常使用很多服务器还没有注册直接dnf update会报错。这时候我建议先更换为国内镜像源或者用本地 ISO 源。我这次是直接配置了阿里云的镜像源操作很简单先把原有的 repo 文件备份mkdir -p /etc/yum.repos.d/backup cp /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/然后创建一个新的源配置文件内容大致是 BaseOS 和 AppStream 两个仓库注意路径里的版本号要和系统一致。RHEL 8 的 BaseOS 对应的是基础运行时组件AppStream 是应用和运行时库这两个仓库缺一不可。如果系统已经能正常访问官方源那这一步可以跳过但国内服务器普遍访问官方源非常慢所以换源几乎是必做的。换完源后执行dnf clean all dnf makecache dnf update -y更新完系统后安装 MySQL 需要的依赖包。MySQL 9.1 在 RHEL 8 上运行需要libaio这个异步 IO 库最小化安装的 RHEL 8 通常没有。另外ncurses-compat-libs和numactl也建议提前装上避免后面启动报错dnf install -y libaio ncurses-compat-libs numactl同时安装一些排查工具后面用得到dnf install -y wget vim net-tools tar gzip这里尤其推荐net-tools因为它提供netstat命令后面排查端口监听情况非常有用。如果你用的是最小化系统perl可能也没装MySQL 的某些脚本会依赖 perl所以也顺手装上dnf install -y perl依赖装齐后进行到下一步。2. 获取 MySQL 9.1 安装包2.1 选择安装方式官方 Yum 仓库 vs RPM Bundle vs Docker安装 MySQL 的方式有好几种我简单对比一下大家按自己场景选择。方式优点缺点适用场景官方 Yum 仓库自动处理依赖、后续可dnf update需要联网访问速度可能慢大多数联网环境RPM Bundle 手动安装离线可用、可控性强依赖需要手动解决麻烦内网隔离环境Docker 容器部署快、隔离性好性能损耗、数据持久化需要额外配置开发测试、微服务环境我这次首选官方 Yum 仓库因为依赖处理最省心而且后续小版本升级只需要dnf update就能完成。如果你在内网不能访问外网那就下载 RPM Bundle 包包括 server、client、common、libs 四个核心包手动用rpm -ivh安装。打包安装的时候要注意安装顺序common → libs → client → server否则会报缺少依赖。Docker 方式虽然也很快但既然题目是 RedHat8 安装原生 MySQL我们还是聚焦在 RPM 方式上。2.2 添加 MySQL 官方 Yum 仓库MySQL 官方提供了专门的 Yum 仓库 RPM 包名字类似mysql91-community-release-el8-1.noarch.rpm。不同版本号可能有变化但命名规律是固定的。下载并安装wget https://repo.mysql.com/mysql91-community-release-el8-1.noarch.rpm rpm -ivh mysql91-community-release-el8-1.noarch.rpm安装完仓库包后查看是否生成了对应的 repodnf repolist | grep mysql正常会看到mysql-9.1-community和mysql-tools-9.1-community之类的仓库名。如果你只想安装 9.1建议把仓库配置文件里其他版本比如 8.4的 enabled 改为 0只保留 9.1 的仓库启用。这一步很重要因为 MySQL 官方仓库经常会同时提供多个版本如果不做限制安装时可能会解析到最新版本而不是你想要的 9.1。可以在/etc/yum.repos.d/mysql-community.repo里检查一下vim /etc/yum.repos.d/mysql-community.repo找到[mysql-9.1-community]段落确保enabled1其他比如[mysql-8.4-community]段落设成enabled0。这样就能精确安装 9.1。2.3 安装 mysql-community-server仓库配置好后直接安装dnf install -y mysql-community-server这个命令会自动安装mysql-community-server、mysql-community-client、mysql-community-common、mysql-community-libs四个包。如果之前系统里装了 MariaDB 的库文件这里可能会报冲突后面第 4 节我会专门讲。安装完成后确认版本mysqld --version看到类似mysqld Ver 9.1.0 for Linux on x86_64 (MySQL Community Server)的输出就说明安装成功了。到这里MySQL 程序本身已经就绪下面进入初始化和配置阶段。3. 初始化配置 MySQL 9.13.1 启动服务与获取临时密码MySQL 9.1 安装后不会自动启动需要手动用 systemd 启动systemctl start mysqld systemctl enable mysqld systemctl status mysqld正常执行完start后MySQL 会在首次启动时自动完成数据目录初始化并生成一个 root 临时密码记录在错误日志里。查看日志grep temporary password /var/log/mysqld.log如果日志里有类似这句话[Note] A temporary password is generated for rootlocalhost: xxxxxxxx后面的xxxxxxxx就是临时密码。如果没看到可以尝试cat /var/log/mysqld.log | grep password注意首次启动时 MySQL 初始化需要一点时间如果grep不到多等几秒再试。如果日志路径不对先看/etc/my.cnf里log_error配置项或者直接查find / -name *.err 2/dev/null我遇到过日志文件在/var/lib/mysql/mysql.err的情况排查时别只盯着/var/log/mysqld.log。拿到临时密码后登录 rootmysql -uroot -p输入临时密码后进入 MySQL 命令行。这时第一件事就是修改 root 密码ALTER USER rootlocalhost IDENTIFIED BY YourStrongPass!;MySQL 9.1 默认密码策略要求至少 8 位包含大小写字母、数字和特殊字符。如果嫌麻烦可以先降低策略再改密码SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6; ALTER USER rootlocalhost IDENTIFIED BY 123456;但生产环境不建议这样做弱密码很容易被扫描工具爆破。3.2 手动初始化数据目录的补充说明虽然用systemctl start mysqld自动初始化很方便但有些场景需要手动初始化比如要指定数据目录、字符集或者之前装过其他版本想彻底重置。手动初始化有两种方式mysqld --initialize --usermysql这种方式会生成随机临时密码和自动初始化类似。如果想生成空密码的 root 账号方便首次登录则用mysqld --initialize-insecure --usermysql用--initialize-insecure初始化后rootlocalhost 是无密码状态可以直接mysql -uroot登录适合一次性测试环境。无论用哪种方式都要确保数据目录/var/lib/mysql的属主是mysql:mysqlchown -R mysql:mysql /var/lib/mysql否则初始化会直接报权限不足错误。如果你之前装过旧版本 MySQL数据目录里有残留文件初始化前需要清空。我的经验是不要直接rm -rf /var/lib/mysql万一误删其他依赖这个目录的服务就麻烦了。先看一下目录里是否有重要数据确认没有后可以只删除里面的数据文件rm -rf /var/lib/mysql/*然后再执行初始化。注意这个操作不可逆生产环境千万不要乱来。3.3 设置远程访问与安全策略MySQL 安装好后默认 root 只允许从本机登录。如果你需要从其他机器用 Navicat、DBeaver 或 Workbench 连接需要创建一个远程账号并授权CREATE USER appuser% IDENTIFIED BY AnotherStrongPass!; GRANT ALL PRIVILEGES ON *.* TO appuser%; FLUSH PRIVILEGES;这里的%表示允许任意主机连接如果你只想让某个 IP 访问就写具体 IP比如appuser192.168.1.100。接着修改 MySQL 监听地址默认只监听 127.0.0.1需要改成监听所有网卡vim /etc/my.cnf在[mysqld]段下增加bind-address0.0.0.0然后重启systemctl restart mysqld这一步之后就涉及防火墙了。RHEL 8 默认启用 firewalld需要放行 3306 端口firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload查看是否生效firewall-cmd --list-ports如果之前已经改过 SELinux通常 MySQL 的官方 RPM 包会自带 SELinux 策略不需要额外处理。但如果你发现远程连接还是被拒绝可以临时关闭 SELinux 测试setenforce 0如果确认是 SELinux 问题再针对性调整策略不要长期关闭。我实际遇到的情况是防火墙没放行SELinux 反而是没问题的所以排查优先级先防火墙面再考虑 SELinux。4. 常见问题与排查技巧4.1 依赖缺失与 yum 源冲突安装过程中最容易碰到的问题就是依赖。常见报错有Error: Package: mysql-community-server-9.1.0-1.el8.x86_64 (mysql-9.1-community) Requires: libaio.so.1()(64bit)这是最典型的缺少libaio依赖。解决办法很简单dnf install -y libaio还有可能会需要numactldnf install -y numactl另外RHEL 8 系统有时会预装 MariaDB 的库文件导致 MySQL 安装时冲突Error: mysql-community-libs-9.1.0-1.el8.x86_64 conflicts with mariadb-libs-8.0.36-1.el8.x86_64这种情况最干净的做法是把 MariaDB 的库卸载掉dnf remove -y mariadb-libs卸载前先确认没有其他应用依赖mariadb-libs用rpm -q mariadb-libs查看一下。如果确实有应用依赖可以试试用--allowerasing让 dnf 自己解决但我不推荐容易把系统组件一起卸掉后续可能有意想不到的问题。4.2 无法连接 MySQL 的排查思路远程连接 MySQL 失败是最高频的问题我按照实际排查顺序整理了一个速查表。现象排查命令解决方案服务没启动systemctl status mysqldsystemctl start mysqld端口没监听netstat -tlnp | grep 3306检查 bind-address 配置防火墙拦截firewall-cmd --list-ports放行 3306 端口账号 host 不对SELECT user,host FROM mysql.user;创建user%账号客户端认证插件不支持看客户端版本升级客户端到 8.0我遇到过一个非常隐蔽的坑bind-address配置写成了127.0.0.1然后netstat显示 3306 端口只监听本机远程当然连不上。后来改成0.0.0.0才解决。建议每次改完配置后都执行netstat -tlnp | grep 3306确认监听地址是0.0.0.0再继续。关于认证插件MySQL 9.1 默认使用caching_sha2_password插件这个插件要求客户端版本较新。如果你用的是特别老的 MySQL 客户端或者 JDBC 驱动可能会出现Authentication plugin caching_sha2_password cannot be loaded这个问题最好是升级客户端驱动而不是去改服务端认证插件因为mysql_native_password在 MySQL 9.x 里已经逐渐被弃用。我建议使用 MySQL 官方提供的 Connector/J 8.0或者新版命令行客户端。4.3 忘记 root 密码与日志排查忘记 root 密码几乎是每个人都会遇到的情况。MySQL 9.1 可以用跳过授权表的方式重置密码思路和旧版本一样但操作要小心。首先停止服务systemctl stop mysqld然后修改配置文件在[mysqld]段添加skip-grant-tables skip-networkingskip-networking是防止跳过授权表后其他机器也能无密码连接极其危险。重启 MySQLsystemctl start mysqld mysql -uroot进入后先刷新权限FLUSH PRIVILEGES;然后重新设置 root 密码ALTER USER rootlocalhost IDENTIFIED BY NewStrongPass!;执行完把配置里skip-grant-tables和skip-networking两行注释掉重启 MySQL 即可。如果ALTER USER报错可以改用UPDATE mysql.user SET authentication_string WHERE Userroot;然后再用新密码登录但这种方式在不同版本上有差异不推荐。我更推荐直接用ALTER USER这才是 MySQL 8.0 的标准做法。如果 MySQL 启动失败优先看日志journalctl -u mysqld -n 50或者查看错误日志文件常见位置/var/log/mysqld.log /var/lib/mysql/mysql.err启动失败的原因很多比如数据目录权限、SELinux 拦截、内存不足等日志里都会有明确记录。我碰到过一次数据目录属主被改成了 root导致启动失败日志里写得很清楚[ERROR] Could not open file /var/lib/mysql/mysql.ibd for writing: Permission denied解决办法就是chown -R mysql:mysql /var/lib/mysql。5. 安装完成后的运维延伸5.1 使用管理工具连接 MySQLMySQL 装好之后日常管理可以用命令行也可以装图形化工具。命令行最常用mysql -u root -p展示数据库列表SHOW DATABASES;切换数据库USE mysql;查看所有用户SELECT user, host, plugin FROM mysql.user;如果你更喜欢图形化工具推荐 MySQL Workbench 或者 DBeaver。在 RHEL 8 上安装 MySQL Workbench 可以用官方仓库dnf install -y mysql-workbench-community但这个包依赖很多图形库如果服务器没有图形界面装起来很鸡肋。我更建议在本地电脑上装 DBeaver 或 Navicat然后远程连接。远程连接时记得连接信息里的主机名填服务器 IP端口 3306用户名用之前创建的appuser密码填授权时设置的密码。5.2 开机自启与基础调优安装完 MySQL 后建议设置开机自启systemctl enable mysqld这样服务器重启后 MySQL 会自动拉起不需要手动登录去启动。基础调优方面最重要的参数是innodb_buffer_pool_size它决定了 InnoDB 缓冲池大小通常设置为物理内存的 60%~70%。查看当前值SHOW VARIABLES LIKE innodb_buffer_pool_size;修改/etc/my.cnf[mysqld] innodb_buffer_pool_size 4G然后重启systemctl restart mysqld对于 8GB 内存的服务器设置 4G 比较合理。太小会导致磁盘 IO 频繁太大会导致系统内存不足。另外max_connections也需要关注默认是 151如果并发连接数高可以适当调大max_connections 300但我建议不要一次性调太大连接数过多会占用大量内存具体要根据实际业务场景来评估。5.3 后续学习方向安装只是第一步MySQL 真正难的是使用和调优。如果你刚接触 MySQL建议接下来重点学习几个方向索引优化理解 B 树、联合索引、覆盖索引看看EXPLAIN输出这是 SQL 性能调优的基礎。事务与锁了解 InnoDB 的隔离级别、行锁、间隙锁避免并发更新时出现死锁。备份与恢复掌握mysqldump和xtrabackup的使用定期备份数据库。主从复制学习 binlog 和 GTID搭建一主一从或一主多从提高可用性。这些内容每一个都能写好几篇长文你可以先从官方文档开始再结合实际业务场景慢慢积累经验。整个安装过程踩下来我最大的感受是RHEL 8 上装 MySQL 9.1 本身不难难的是处理好系统环境和依赖细节。建议新手在动手前先把第 1 节的依赖全部装齐不要等到启动报错再回来补。个人经验是更换 yum 源后一定要先验证仓库可用性很多安装失败都是源没配对导致解析不到包。另外一个容易被忽略的点是MySQL 9.1 作为创新版本升级策略比较激进生产环境如果追求稳定建议选择 8.4 LTS 版本。如果你只是测试新功能9.1 完全值得一试。
返回列表