☰
MySQL在Linux上的安装全攻略:从官方Yum仓库到远程连接
2026/10/20 5:48:08 网站建设 项目流程

搞Linux的同学,早晚都会碰上MySQL安装这件事。不管是自己搭个测试环境、跑个人项目,还是帮公司部署一套业务库,MySQL都是绕不开的那个坎。但别小看这一步,很多人在Windows上装MySQL装得挺顺,一换到Linux就开始各种翻车——仓库源配错、密码绕不明白、root连不上、中文乱码,一个接一个。

这篇文章我把实际安装过程中踩过的坑、验证过的方案、还有那些网上教程一般不告诉你的细节都整理出来。基于最常见的CentOS系Linux系统来讲,用官方Yum仓库方式安装,附带初始化配置和远程连接排查的完整链路。适合刚接触Linux的小白,也适合被MySQL配置折腾过、想一次装明白的开发者。

1. 先说结论:三种安装方式,我为什么推荐官方Yum仓库

MySQL在Linux上的安装方式大致有三种:系统自带软件源安装、官方Yum仓库安装、源码编译安装。很多人第一次装的时候都懵,不知道选哪个好,我直接先给结论——用官方Yum仓库,省心、可控、升级方便。

系统自带源安装是最省事的路子,一条命令就能装完,但坑在版本。CentOS 7自带的源里是MySQL 5.6,CentOS 8里面版本也不高,现在的业务动不动就要8.0的新特性,功能差异且不说,后面想升级还得重新折腾源。另一个更隐蔽的问题是,有些系统源里默认给的是MariaDB——这是MySQL的一个分支,命令兼容但行为和细节不一样,很多排错文章写的是MySQL的路径,你照着做会发现对不上。如果你只是临时需要一个数据库跑跑脚本,系统自带源可以;但凡正经要用,我建议别省这一步。

源码编译安装这种路子一般只出现在两种场景:一是需要定制编译参数,比如特定的字符集、特定的存储引擎、静态编译进某个架构;二是某些内网环境完全隔离,连官方Yum仓库都访问不到。说实话,普通场景我真不建议编译安装。MySQL的编译时间以小时计,依赖一堆开发包,编译参数选错后面排错更是折磨。而且编译安装默认路径散落在/usr/local/mysql下面,配置文件、日志、数据文件的路径都和标准布局不一样,新手照着标准文档操作很容易踩坑。

官方Yum仓库安装是平衡了效率和可控性的方案。它提供专门的仓库配置文件,指向官方维护的软件包,装的时候能选版本(比如指定装8.0还是5.7),升级也能直接用命令完成。软件包在官方仓库里做了充分的兼容性测试,依赖关系处理得明明白白,服务脚本、默认配置、日志轮转这些配套都给你准备好。我用这种方式在几台服务器上装了不下十次,没有一次因为安装过程本身出问题,这也是为什么我推荐新手先走这条路。

三种方式对比下来就是这样:

安装方式操作难度版本可控性升级便利性适用场景
系统自带源低低差临时测试、快速环境
官方Yum仓库中低高好开发环境、生产部署
源码编译高高差定制化需求、离线环境

2. 动手前先做环境检查和准备

装系统软件这件事,准备工作做足一半,后面能省一大半事。很多人在安装中段才发现系统环境有问题,回头补功课,反而耽误时间。我列几个有必要确认的点。

2.1 先弄清楚Linux发行版和版本

不同系的Linux发行版,包管理器和命令习惯不一样,你搜到的教程是基于哪套系统的,先搞清楚再跟着做。确认系统版本只需要一条命令:

cat /etc/os-release

输出的内容里重点看NAME和VERSION_ID。如果是CentOS 7、CentOS 8、Rocky Linux、AlmaLinux这类RedHat系,下面的步骤可以直接抄作业;如果是Ubuntu、Debian这系Debian系系统,官方安装渠道是APT仓库,命令长得很像但细节不同,比如包的命名规范、配置文件路径都有差异。

顺带提一嘴,CentOS 7和CentOS 8的MySQL配置文件默认位置也不一样。CentOS 7时代主流是/etc/my.cnf,8.0的软件包会额外加载/etc/my.cnf.d/目录下的配置文件。有些教程只让你改my.cnf主文件,在CentOS 8上你改完发现不生效,就是这个原因。

2.2 清理可能存在的旧版本和残留

如果这台机器之前装过MySQL或者MariaDB,直接覆盖安装往往会出问题。最典型的就是数据目录和配置文件冲突,新装的MySQL用旧的数据目录启动,版本不兼容直接起不来。

安装之前先检查有没有装过相关软件:

rpm -qa | grep -i -E "mysql|mariadb"

如果有输出,看情况决定是否卸载。如果机器上没有你要的数据,干净卸载是首选:

# 停止服务(如果正在运行) systemctl stop mysqld systemctl stop mariadb # 卸载相关软件包 yum remove -y mysql-* mariadb-*

还有一个容易忽略的地方——/var/lib/mysql这个目录,这是MySQL默认的数据文件存放位置。如果你确定旧数据不要了,顺手把它也清掉,避免新旧版本数据格式不一致导致启动异常:

rm -rf /var/lib/mysql

注意:清理数据目录这个操作不可逆。如果不是确认旧数据没用,或者没有提前备份,不建议直接删。

我还遇到过一种情况:机器上确实没装过MySQL,但/var/lib/mysql目录被其他程序创建了,目录权限不对,MySQL初始化失败。安装前最好顺手看一眼这个目录是否存在,如果存在且不是空目录,权限调整到mysql:mysql:

mkdir -p /var/lib/mysql chown -R mysql:mysql /var/lib/mysql

2.3 处理SELinux和防火墙,避免装了白装

SELinux是很多人忽略的一个拦路虎。它默认开启的情况下,MySQL进程的活动会被限制,最典型的就是数据目录放在非默认位置时,MySQL启动后报权限错误,但普通文件权限你看上去完全正常。这种问题排查起来非常折磨人。

检查SELinux状态:

getenforce

如果输出Enforcing,说明SELinux在强制模式。对新手来说,最省事的处理是临时关闭它:

setenforce 0

永久关闭要改配置文件,/etc/selinux/config里把SELINUX=enforcing改成SELINUX=disabled。

不过我要说一句:如果你后面要上生产环境,不建议长期关SELinux。比较规范的做法是给MySQL对应的目录打上正确的SELinux上下文标签,比如数据目录迁移时用restorecon或者semanage去调整。但那套玩法对新手太不友好,学习阶段先用关闭的方式跳过障碍,等有经验了再回头研究SELinux的管理。

防火墙这边主要是后面远程连接会用到。CentOS 8之后默认用的是firewalld,CentOS 7也是。如果你安装时没动防火墙,3306端口默认是不对外的。检查端口放行情况:

firewall-cmd --list-all

如果后面需要远程连接,先把MySQL端口在防火墙里放行。这个操作放到配置远程访问那一步一起做也行,但你现在心里要有个数,后面连不上的时候知道往防火墙方向查。

3. 使用官方Yum仓库安装MySQL的完整步骤

环境准备好之后,正式进入安装流程。网上很多教程写这一块比较跳跃,我尽量把每一步都讲透,包括为什么要这样做。

3.1 添加MySQL官方Yum仓库

第一步是下载并安装MySQL官方的仓库配置文件。这个文件会告诉Yum从哪里下载MySQL的软件包。官方文档里的命令是访问一个下载地址,但每次版本更新地址都会变,我更推荐用下面的方式获取最新地址:进入MySQL官方Yum仓库页面,找到当前对应系统版本的RPM包地址,然后下载安装。

以CentOS系为例,实际的命令模式是这样的:

rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-7.rpm

系统版本不同,包名里的el7或el8要对应好。在下载之前,先用cat /etc/os-release确认系统版本,再选对应的包。

安装完仓库包之后,确认仓库已生效:

yum repolist enabled | grep mysql

这里能看到仓库列表里出现了mysql相关的源。如果没有任何输出,检查一下是不是下载的RPM包和系统版本不匹配。

如果机器网络访问不了官方源,常见的替代方案是配置国内镜像源。但镜像源配置方案各家镜像站不一样,我建议直接去对应的镜像站看配置文档,这里不展开,免得你用错。

3.2 安装MySQL并启动服务

仓库配置好之后,安装软件本体反而最简单了:

yum install -y mysql-community-server

这条命令会安装MySQL服务端、客户端以及相关的依赖包。安装完之后,启动服务:

systemctl start mysqld systemctl enable mysqld # 设置开机自启

查看启动状态:

systemctl status mysqld

看到active (running)说明服务已经起来了。如果启动失败,不要慌,直接看日志,日志文件默认在/var/log/mysqld.log:

tail -n 50 /var/log/mysqld.log

大多数启动失败的原因集中在权限问题、数据目录冲突、配置文件语法错误。日志里通常会有明确提示,顺着排查就好。

3.3 找回初始临时密码

MySQL从5.7版本开始,安装后的root用户默认生成了一个临时密码,这个设计是为了安全,但确实坑了不少人。临时密码记录在错误日志文件里:

grep "temporary password" /var/log/mysqld.log

输出类似这样:

[Note] A temporary password is generated for root@localhost: xxxxxxxx

冒号后面的部分就是临时密码。用这个密码登录:

mysql -uroot -p

输入临时密码后,你会进入MySQL命令行。但注意,8.0版本要求你登录后先修改密码,不然任何操作都会被提示密码过期:

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

这里有一个容易卡住的坑:MySQL默认的密码策略要求密码包含大小写字母、数字和特殊字符,长度至少8位。如果你设置的新密码不满足要求,会直接报错。第一次设置的时候别和这个策略硬刚,老老实实设置一个合规密码,后面想调低安全策略再执行:

SHOW VARIABLES LIKE 'validate_password%';

确认策略内容之后再决定要不要调整validate_password.policy等参数。如果你是新装的个人开发环境,嫌这个策略麻烦,可以设置成只校验长度。但生产环境我建议保留默认策略,密码强度高一点总没坏处。

3.4 执行安全初始化配置

MySQL提供了一个安全初始化脚本,用来做一些基础的安全加固,减少不必要的风险。登录MySQL之后执行下面这行:

mysql_secure_installation

这个命令本质上是一个交互式向导,会让你配置几个选项:

  • 是否设置密码强度校验插件
  • 是否修改root密码
  • 是否删除匿名用户
  • 是否禁止root远程登录
  • 是否删除test测试数据库
  • 是否立即刷新权限表

我实际跑这个脚本的经验是:前两个根据自己需求选,后面几个全选y基本不会错。删除匿名用户、禁用root远程登录、删除test数据库这些操作对普通场景都是安全的,而且能避免很多潜在麻烦。

提示:脚本执行过程中会让你输入root密码,注意区分这里输入的密码和临时密码。如果忘了临时密码,参考后面“忘记密码找回”那一节的处理办法。

4. 核心配置文件解读与参数调整

MySQL安装完能跑只是第一步,你想让它稳定高效地干活,配置文件这关躲不掉。我见过不少同学装完就用默认配置跑业务,结果跑一段时间发现各种性能问题。理解配置文件的逻辑,比记住一堆参数更重要。

4.1 搞清楚配置文件的加载顺序

MySQL在启动时会按顺序读取多个配置文件,后读取的配置会覆盖先读取的。这个顺序搞不清楚,你很容易遇到“改了配置不生效”的问题。

默认的读取顺序用下面命令查看:

mysql --help | grep "my.cnf"

常见的顺序是:

/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

实际使用中,多数情况只需要关心/etc/my.cnf这个文件。CentOS系统里,/etc/my.cnf经常会用!includedir /etc/my.cnf.d/的方式引用目录下所有以.cnf结尾的文件。这意味着你在/etc/my.cnf.d/下新建一个配置文件也能生效,而且更清晰。

我个人的习惯是在/etc/my.cnf.d/下建一个命名清楚的配置文件,比如custom.cnf,把自定义参数都放进去,和系统默认配置分开,方便维护。

4.2 常用参数速览与调整思路

下面这几个参数是安装后我会重点检查的:

[mysqld] port=3306 bind-address=0.0.0.0 max_connections=500 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci default-time-zone='+08:00'

max_connections这个参数特别容易被忽略,默认值151对个人开发环境够用,但一旦并发请求上来,数据库直接拒绝连接,日志里全是“Too many connections”的报错,那时候再改配置重启就有点晚了。

bind-address如果只想本机访问,保持默认的127.0.0.1;如果需要远程连接,改成0.0.0.0表示监听所有网卡。这个参数改完要重启MySQL才能生效。

修改完配置文件后,先做个语法检查再重启:

mysqld --validate-config

如果配置文件没有语法错误,命令会静默退出,然后重启:

systemctl restart mysqld

4.3 字符集配置,别让中文变成问号

字符集是中文环境下必须处理的一个配置。MySQL 8.0的默认字符集是utf8mb4,比5.7时代默认的latin1合理很多,但不是所有系统都默认配到位了。为了彻底避免乱码问题,我建议在配置文件里显式声明:

[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4

utf8mb4和utf8的区别在于,utf8mb4支持完整的Unicode包括emoji字符,而utf8在MySQL里实际上只能存最多3字节的字符。现在的业务里用户输入什么内容都有,保险起见一律用utf8mb4。

改完以后验证是否生效:

SHOW VARIABLES LIKE '%character_set%'; SHOW VARIABLES LIKE '%collation%';

看到character_set_server的值是utf8mb4就说明配置生效了。注意,这里改的是默认字符集,新创建的库和表都会用这个字符集,但已有的库表不会自动变,需要单独转换,这个后面在常见问题部分细说。

4.4 数据目录迁移,磁盘空间不够时的出路

默认情况下MySQL的数据文件写在/var/lib/mysql,这个目录一般挂载在系统盘上。如果你的系统盘空间紧张,而数据盘空间充足,迁移数据目录就是一个实际需求。

迁移步骤概括起来是:停止MySQL服务,复制数据目录到新位置,改配置文件,启动服务验证。

systemctl stop mysqld cp -a /var/lib/mysql /数据盘路径/mysql_data chown -R mysql:mysql /数据盘路径/mysql_data

然后修改/etc/my.cnf:

[mysqld] datadir=/数据盘路径/mysql_data

启动前务必确认新数据目录的属主和属组是mysql:mysql,否则MySQL会因为没权限启动失败。另外,如果SELinux是开启的,这一步操作很容易遇到启动不了的情况,解决思路参考前面2.3节提到的方式。

5. 开启远程访问的完整链路排查

装好了MySQL,用服务器本机连接没问题,但开发环境往往需要从本地的Navicat、DataGrip这类客户端连过去。这一步涉及的东西不止MySQL一个环节,好几道关卡都要打通,遇到连不上的问题按链路逐层排查。

5.1 用户权限与Host绑定的关系

MySQL里的用户不像系统用户那样只是一个名字,它是由用户名和允许登录的主机两个维度共同定义的。你看到'root'@'localhost'的意思是:root用户只能从本机(localhost)登录。如果你在客户端用一个root用户去连服务器,即使密码正确,MySQL也会拒绝,因为它匹配不到对应的用户记录。

查看当前用户和主机绑定情况:

SELECT user, host, plugin FROM mysql.user;

对于远程连接,最省事的做法是创建一个专用账号:

CREATE USER 'dev'@'%' IDENTIFIED BY '合规的密码'; GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%'; FLUSH PRIVILEGES;

%表示这个账号可以从任意主机连接,如果你只想让特定的IP段连,就写具体IP,比如'dev'@'192.168.1.%',这样更安全。

注意:很多人习惯直接改root的host为%来允许远程连接,我不建议这么干。root权限太大,远程暴露root账户本身就意味着风险。创建一个最小权限的专用账号,是更负责任的做法。

5.2 配置文件里的bind-address和端口监听

远程连接的另一道关卡是MySQL监听的地址。前面配置文件部分提到过bind-address,这里展开说。

如果bind-address是默认的127.0.0.1,MySQL只监听本机回环地址,外部的网络请求根本到不了这个服务,甚至不会进入认证环节。在服务器上验证监听情况:

ss -tlnp | grep 3306

如果看到127.0.0.1:3306,说明只监听本机;如果想对外提供服务,需要改成0.0.0.0:3306或者具体的内网IP。

修改配置重启后,再次用ss命令确认输出变成了0.0.0.0:3306,这一步才算过去。

5.3 防火墙和云平台安全组

即使MySQL配置好了监听地址和用户权限,还有一个容易被忽略的环节——防火墙和云平台安全组。这两个是不同层面的东西,但效果都是拦截外部连接。

先看服务器本机的防火墙:

firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload firewall-cmd --list-ports

如果你是云服务器,还需要去云平台控制台的安全组策略里放行3306端口。每家的控制台位置不一样,但逻辑都是:添加一条入方向规则,协议TCP,端口3306,源地址按需填写(建议不要用0.0.0.0/0)。

排查远程连接问题时,我习惯按这个顺序快速验证:

  1. 在服务器本机执行mysql -uroot -p确认服务正常
  2. 在服务器本机执行mysql -h127.0.0.1 -P3306 -uroot -p确认TCP方式正常
  3. 在另一台机器执行ping 服务器IP确认网络通
  4. 用telnet 服务器IP 3306或者nc -vz 服务器IP 3306确认端口通

几步下来基本能定位出问题在哪一层。很多连接报错其实是卡在最后一步——端口都不通,MySQL配置得再好也没用。

6. 实战中高频踩坑记录

最后这部分全部来自真实环境中帮别人排查的实战记录。这些问题单独看都有点不起眼,但组合起来还真能把人折腾够呛。

6.1 临时密码过期怎么办

登录MySQL时提示密码过期,或者报错ERROR 1862 (HY000): Your password has expired。这不是密码错了,而是MySQL的密码过期策略生效了。

解决思路是用临时密码登录,然后立即设置新密码。如果已经忘了临时密码,去看/var/log/mysqld.log里有没有历史记录,没有的话就只能走忘记密码的重置流程了。

6.2 报错Can't connect to local MySQL server through socket

典型的报错信息是:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

出现这个报错,九成情况是MySQL服务没起来,或者socket文件路径不对。先用systemctl status mysqld确认服务状态,再检查/var/lib/mysql/mysql.sock这个文件是否存在。如果服务在跑但文件不存在,看看配置文件里socket参数有没有改过路径。

6.3 root远程连接被拒绝

报错是ERROR 1130 (HY000): Host 'xxx' is not allowed to connect to this MySQL server。

这个报错说明TCP链路是通的,但是MySQL拒绝了这个来源IP连接。原因就是前面第5节说的,用户绑定host不匹配——你的root只绑定了localhost,远程过来的连接没有对应用户记录。

解决思路不是去改root的host,而是给指定来源IP创建专用账号,然后再授权。参考5.1节的做法,把host字段改成对应的客户端IP或者网段。

6.4 中文乱码问题

乱码的原因非常多:客户端连接字符集不对、库表字符集不对、数据写入时字符集不对,任何一个环节出问题都可能导致乱码。

首先确认库表的字符集:

SHOW CREATE TABLE 表名\G

如果表的字符集是latin1而数据是中文,最简单的处理是用ALTER TABLE转换字符集:

ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

这条命令会转换表中的所有字符列。数据量大的表执行时间会比较长,选在业务低峰期操作比较稳妥。

排查乱码还有一个技巧:连接MySQL时显式指定字符集,排除客户端干扰:

mysql -uroot -p --default-character-set=utf8mb4

如果显式指定后不乱码了,说明问题是客户端连接的字符集不对,重点检查客户端的连接配置。

6.5 忘记root密码的应急处理

忘密码这事谁都会遇到,处理方法是绕过MySQL的权限校验启动服务,然后改密码。

第一步,停止MySQL:

systemctl stop mysqld

第二步,以跳过授权表的方式启动:

mysqld_safe --skip-grant-tables &

或者修改配置文件临时加一行skip-grant-tables再启动。然后登录MySQL:

mysql -uroot

登录后先刷新权限,再修改密码:

FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

改完之后记得把skip-grant-tables从配置文件里去掉,重启MySQL恢复正常模式。这个操作期间MySQL是不设防的,建议只在服务器本机操作,并且尽快完成密码修改。

写在最后的一些体会

我装MySQL的次数多了以后,最大的感受是:安装本身从来不是难点,难点在于你能否理解每个环节在做什么。官方Yum仓库解决的是软件包获取和依赖管理的问题,安全初始化解决的是默认配置暴露风险的问题,配置文件解决的是让MySQL适应你的场景的问题,远程连接排查则是一个典型的网络和服务联动的问题。每一个步骤背后都有它存在的理由,把这些理由吃透了,换个系统、换个版本,你都能很快上手。

最后分享一个小习惯:每次装完MySQL,我都会把关键的配置参数、初始密码的获取方式、以及这次安装遇到的坑记在一个文档里。别高估自己的记忆力,半年后你再回来看当初的服务器,这份记录能帮你省下大量时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询