十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 7安装MySQL 8.0完整指南:从环境配置到远程访问

CentOS 7安装MySQL 8.0完整指南:从环境配置到远程访问 在没有图形界面、只有终端操作的Linux服务器上装MySQL说难不难但要说一次就能顺利跑通还真有不少隐藏的坑。尤其是CentOS 7搭配MySQL 8.0官方源、依赖库、密码策略、远程访问权限任何一个环节眼神不好使都得折腾半天。我这次把整个过程重新走了一遍从虚拟机环境到远程客户端连接每个步骤都做了详细记录包括我踩过的坑和绕过的方法争取让新手照着操作也能一次成功。先说下适用场景如果你手里是一台CentOS 7服务器物理机或VMware虚拟机都行想装MySQL 8.0用于学习、测试或日常开发这篇内容可以直接参考。文章针对的是最小化安装的系统不带图形界面全程用命令行完成。1. 环境准备与安装方案选型1.1 环境确认CentOS 7 最小化系统的初始状态我这次用的镜像是CentOS 7 x86_64 Minimal版本版本号是7.9.2009。Minimal镜像只有几百MB安装完以后系统里只有最基础的软件很多常用命令都需要自己装好处是干净不会有一堆用不上的东西。装好系统后的第一件事就是确认网络连接和系统版本。我在终端执行了下面两条命令cat /etc/redhat-release ping -c 3 www.baidu.com如果结果能看到CentOS Linux release 7.9.2009以及ping通外网那环境就没问题。如果ping不通多半是网卡没自动启动可以先用ip addr看看网卡名称然后编辑网卡配置文件把ONBOOTno改成yes再执行systemctl restart network重启网络服务。这里顺便提醒一句很多人在购买云服务器或刚装完虚拟机时都会忽略系统版本和网络环境这两个基础检查直接开始装MySQL结果后面所有报错都排查得很痛苦。基础检查不花多少时间收益率却很高。1.2 安装方案对比Yum仓库、二进制包、源码编译CentOS 7上装MySQL 8.0主流方案有三种官方Yum仓库安装、通用二进制包安装、源码编译安装。Yum仓库安装是最省心的一种MySQL官方维护了针对CentOS 7的RPM仓库装好之后直接用yum命令就能安装和升级依赖关系也会自动处理。二进制包安装相对灵活适合需要自定义安装路径的场景但需要手动配置环境变量和初始化数据库。源码编译安装基本不建议耗时长、依赖多、容易报错除非你要修改源码或者有非常特殊的性能定制需求否则纯属浪费时间。我个人推荐第一种也是本次教程采用的方式。Yum仓库装的MySQL 8.0文件路径规范服务管理方便官方后续提供安全更新时也能一键升级。1.3 依赖问题提前评估在CentOS 7上装MySQL 8.0有一个不得不提的依赖问题MySQL 8.0的RPM包依赖libaio、libnuma等库而这些库在最小化系统里不一定预装。另外MySQL 8.0的客户端组件需要libncurses.so.5但CentOS 7默认带的是libncurses.so.6这会导致安装或运行时报错。我当时第一次装的时候就卡在这个地方后面会专门写一节来排查和解决。提前知道有这些依赖坑后面操作起来心里就有底了。2. 安装前的系统配置2.1 关闭防火墙与SELinux对MySQL端口的影响CentOS 7默认开启了firewalld防火墙MySQL 8.0默认监听3306端口。如果防火墙不放开这个端口即使MySQL装好了其他机器也连不上。我习惯的做法是先关掉防火墙后续不需要再开防火墙systemctl stop firewalld systemctl disable firewalld等MySQL装完、远程连接测试通畅以后再根据实际需求重新开启防火墙并放行3306端口。很多人在云服务器上装MySQL折腾半天连不上十有八九就是安全组规则或防火墙没放行端口。SELinux同样是个变量。CentOS 7的SELinux默认是enforcing状态它对MySQL的访问会有额外的限制。最简单的方式是临时设置为permissive先不彻底关闭setenforce 0如果想要永久生效可以编辑/etc/selinux/config文件把SELINUXenforcing改成SELINUXpermissive。我一般不会把SELinux直接关掉因为生产环境里它还是有安全价值的但在学习和测试环境里permissive状态能省掉很多麻烦。2.2 清理系统自带的MariaDB残留CentOS 7系统源里自带的数据库组件是MariaDB而且有时会预装mariadb-libs。如果不把残留的MariaDB相关包卸载干净直接装MySQL 8.0大概率会出现冲突报错。我当时先检查了系统里是否存在MariaDB相关的包rpm -qa | grep mariadb如果有输出就需要卸载例如yum remove -y mariadb-libs卸载后可以用which mysql或rpm -qa | grep -i mysql再确认一遍确保系统里没有残留的MySQL命令或服务。如果没清理干净就继续安装后面很可能会碰到“mysql: error while loading shared libraries”这类问题不少新手在这里吃了亏。2.3 同步系统时间与安装基础工具MySQL对时间比较敏感尤其是在后续设置日志、定时任务时系统时间不准会导致各种莫名其妙的问题。安装前先同步一下时间yum install -y ntpdate ntpdate ntp.aliyun.com同步完以后可以用date命令确认一下。另外最小化系统里很多常用的工具都没有比如wget、vim、net-tools等。我习惯先把它们一起装好免得后面一边装MySQL一边补依赖yum install -y wget vim net-toolsnet-tools主要提供ifconfig、netstat等命令排查端口监听时会用到vim是文本编辑器后面改配置文件都靠它。3. 安装MySQL 8.0的详细步骤3.1 添加MySQL官方Yum源MySQL官方提供了专门的Yum仓库我们需要先下载并安装仓库的RPM包。这个RPM包本身很小作用只是把MySQL仓库的地址注册到系统里后面使用yum命令时就会自动从官方仓库拉取MySQL软件包。进入任意一个自己的工作目录我习惯放在/opt下cd /opt wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm下载完成后安装这个仓库包yum install -y mysql80-community-release-el7-7.noarch.rpm安装完成以后可以用下面这个命令确认仓库已经生效yum repolist enabled | grep mysql如果看到了mysql80-community/x86_64这一行说明仓库添加成功。如果wget下载速度特别慢也可以先在本地用浏览器下载这个rpm包再上传到服务器上安装。这个官网的下载地址有一个需要注意的地方MySQL官方仓库包版本会更新如果你执行的命令提示404就直接打开https://dev.mysql.com/downloads/repo/yum/页面找最新的mysql80-community-release-el7-*.noarch.rpm地址替换即可。3.2 正式安装仓库配置好之后安装MySQL 8.0其实就一行命令yum install -y mysql-community-server这个包会把mysql-community-server、mysql-community-client、mysql-community-libs等相关组件一起装进来。整个安装过程中yum会自动解析依赖并下载安装耗时长短取决于网速。安装完成后验证一下版本和安装路径mysql --version which mysql如果输出mysql Ver 8.0.x for Linux on x86_64就说明安装成功。如果想明确查看安装到了哪些目录可以用rpm -ql mysql-community-server我看到的默认安装路径是数据目录/var/lib/mysql配置文件/etc/my.cnf日志文件/var/log/mysqld.logPID文件/var/run/mysqld/mysqld.pid了解这些默认路径很有用后面做备份、改配置、查日志都会用到。3.3 初始化并启动MySQL服务MySQL 8.0安装完成后系统会自动初始化数据目录但服务默认是停止状态。首次启动前最好先手动初始化一下数据目录明确生成初始密码。这里我演示一下比较标准的初始化和启动流程。先启动MySQL服务systemctl start mysqld如果启动失败可以先看下错误日志cat /var/log/mysqld.log | grep ERROR正常启动后查看初始临时密码grep temporary password /var/log/mysqld.log输出里会有一行类似A temporary password is generated for rootlocalhost: xxxxxxxx的内容冒号后面的就是临时密码。注意这个临时密码只在初始化后的一段时间内有效首次登录后系统会强制要求修改密码。如果日志里没有临时密码有可能是数据目录已经初始化过了。可以手动删掉/var/lib/mysql下的文件再重新初始化但那样比较折腾。更简单的做法是停掉服务后删除数据目录备份数据后再重启服务让它自动重新初始化。3.4 获取临时密码并执行安全初始化小心翼翼把这个临时密码复制下来注意区分大小写然后登录MySQLmysql -uroot -p输入临时密码后就能进入MySQL命令行。此时系统会提示密码已过期必须先修改密码才能继续操作。这里有个关键点MySQL 8.0默认启用了密码校验插件validate_password要求密码至少包含大写字母、小写字母、数字、特殊字符并且长度至少8位。我第一次装的时候想设一个简单的123456直接被拒了。所以要么设置一个复杂密码要么先调整密码策略。我当时的做法是先设置一个复杂密码方便继续后续操作然后再考虑是否调整密码策略ALTER USER rootlocalhost IDENTIFIED BY MyNewPass_2024;修改成功后可以用exit退出再用新密码重新登录确认修改生效。如果你在测试环境里确实想用简单密码可以降低校验等级SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;但注意这个设置重启MySQL后会失效。如果不想每次重启后都重设需要在/etc/my.cnf里加上对应配置这个后面会讲到。3.5 配置远程访问端口、用户、bind-addressMySQL装好后默认只允许本机访问因为它的监听地址是127.0.0.1。如果你想用Navicat、DBeaver等客户端工具从自己的电脑连接这台服务器必须做两步配置一是放开3306端口防火墙二是创建允许远程登录的MySQL用户。先看下当前MySQL的端口监听状态netstat -anp | grep 3306如果看到的是127.0.0.1:3306说明只监听本地。需要修改/etc/my.cnf在[mysqld]段下增加bind-address 0.0.0.0保存后重启MySQL服务systemctl restart mysqld然后再用netstat确认监听地址变成了0.0.0.0:3306。这一步很关键不修改的话即使授权了远程用户客户端也连不上。接着创建远程用户。MySQL 8.0的创建用户语法和旧版本有所不同不能再使用GRANT直接创建用户而是要先创建用户再单独授权CREATE USER admin% IDENTIFIED BY Admin_2024; GRANT ALL PRIVILEGES ON *.* TO admin% WITH GRANT OPTION; FLUSH PRIVILEGES;%表示允许任意IP访问。刷新权限后退出MySQL再用客户端工具测试连接。如果还是连不上可以检查防火墙状态systemctl status firewalld如果防火墙是开启状态需要放行3306端口firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload我在云服务器上也遇到过类似问题那时候还要去云控制台的安全组里配置入站规则这一步容易忽略写在这里提醒下。4. 依赖问题与常见错误排查4.1 libaio、libncurses.so.5缺失问题安装MySQL 8.0时yum会自动处理依赖但有时候因为网络源的问题依赖包下载不完整或者安装过程中跳过了某些弱依赖导致启动时报错。最典型的就是libaio缺失。如果在启动MySQL时遇到error while loading shared libraries: libaio.so.1: cannot open shared object file说明系统缺少libaio库。解决办法很简单yum install -y libaio另一个经典坑是libncurses.so.5缺失。CentOS 7默认安装的是libncurses.so.6而MySQL 8.0的某些客户端工具会去找libncurses.so.5。报错长这样mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file解决办法是做个软链接把libncurses.so.6指到libncurses.so.5上yum install -y ncurses-libs ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.564位系统路径是/usr/lib6432位系统是/usr/lib。这个坑在CentOS 7上很常见我在安装时做过两次软链接一次是libtinfo一次是libncurses建议遇到类似报错时先用ldd检查一下依赖情况。4.2 /var/lib/mysql权限问题有时候MySQL启动失败错误日志里会出现[ERROR] Could not create directory /var/lib/mysql或者权限相关的报错。这可能是因为数据目录的属主不对MySQL服务是以mysql用户运行的数据目录必须归mysql:mysql所有。遇到这个问题时直接改属主即可chown -R mysql:mysql /var/lib/mysql chmod -R 755 /var/lib/mysql改完再重启服务systemctl restart mysqld顺便说一句/var/lib/mysql下的文件不仅是数据文件还包含初始化和运行时的临时文件。如果你手动清空了数据目录记得把属主改回来否则初始化会失败日志里会提示权限不足。4.3 密码策略导致的初始化失败很多人安装完MySQL 8.0第一次执行安全初始化时因为密码太简单被校验插件拦下就以为是自己操作出了问题。实际上这不算错误是密码策略在起作用。MySQL 8.0默认的密码校验规则为密码长度不能少于8位必须包含大写字母、小写字母、数字和特殊字符如果你确实需要弱密码可以在登录MySQL后动态调整SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;然后重新设置密码ALTER USER rootlocalhost IDENTIFIED BY 123456;如果想永久生效在/etc/my.cnf的[mysqld]段下添加validate_password.policyLOW validate_password.length6然后重启服务。注意MySQL 8.0把密码校验相关的变量名改成了validate_password.policy和validate_password.length旧版本的validate_password_policy这种下划线写法已经不能用了这个细节很重要。4.4 常见问题速查表我把安装和启动过程中最常见的几类问题整理成了一张速查表方便遇到问题时快速定位。问题现象可能原因解决办法yum安装时报包冲突系统预装了MariaDB相关库先执行yum remove -y mariadb-libs再重试启动失败日志提示libaio缺失缺少libaio库yum install -y libaio客户端提示libncurses.so.5找不到CentOS 7默认只有libncurses.so.6做软链接ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5找不到临时密码数据目录已初始化过清空/var/lib/mysql后重启服务重新初始化修改密码时报密码不符合规则密码策略太严格降低validate_password.policy和validate_password.length或设置符合规则的密码远程客户端连不上数据库防火墙、bind-address或授权问题放行3306端口检查bind-address0.0.0.0确认用户已授权重启后密码策略失效动态修改的参数未写入配置文件在/etc/my.cnf中持久化配置5. 核心配置与日常维护5.1 my.cnf关键参数优化utf8mb4、时区、连接数MySQL安装好、能正常启动之后接下来就是调优配置了。对于大多数人来说最需要关心的是字符集、时区和连接数这几项。MySQL 8.0默认字符集其实是utf8mb4但如果是从旧版本升级过来的或者某些数据表的字符集还不是utf8mb4建议在/etc/my.cnf中强制指定。这样做的好处是避免出现中文乱码尤其是用Navicat等客户端操作中文数据时。我常用的配置段是这样的[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-time-zone08:00 max_connections500character-set-serverutf8mb4让新建的数据库默认使用utf8mb4字符集兼容所有中文和emoji字符。collation-server服务器的默认排序规则utf8mb4_unicode_ci是比较通用的选择。default-time-zone08:00如果你在国内使用强制设置为北京时间避免日志和函数的时间显示错误。max_connections默认151在高并发场景下不够用调整到500或更高。修改完/etc/my.cnf后记得重启服务systemctl restart mysqld重启后可以通过以下SQL验证配置是否生效SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE time_zone; SHOW VARIABLES LIKE max_connections;5.2 使用Navicat等客户端连接MySQL 8.0MySQL 8.0在客户端连接方面和5.7最大的区别是默认认证插件变成了caching_sha2_password。很多旧版本客户端工具比如老版本的Navicat在连接时会出现Authentication plugin caching_sha2_password cannot be loaded的报错。解决办法有两个思路。一是升级客户端工具版本新版本的Navicat和DBeaver都支持caching_sha2_password二是把用户认证插件改为mysql_native_password兼容旧客户端。如果你用的是老版本客户端可以这样修改ALTER USER admin% IDENTIFIED WITH mysql_native_password BY Admin_2024; FLUSH PRIVILEGES;这样修改后老客户端就能正常连接了。但从安全角度考虑还是建议尽量升级客户端工具不要长期使用过时的方式。连接时填写的信息一般就是主机名/IP你的服务器IP端口3306用户名admin或你创建的用户密码对应密码连接成功后我一般会先查看一下版本信息确认连接的确实是MySQL 8.0SELECT VERSION();5.3 服务开机自启与备份建议MySQL安装完成后默认情况下服务并不会开机自启。如果你希望服务器重启后MySQL自动运行执行systemctl enable mysqld systemctl is-enabled mysqld第二条命令如果输出enabled说明自启设置成功。备份是日常维护里必须要做的一件事。MySQL 8.0自带了mysqldump工具最简单的全库备份命令是mysqldump -uroot -p --all-databases backup_$(date %F).sql备份文件会以日期命名比如backup_2025-01-15.sql。恢复时使用mysql -uroot -p backup_2025-01-15.sql我在实际操作中还会配合crontab做定时备份比如每天凌晨2点执行一次全库备份0 2 * * * mysqldump -uroot -p密码 --all-databases /backup/mysql_backup_$(date \%F).sql 2/backup/mysql_backup.log备份文件多了以后会占磁盘建议按日期定期清理。备份目录最好单独挂载到一个容量足够、不易丢失的磁盘分区上。6. 安装后的验证清单与效果确认6.1 服务状态与进程检查安装完成后我建议按下面的清单逐项确认避免漏掉关键配置服务是否正常运行systemctl status mysqld状态为active (running)端口是否监听netstat -anp | grep 3306能看到0.0.0.0:3306或:::3306进程是否存在ps -ef | grep mysqld能看到mysqld进程版本是否正确mysql --version输出Ver 8.0.x每一项都通过的话就可以认为安装基本成功了。如果哪一项不对回到对应章节排查。6.2 常用SQL语句快速验证在MySQL命令行里执行几条SQL可以快速验证数据库是否处于可用状态SHOW DATABASES; USE mysql; SELECT user, host, plugin FROM user;SHOW DATABASES应该能看到information_schema、mysql、performance_schema、sys这些系统库。SELECT user, host, plugin FROM user可以查看当前有哪些用户、允许从哪里登录、使用什么认证插件排查远程连接问题时特别有用。6.3 数据读写测试最后做个实际的读写测试。创建一个测试库建一张表插入数据再查询出来CREATE DATABASE testdb; USE testdb; CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50)); INSERT INTO t1 (name) VALUES (hello), (world); SELECT * FROM t1;如果能正确返回hello和world两行数据说明数据库读写功能正常。测试结束以后可以删掉这个测试库DROP DATABASE testdb;我个人在实际操作中比较反感测试数据留在正式环境里所以每次验证完都会顺手清理避免以后排查问题时被干扰。写在最后的一点经验在CentOS 7上安装MySQL 8.0这件事我前后折腾过不少次总的感觉是真正的难点不在安装这一步而在于系统环境和依赖问题的排查。不管是libaio缺失、libncurses软链接还是防火墙和SELinux放行这些坑如果你提前知道整个流程其实很快不知道的话就可能每个报错都要搜半天。另外建议新手在虚拟机里多练几遍尤其是依赖报错的排查过程不用怕装坏。CentOS 7虚拟机最大的好处就是可以随时做快照装坏了回滚一下再从头来。我第一次在VMware里装的时候就来回折腾了五六遍反而把很多细节记得更牢了。最后再分享一个小技巧如果你用的不是CentOS 7而是更新的系统比如Rocky Linux或AlmaLinux安装步骤几乎大同小异官网的Yum仓库也都有对应的包。MySQL 8.0在Linux下的安装思路是通用的掌握一次就可以复用到大部分平台上。
返回列表