
红帽系Linux安装MySQL的完整实操记录做运维这些年被问得最多的一个问题是“为什么我在红帽系统上装MySQL总是失败”其实大多数时候不是操作不对而是没有搞懂红帽系的包管理套路。红帽版Linux含RHEL、CentOS、Rocky Linux、AlmaLinux等和Debian系的Ubuntu在装MySQL这件事上完全是两条路——一个用rpm和yum/dnf一个用dpkg和apt连默认的数据库都不是同一家。这篇就把我在红帽系服务器上装MySQL的全过程、踩过的坑和最终稳定运行的方案一次性说清楚。这篇文章适合三类人刚接手红帽系服务器、需要在上面部署MySQL的运维新人被“装完启动报错”折磨过的开发者以及想系统了解rpm方式安装MySQL背后原理的同学。我会把从环境准备、软件包获取、参数配置到初始化数据库的每一步都拆开讲包括那些文档里不会写、只有实操才能发现的细节。1. 安装前的认知准备为什么红帽系装MySQL和Ubuntu完全不一样1.1 红帽系与Debian系的根本差异先搞明白底层逻辑。红帽系Linux使用RPM包管理机制配套yum老版本或dnfRHEL 8及以上作为前端工具。Debian系使用dpkg配套apt。两套体系完全不兼容你在Ubuntu上敲apt install mysql-server那套命令在红帽系上只能是“命令找不到”。更关键的是红帽系默认软件源里的“mysql”其实指向MariaDB。这是MySQL被收购后社区分裂的结果红帽选择了MariaDB作为默认数据库。所以你在红帽系统上直接执行yum install mysql-server装出来的可能是MariaDB不是Oracle官方MySQL。很多新手在这里踩坑明明装好了连接上去发现版本号不对、行为不一致、配置文件路径也完全不同。我遇到过不少同事装完发现不对劲又不知道问题出在哪最后只能全部卸载重来。所以第一步就是明确一件事要装Oracle官方MySQL就得走MySQL官方提供的RPM仓库或直接下载RPM包不能依赖系统自带源。1.2 为什么要优先选择RPM方式而不是源码编译红帽系上装MySQL有三条路RPM包安装、源码编译安装、容器化部署。三选一的话我强烈建议用RPM。源码编译能让你定制编译参数但耗时极长一台普通服务器编译完要一两个小时还要处理一堆开发工具链依赖后续升级维护也麻烦。容器化部署适合开发和测试环境但生产环境要考虑持久化存储、网络模式、性能损耗和运维复杂度。RPM方式的优势在于安装快、依赖关系自动处理、卸载干净、升级方便、与系统服务管理systemd天然集成。MySQL官方为红帽系专门制作了RPM包分成server、client、devel等多个子包按需安装即可。用RPM方式装完mysql服务会自动注册到systemd用systemctl start mysqld就能启动这是最贴近红帽系运维习惯的方式。另外一个容易忽略的点RPM方式安装的MySQL数据目录默认在/var/lib/mysql配置文件在/etc/my.cnfsocket文件在/var/lib/mysql/mysql.sock。这些路径和源码编译安装的默认值不完全一样后续做备份、迁移、调优时都要按这些路径来找。2. 完整安装流程从RPM仓库配置到服务启动2.1 第一步检查系统环境与Yum/DNF源配置开始之前先确认系统版本。RHEL 7及以下用yumRHEL 8及以上用dnf。我通常先执行这几条检查命令cat /etc/redhat-release rpm --query centos-release输出结果能看到系统是大版本。顺便看一下架构x86_64还是aarch64uname -mMySQL官方RPM包分平台发布架构选错了装不上。另外先检查一下系统里是不是已经有自带的数据库或者残留的MySQL相关包rpm -qa | grep -i -E mysql|mariadb如果有MariaDB相关包先卸载掉。这里注意CentOS/RHEL 7的年代mariadb-libs经常被其他软件依赖直接rpm -e会报错需要加--nodeps参数强制卸载。但在RHEL 8/9上mariadb-connector-c等包可能被其他软件依赖不能随便删要小心处理。2.2 第二步添加MySQL官方Yum仓库MySQL官方提供了一个统一的Yum仓库源配置文件通过一个RPM包来安装。这个包不包含MySQL本身只负责把官方源地址注册到系统里。以MySQL 8.0为例去MySQL官方Yum仓库页面找到对应系统的RPM包。我用的是mysql80-community-release-el9-5.noarch.rpm这类命名的包el9代表适配RHEL 9系el7、el8以此类推。wget https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm rpm -Uvh mysql80-community-release-el9-5.noarch.rpm装完执行yum repolist enabled | grep mysql能看到mysql-8.0-community这个仓库已经启用。先别急着直接用先检查一下仓库里的软件包是否能正常访问yum --enablerepomysql80-community list available | grep mysql-community-server如果能看到mysql-community-server.x86_64这类输出说明仓库配置成功。这里有个常规文档不会提的细节生产环境建议先确认MySQL官方源能被稳定访问。国内服务器访问MySQL官方源有时候会超时可以把官方源地址替换成国内镜像地址比如使用某镜像站配置方法是在/etc/yum.repos.d/mysql-community.repo里修改baseurl那一行的域名部分。这一步不是必须的但能让安装过程顺畅很多。2.3 第三步安装MySQL Server及相关组件仓库配置好之后安装命令非常简洁yum --enablerepomysql80-community install -y mysql-community-server这条命令会自动解决依赖把mysql-community-server、mysql-community-client、mysql-community-common、mysql-community-libs等一系列包一起装上。需要额外说明的是红帽系上因为自带源里有MariaDB即使前面卸载过装MySQL官方包时依然可能碰到依赖冲突报错信息通常长这样Error: Transaction test failed: file /usr/share/mysql/charsets/... from install of mysql-community-server conflicts with file from package mariadb-...解决方法是先彻底移除MariaDB相关文件yum remove -y mariadb-libs mariadb-server mariadb rm -rf /var/lib/mysql清理干净再重新执行安装命令。装完验证一下rpm -qa | grep mysql rpm -ql mysql-community-server | head -n 30rpm -ql能列出安装的所有文件路径建议扫一眼记住关键路径/etc/my.cnf、/usr/sbin/mysqld、/var/lib/mysql等。2.4 第四步初始化数据库与首次启动MySQL 8.0在RPM安装完成后不会自动完成初始化。首次启动服务时mysqld会自动执行初始化流程生成数据目录、系统表、初始账号等。这一步是自动的但启动方式有讲究systemctl start mysqld systemctl status mysqld启动成功后初始密码会写在日志文件里。注意这个日志位置不是系统日志而是MySQL自己的错误日志grep temporary password /var/log/mysqld.log日志里会有一行类似这样的输出[Note] A temporary password is generated for rootlocalhost: 5hKp!Qw2Xz冒号后面的字符串就是初始root密码。这个密码只在首次登录时有效登录成功后必须立即修改。初始密码是随机生成的包含大小写字母、数字和特殊字符复制的时候小心不要漏字符最好直接复制到本地再粘贴。2.5 第五步修改密码与安全加固拿到临时密码后登录MySQLmysql -uroot -p会提示输入密码粘贴刚才从日志里看到的临时密码即可。登录成功后第一件事就是改密码。MySQL 8.0默认安装了密码校验组件对密码强度有要求至少8位包含大小写、数字、特殊字符。先设置一个新密码ALTER USER rootlocalhost IDENTIFIED BY Your-Strong-Passw0rd!;改完密码后立刻刷新权限FLUSH PRIVILEGES;接下来做一些安全加固。检查当前用户列表SELECT user, host, plugin FROM mysql.user;正常情况下应该看到root用户的host是localhost如果看到有其他host注意排查来源。接着执行官方安全脚本mysql_secure_installation这个脚本会一步步问你是否要设置密码强度策略、删除匿名用户、禁止root远程登录、删除test数据库、重新加载权限表。我建议全部选Yes。生产环境尤其要禁掉root远程登录后续需要远程访问时再单独创建专用账号。3. 关键配置详解让MySQL在红帽系服务器上跑得稳3.1 配置文件结构与核心参数解析MySQL 8.0的配置文件是/etc/my.cnf。这个文件的读取顺序可以通过执行mysql --help | grep my.cnf查看RPM安装方式下主要就是/etc/my.cnf。配置文件采用INI风格按[mysqld]、[client]、[mysql]等节组织。先看几个核心参数这些是生产环境必调的[mysqld] port3306 bind-address0.0.0.0 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci default-authentication-plugincaching_sha2_password max_connections500 innodb_buffer_pool_size1G slow_query_log1 slow_query_log_file/var/log/mysql-slow.log long_query_time2port和bind-address控制监听地址0.0.0.0表示允许所有IP连接。如果只在本地使用改成127.0.0.1更安全。character-set-server和collation-server决定了数据库默认字符集和排序规则。新项目我无脑用utf8mb4能存emoji兼容性也好。default-authentication-plugin控制认证插件。MySQL 8.0默认是caching_sha2_password比老版本的mysql_native_password更安全但老客户端可能连不上遇到这种情况再单独处理。innodb_buffer_pool_size是最重要的性能参数建议设为物理内存的50%-70%。不要设太高要给OS留出余量。改完配置重启服务生效systemctl restart mysqld这里有个容易忽略的细节MySQL 8.0在RHEL 7以后都是通过systemd管理服务名是mysqld而不是mysql执行systemctl status mysql会提示找不到服务。3.2 创建业务账号与授权管理安全加固之后root只能本地登录。日常业务需要一个专用账号权限最小化原则只给它需要的权限。创建账号并授权的标准做法CREATE USER app_user% IDENTIFIED BY App-Passw0rd!; GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO app_user%; FLUSH PRIVILEGES;这里的host字段值%表示允许任意IP连接。如果是服务器之间固定IP访问建议写成具体的IP比如app_user192.168.1.%只允许某个网段连接更安全。如果想指定某个IP才能访问还可以用192.168.1.100精确匹配。授权时注意不要直接GRANT ALL PRIVILEGES ON.给超级权限除非确实需要做管理操作否则风险太高。3.3 远程连接开关与防火墙放行MySQL装好后如果远程客户端连接不上90%不是MySQL的问题而是防火墙。红帽系默认firewalld是开启的3306端口默认不对外放开。先看当前防火墙状态systemctl status firewalld需要放行3306端口时执行firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload我用--permanent参数这样重启后规则依然保留。还有一种方式是用--add-servicemysql前提是防火墙服务定义里有mysql这个服务。没有的话服务里需要预先定义。有些云服务器还有安全组那是另一层控制也要一并检查。另外SELinux也是红帽系的特色。SELinux开启状态下MySQL默认端口3306是可以监听的但如果改了端口或者自定义了数据目录SELinux策略可能会挡。简单确认SELinux状态getenforce如果是Enforcing而你又遇到权限类报错可以查看SELinux审计日志grep -i mysqld /var/log/audit/audit.log有异常时再用semanage或setsebool调整策略不建议直接关掉SELinux生产环境关闭SELinux带来的风险大于调整策略的麻烦。4. 安装遇坑记录那些让我折腾半宿的报错与解法4.1 端口被占用启动正常但客户端连接失败先排查端口占用ss -tlnp | grep 3306如果有其他进程占了3306端口MySQL自然起不来。我遇到过一台服务器上跑着旧版数据库端口被占得死死的mysqld日志里反复报Address already in use。解决办法要么停掉占用进程要么在配置里改端口。4.2 依赖冲突连环坑前面提过的MariaDB依赖冲突是最常见的。还有一个隐藏坑装了旧版本MySQL的RPM残留包没清干净新版本装的时候各种文件冲突。命令排查rpm -qa | grep -i mysql rpm -e $(rpm -qa | grep -i mysql) --nodeps注意--nodeps这个参数等同于强制删除相当于跳过依赖检查如果有其他应用依赖了MySQL的库文件强删可能会导致它们启动不了。建议强删后立即重新安装需要的版本。4.3 临时密码过期问题MySQL 8.0有一个“密码过期”策略。首次启动后root临时密码有效期是180天如果在这个期限内没登录修改账户就锁定了。登录会报错ERROR 1045 (28000): Access denied for user rootlocalhost解决办法是在/etc/my.cnf的[mysqld]段加一行临时配置跳过权限验证skip-grant-tables重启服务无密码登录systemctl restart mysqld mysql -uroot然后立刻修改密码ALTER USER rootlocalhost IDENTIFIED BY New-Strong-Passw0rd!; FLUSH PRIVILEGES;改完把配置文件里的skip-grant-tables注释掉再重启。这条参数等于让MySQL完全放弃权限校验非常危险操作完务必第一时间去掉不然任何人都能无密码连上来。4.4 客户端无法连接密码插件版本不匹配MySQL 8.0默认认证插件caching_sha2_password老版本的PHP、Python库、Navicat等客户端可能不支持。报错通常类似Authentication plugin caching_sha2_password cannot be loaded:解决办法是创建用户时指定老插件CREATE USER app_user% IDENTIFIED WITH mysql_native_password BY App-Passw0rd!;或者把已存在用户的插件改掉ALTER USER app_user% IDENTIFIED WITH mysql_native_password BY App-Passw0rd!;注意MySQL 8.0虽然保留了这个插件但官方已经标记为废弃mysql_native_password用于兼容老客户端新项目还是用默认的caching_sha2_password更好除非客户端版本实在升级不了。4.5 数据目录权限问题自定义了datadir之后最容易遇到权限问题。MySQL服务用mysql用户运行如果数据目录的属主不是mysql启动就直接失败chown -R mysql:mysql /data/mysql chmod 750 /data/mysql别忘了SELinux的配合自定义目录后SELinux类型标签大概率不对用restorecon或semanage调整。5. 验证安装结果与服务自启动设置5.1 基础验证三板斧安装配置一遍走完开始验证systemctl status mysqld mysqladmin -uroot -p ping mysql -uroot -p -e select version();systemctl status看服务是否active (running)mysqladmin ping返回mysqld is alive代表数据库进程正常select version()输出版本号。同时检查3306端口是否在监听ss -tlnp | grep 3306远程连接验证在另一台机器上执行mysql -h服务器IP -uapp_user -p能连上大功告成。5.2 设置开机自启动RPM方式安装后MySQL默认已设置为开机自启。再确认一下systemctl enable mysqld systemctl is-enabled mysqld输出enabled就是正常的。这里有RHEL 7和旧版的一个区别RHEL 6及更早用chkconfig管理自启动执行chkconfig mysqld onRHEL 7以后统一用systemctlRHEL 6基本已退出历史舞台这里仅作了解。5.3 定期备份的准备工作安装配置完成后我习惯立刻把备份脚本的架子搭起来。MySQL 8.0自带mysqldump简单可靠mysqldump -uroot -p --all-databases --single-transaction --routines --triggers /backup/alldb_$(date %F).sql把这条命令放进crontab里定时执行crontab -e 0 2 * * * mysqldump -uroot -p备份专用密码 --all-databases --single-transaction --routines --triggers /backup/alldb_$(date \%F).sql备份密码放在crontab里明文可见安全性一般生产环境更推荐用配置文件加权限管理的方式比如在/etc/mysql/backup.conf里放凭据并chmod 600。备份文件保留周期建议至少两周线上出问题要回溯数据时能派上大用场。6. 经验总结红帽系安装MySQL的生产级建议根据我多次实操和排查经验总结几条能让你少走弯路的心得第一不要用系统自带源直接装MySQL装出来是MariaDB版本差异足以让你后续排查问题排查到怀疑人生。RPM方式安装认准MySQL官方源。第二配置文件修改前先备份。我习惯每次改my.cnf之前先复制一份cp /etc/my.cnf /etc/my.cnf.bak。改错了恢复特别快省得重装。第三MySQL错误日志是排查问题的第一入口。/var/log/mysqld.logRHEL系里记录了启动过程的每一步、报错的每个细节比看终端输出有用得多。排查问题先tail -n 50 /var/log/mysqld.log。第四防火墙和SELinux是红帽系上最容易忽略的两个拦路虎。安装完发现连不上先查firewalld规则再查SELinux审计日志很多时候问题根本不在MySQL配置。第五生产环境不建议关SELinux也不建议用iptables -F清空规则。红帽系的安全机制是有道理的学会和它们配合而不是绕开时间长了你就明白这种稳妥的价值了。我每次在新机器上部署MySQL走完这套流程大约需要二十分钟。第一次做的时候因为不熟悉路径和依赖关系前前后后折腾了大半天踩遍了MariaDB冲突、临时密码过期、SELinux拦截这些坑。现在我把这份流程固定下来每一步都有验证手段从系统检查到远程连接测试一条龙走完基本不会出偏差。