资讯动态

CentOS安装MySQL完全指南:从yum源配置到远程连接排错

发布时间:2026/10/13 4:34:28 来源:尧图企业网站定制
最近新入了一台CentOS 7服务器准备把内部几条业务线迁过去。没错第一件事就是装MySQL。整个过程从选版本、配yum源、初始化到后来远程连不上排错前后折腾了一个下午。这篇就把我在CentOS安装MySQL这条链路里踩过的坑、用过的命令、想明白的逻辑一次说清楚不管是刚入门的新手还是装完经常卡在“客户端连不上”的老朋友都值得花几分钟看一下。先说一个容易让人懵的事实在CentOS默认的yum源里你根本搜不到mysql-server这个包系统默认带的是MariaDB。很多人上来就执行yum install mysql-server然后看着No package mysql-server available直接怀疑人生。思路不对后面的操作全是白费所以我会从安装前的选型讲起一步步到安全加固、远程排错最后给一份可以直接照做的检查清单。1. 动手之前先想清楚装哪个版本、用哪种方式1.1 为什么默认源里没有mysql-server很多第一次在CentOS上装MySQL的人都会卡在这一步。CentOS 7的默认yum源里和MySQL兼容的数据库是MariaDB而不是MySQL本身。MariaDB是MySQL的一个社区分支因为一些历史原因被主流发行版作为默认替代品收录。但这不意味着你能直接拿它顶替MySQL两个产品在版本号、配置习惯、部分语法行为上已经有明显差异尤其是你手上攒了一堆针对MySQL 5.7或8.0写的运维脚本时换到MariaDB多少会踩到兼容性问题。所以正确思路是先装MySQL官方提供的yum仓库让系统认识mysql-community-server这个包然后再用yum安装。这也是大多数生产环境的标准做法而不是去网上随便找一个第三方编译包来装。第三方包最大的问题是升级链路不可控出了问题你不知道该找谁也不知道下一个版本能不能通过yum正常更新。1.2 版本选择5.7还是8.0新装环境我建议优先考虑MySQL 8.0它是目前的主流版本也是官方长期维护的重点。和5.7相比8.0默认就是utf8mb4字符集JSON支持更完善窗口函数、公用表表达式CTE这些SQL能力也补齐了性能上有了不少改进。但要不要无脑升8.0取决于你的业务依赖。如果你的应用还在用很老版本的数据库驱动比如一些陈年Java项目里还躺着mysql-connector-java 5.x那直接连8.0会碰到认证插件不兼容的问题。8.0默认的认证插件改成了caching_sha2_password老驱动根本不认识报错能把你绕晕。碰到这种情况要么升级驱动要么建用户时单独指定用mysql_native_password后面第4章我会专门讲。我的建议是全新业务直接8.0历史遗留业务先查一下驱动兼容性再决定。不要为了“求稳”在新机器上装一个刚出来时的5.7小版本那才是真正的坑。1.3 安装前要检查的三件事动手装之前花两分钟把系统底子摸一遍能省下后面一大半排错时间检查项命令说明系统发行版cat /etc/redhat-release确认是CentOS 7还是8仓库包不能混用剩余磁盘空间df -h /var/lib/mysqlMySQL数据文件默认放这里空间不够后续很被动SELinux状态getenforce如果返回Enforcing后面远程连接和文件访问都要额外处理另外确认一下系统时间date -R看时区对不对。数据库服务器时间不准日志排查会非常痛苦而且定时任务和binlog的恢复时间线都会受影响。系统时间用timedatectl set-timezone Asia/Shanghai这类命令调整一下具体时区按你的部署位置来不必照抄。这些检查不是走形式。我遇到过一台机器装到一半发现/var分区只剩几百MBMySQL初始化之后根本起不来最后又要清日志又要挪目录平白折腾两个小时。2. 通过官方yum仓库安装MySQL 8.0完整步骤复现2.1 先把系统里残留的数据库痕迹清掉这一步很多人会跳过但我不建议跳。如果系统里已经预装了MariaDB或者之前装过MySQL又没卸干净新装的时候会出现端口被占、配置文件被覆盖、依赖冲突等各种莫名其妙的问题。先跑一遍检索命令rpm -qa | grep -i mariadb rpm -qa | grep -i mysql如果有输出说明系统里还有残留。MariaDB相关包通常能直接卸yum remove -y mariadb-libs如果只是装了客户端没装服务端依赖影响不大多数情况下可以安全卸载。但生产环境务必先看清楚这些包被谁依赖最好先把服务停掉再操作。MySQL的残留多数是配置文件和数据目录比如/etc/my.cnf、/var/lib/mysql。新装机器一般不用动数据目录但如果有旧配置残留最好先备份再清掉防止新旧配置打架。注意如果你是从旧版本MySQL升级千万别手贱删数据目录那是删库行为不是清理残留。升级场景要在官方升级文档指导下操作。2.2 添加官方yum仓库并确认版本源清理干净后去MySQL官方页面找对应CentOS版本的仓库RPM包下载链接。这里我不直接甩一个写死的链接因为官方链接更新很快直接贴旧链接很容易404。# 以root执行下载并安装官方yum仓库RPM包 wget https://your-mirror.example.com/mysql80-community-release-el7-7.noarch.rpm rpm -ivh mysql80-community-release-el7-7.noarch.rpm我用your-mirror.example.com代表实际下载地址真实操作时请以MySQL官方页面给出的链接为准。装完仓库包后确认仓库已经被系统识别yum repolist enabled | grep mysql正常情况下能看到mysql80-community开头的一行。如果你的机器还想装5.7需要单独把5.7仓库启用、8.0仓库禁用。这里注意一个细节一个系统里可以同时存在多个MySQL版本仓库但同一时刻只能启用一个否则yum会装出什么版本完全看运气。用下面的命令可以查看当前每种版本源里提供的具体包yum --disablerepo* --enablerepomysql80-community list available | grep mysql-community2.3 安装服务端和客户端版本源没问题后直接安装yum install -y mysql-community-server mysql-community-client这里我特意把client也装上了因为生产环境排查问题非常依赖命令行客户端你总不想连个MySQL还先去另一台机器找客户端工具。安装过程会拉下来一串包除了server和client之外还有common、libs这些基础库。安装完成后验证一下版本mysql --version启动服务systemctl start mysqld systemctl status mysqldCentOS 7上MySQL 8.0安装完成后首次启动时会自动完成数据目录初始化并且把一次性的临时root密码写进日志里。这是官方默认机制别急着改密码先取临时密码grep temporary password /var/log/mysqld.log输出大概长这样[Note] A temporary password is generated for rootlocalhost: kL9xQp#4P2u这串临时密码是进入系统的唯一钥匙赶紧复制保存好。用它能登录mysql -uroot -p2.4 CentOS 8和CentOS 7的安装差异如果你用的是CentOS 8或者更新一代的发行版整体流程一致但有三个差异要注意。第一CentOS 8用dnf替代了yum不过为了兼容性CentOS 8里也保留了yum命令很多场景下两者可以混用。第二官方仓库RPM包的名字不同下载时要选对应el8的包。第三CentOS 8默认启用的模块流里可能有一个MySQL模块会和官方仓库冲突。安装之前最好先查看模块状态dnf module list | grep mysql如果系统自带的模块处于默认启用状态需要先禁用模块再走官方仓库安装不然会出现包来源混乱的问题。3. 初始化之后的安全加固和基础配置3.1 跑一遍mysql_secure_installation临时密码登录进来后第一件事不是建库建表而是运行安全初始化脚本mysql_secure_installation这个脚本会带你走完几项必要操作设置root密码、删除匿名用户、禁止root远程登录、删除test测试库、刷新权限表。交互的时候它先让你输入当前root密码然后问你“是否设置新密码”。为了方便复用我一般会准备一个符合密码强度策略的新密码。脚本默认要求密码至少8位并且包含大写、小写、数字和特殊字符这是MySQL 8.0内置的validate_password组件在起作用。后面几个问题强烈建议的答复是删除匿名用户选Y禁止root远程登录选Y删除test库选Y刷新权限选Y。尤其第二条root远程登录在生产环境就是个筛子你永远不知道哪台机器的脚本会在什么时候拿着root去连数据库。3.2 调整密码策略到适合业务的强度安全脚本跑完你会发现业务用的密码如果太简单根本创建不上去。8.0的validate_password组件默认是中等强度策略。查看当前策略SHOW VARIABLES LIKE validate_password%;输出里有一堆参数核心是validate_password.policy取值从LOW到STRONG。如果内部系统并不需要这么高的密码复杂度可以适当调低SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 8;注意8.0里这些变量名中间是点号不是下划线写错会报Unknown system variable。不过这个设置只对当前运行期生效重启后恢复默认。想要永久生效在/etc/my.cnf的[mysqld]段里加validate_password.policyLOW validate_password.length8另外强调一下降低密码策略是为了业务账号好管理不是让你把root密码也改成123456。能开远程访问的账号密码一定要足够复杂这是底线。3.3 创建业务账号并授最小权限我一直不推荐让应用直连root一个应用一个账号权限限到库甚至限到表是运维的基本素养。比如要给一个名为appdb的库创建账号CREATE DATABASE IF NOT EXISTS appdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER appuserlocalhost IDENTIFIED BY AppPassw0rd123; GRANT ALL PRIVILEGES ON appdb.* TO appuserlocalhost; FLUSH PRIVILEGES;这里的localhost意味着这个账号只能从本机连接。如果应用和数据库不在同一台机器需要用appuser%或者指定一个具体的应用服务器IP。用%当然省事但配合防火墙白名单才能算安全。说到创建账号再给你一个前后对照的坑8.0默认新建用户的认证插件是caching_sha2_password这会导致老版本客户端直接连不上。如果你确定应用驱动已经兼容8.0保持默认即可如果不确定建用户的时候可以显式指定老插件CREATE USER appuser% IDENTIFIED WITH mysql_native_password BY AppPassw0rd123;这个选择在第4章还要展开讲。4. 远程连接问题排查端口、防火墙、SELinux和认证插件4.1 客户端连接超时先别急着怪防火墙安装配置都完成接下来大概率会遇到这个问题在本机用mysql -uroot -p能进去但换一台机器用客户端连接就是超时或者拒绝。我给你一条排查链路照着走就行。第一步确认服务在跑systemctl status mysqld第二步确认3306端口在监听ss -lntp | grep 3306如果输出里监听地址是127.0.0.1:3306那问题找到了MySQL默认配置只监听本机回环地址外部请求根本进不来。这时候要去/etc/my.cnf的[mysqld]段里改bind-address 0.0.0.0改成0.0.0.0表示监听所有网卡也可以写具体的内网IP。改完重启服务systemctl restart mysqld重启后再检查一次端口应该能看到监听地址变成了0.0.0.0:3306或者你指定的IP。第三步查防火墙。CentOS 7默认用firewalldfirewall-cmd --permanent --zonepublic --add-port3306/tcp firewall-cmd --reload firewall-cmd --list-alllist-all输出的ports列表里有3306/tcp就说明放行了。如果这台机器在云环境里还要记得检查云控制台的安全组规则很多云服务器的防火墙分两层系统层放行了安全组没加白名单照样连不上。4.2 SELinux这个隐形拦路虎如果你的端口监听、防火墙都没问题可连接还是被拒那就该怀疑SELinux了。CentOS 7默认SELinux是Enforcing状态很多管理员图省事直接禁掉我不建议一上来就禁用但排查问题的时候要先确认状态getenforce如果返回Enforcing可以先临时放行MySQL端口setenforce 0要永久放行最好用semanage把3306端口加入mysqld的端口类型yum install -y policycoreutils-python-utils semanage port -a -t mysqld_port_t -p tcp 3306这样比直接setenforce 0要优雅得多。最直接粗暴的方式是把/etc/selinux/config里的SELINUXenforcing改成SELINUXdisabled再重启但这是一刀切方案除非你明确知道自己不需要SELinux否则还是按上面两步走比较稳妥。4.3 root远程登录和认证插件端口、防火墙、SELinux全查完如果还报Access denied那就是账号层面的问题。前面安全初始化时我们已经拒绝了root远程登录如果你非要开root远程来图省事先停一下手改用业务账号连。业务账号要能在远程登录除了授权时用user%还要保证服务端允许远程连接也就是4.1节里说的bind-address不能是127.0.0.1。另外一类高频报错是Authentication plugin caching_sha2_password cannot be loaded这是因为8.0的默认认证插件和旧客户端不兼容。解决办法有两个方向。一是升级所有客户端驱动这个方案最干净但有时候旧系统动不了。二是给现有用户改回老插件ALTER USER appuser% IDENTIFIED WITH mysql_native_password BY AppPassw0rd123;改完之后重启连接就能成功。我的经验是能升级驱动就升级驱动毕竟老插件在8.0里是兼容保留性质迟早会被完全移除。但短期救急改插件是成本最低的方案。4.4 3306端口要不要暴露公网聊到这里顺便说一个安全观念问题。很多开发图方便把3306直接暴露到公网然后发现被扫爆、日志里全是暴力破解。我的原则是MySQL监听地址尽量只写内网IP应用服务器和数据库服务器放到同一个内网网段。确实需要从外部管理时优先走SSH隧道而不是把端口裸奔在公网上。如果你不得不开公网访问至少做到三件事数据库账号密码换成高强度随机密码防火墙只放行指定来源IP开启MySQL的访问日志定期看一眼谁在连。这些习惯养成了能帮你省掉很多半夜爬起来处理入侵告警的场面。5. 安装完成之后的事检查清单和个人经验5.1 五分钟健康检查装完不等于能用跑一组快速检查确认基础项都正常再交付给别人用systemctl is-enabled mysqld mysqladmin -uroot -p status第一条确认开机自启是否打开systemctl enable mysqld在CentOS 7上systemctl enable mysqld会创建一个符号链接保证重启后MySQL自动拉起。很多人的MySQL断电后没自动恢复就是因为少了这一步。登录MySQL后还要重点看几个变量SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE collation_server; SHOW VARIABLES LIKE time_zone; SHOW VARIABLES LIKE default_authentication_plugin;字符集认准utf8mb4时区按业务统一设置认证插件按第4章的兼容性结论决定。这些配置一旦业务跑起来再改牵涉面非常大所以装完趁早调好。5.2 基础参数按内存量给个起步值我不建议你去抄那些网上流传的“生产环境my.cnf大全”每台机器内存、磁盘、业务模型都不一样抄来的配置很可能适得其反。但有两个参数确实值得装完顺手设置。一个是innodb_buffer_pool_size这是InnoDB的缓存池通常建议设置为你机器物理内存的50%到70%。如果服务器内存只有4GB可以设为2G如果是16GB内存可以按8G到10G起步。另一个是max_connections默认151经常不够用可以先设为500或1000但要同时关注max_connections如果设得过高每个连接都会吃内存系统撑不住。设置方式是在/etc/my.cnf里加[mysqld] innodb_buffer_pool_size 2G max_connections 500改完重启MySQL生效。注意这两项虽然基础却不是调完就一劳永逸后续要看慢查询日志和连接数趋势再慢慢微调。5.3 我在实际安装中积累的几个小习惯最后总结几条只有自己装过踩过坑才会特别在意的习惯。第一每次修改/etc/my.cnf之前先备份一份带日期的副本比如cp /etc/my.cnf /etc/my.cnf.bak.20250101。改崩了能立刻回滚不用靠记忆恢复配置。第二改完配置要重启MySQL但生产环境重启前务必先确认没有正在跑的长事务。可以用SHOW PROCESSLIST;看一眼有大量Sleep或者Query卡着的时候延后重启更安全。第三日志是排错的第一信息来源。MySQL的日志默认在/var/log/mysqld.log临时密码、启动错误、连接问题全在里面。遇到问题先看日志再去改配置顺序反了很容易把配置越改越乱。第四也是我觉得最值钱的一条经验数据库的密码、字符集、时区、端口、bind-address这些基础设置在装好的第一天就全部定下来别拖。业务一上线任何一项改动都会引起连锁反应。你花在前期规划上的半小时顶得上后面一周的救火。这台服务器到现在运行了几个月期间经历了业务迁移、客户端连接调整、连接数波动好在当初基础打得还算扎实。MySQL在CentOS上的安装本身不难难的是把安装之后的每一步都考虑周全。希望这篇记录能帮你少走点弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑