资讯动态

2024年Linux系统安装MySQL 5.7超详细指南与深度排坑

发布时间:2026/8/13 1:59:47 来源:尧图企业网站定制
1. 为什么在Linux上安装MySQL 5.7依然是个技术活如果你在2024年还看到有人搜索“linux下如何安装mysql5.7超详细”可能会觉得有点奇怪。毕竟MySQL 8.0已经发布好几年了各大云厂商的默认版本也早就升级了。但作为一名常年和数据库打交道的运维我太清楚这里面的门道了存量系统的兼容性、特定框架的依赖、以及某些“祖传”应用对老版本的硬性要求让MySQL 5.7这个2015年发布的版本至今依然活跃在无数生产服务器上。尤其是在一些金融、传统企业或使用特定历史版本框架比如一些老版本的WordPress插件、ERP系统的场景里升级数据库版本带来的风险远大于收益因此“原地安装”或“重装”5.7就成了刚需。然而正是这种“刚需”让很多新手甚至有些经验的开发者踩坑。你以为yum install mysql-server或apt install mysql-server就能搞定在现在的Linux发行版上默认仓库提供的很可能已经是8.0了。直接从官网下载二进制包又可能遇到依赖库缺失、初始化失败、启动报错、密码策略诡异等一系列问题。网上的教程五花八门有的步骤缺失有的用了过时的源导致照做之后问题百出。所以这篇超详细指南就是为你扫清这些障碍。我将以最主流的CentOS 7/8和Ubuntu 20.04/22.04为例带你走通从零开始到一个安全、可用的MySQL 5.7服务端成功运行的全过程。我会解释每一个关键步骤背后的原因并分享那些官方文档不会写但实际部署中一定会遇到的“坑”和解决方案。我们的目标不仅是“装上”更是“装得明白、装得稳定”。2. 战前准备理清思路与规避常见误区在动手敲下第一条命令之前花几分钟理清思路能帮你节省几小时的排错时间。安装MySQL 5.7本质上是在做三件事获取正确的软件包、解决系统依赖、进行安全初始化。围绕这三点有几个关键决策需要提前做出。2.1 安装方式选型包管理器 vs 二进制包 vs 源码编译对于绝大多数应用场景我强烈推荐使用操作系统官方的包管理器Yum/DNF或APT来安装但需要添加MySQL官方提供的专属软件仓库Repository。这是最平衡、最易维护的方案。使用系统默认仓库不推荐如前面所说新系统默认仓库可能已升级到MySQL 8.0。即使有5.7版本也可能较旧缺少安全更新。下载Tarball二进制包安装这种方式灵活可以安装到任意目录但需要手动解决所有依赖、手动创建用户和配置服务步骤繁琐后期升级和维护麻烦。除非你有极其特殊的目录权限要求否则不推荐。源码编译安装最灵活也最复杂可以深度定制编译参数但耗时极长对机器资源要求高通常只适用于需要深度定制或研究数据库内核的场景。为什么选择官方仓库MySQL官方为主流Linux发行版维护了高质量的RPM或DEB包仓库。通过它安装你可以获得自动依赖管理包管理器会自动处理libaio、numactl等依赖库。集成服务管理安装后自动配置systemd服务可以使用systemctl命令方便地启停。便捷的升级路径官方仓库会提供安全更新你可以用包管理器一键升级小版本。标准的文件布局配置文件(/etc/my.cnf)、数据目录(/var/lib/mysql)、日志文件(/var/log/mysqld.log)都放在系统约定俗成的位置符合管理习惯。2.2 环境检查与依赖确认无论选择哪种方式先检查一下你的系统环境。首先检查是否已有旧版本MySQL或MariaDB。这是冲突的最大来源。运行以下命令检查# 检查MySQL相关包 rpm -qa | grep mysql # CentOS/RHEL dpkg -l | grep mysql # Ubuntu/Debian # 检查MariaDB相关包 (MariaDB是MySQL的一个分支会冲突) rpm -qa | grep mariadb # CentOS/RHEL dpkg -l | grep mariadb # Ubuntu/Debian如果发现有旧版本必须彻底移除。注意移除数据库软件包可能会同时删除已有的数据库数据文件如果这是生产服务器且有数据请务必先备份。干净的安装环境通常需要执行# CentOS/RHEL 示例 sudo systemctl stop mysqld sudo yum remove -y mysql mysql-server mariadb-server mariadb-libs sudo rm -rf /var/lib/mysql # 谨慎这会删除所有数据 sudo rm -rf /etc/my.cnf /etc/my.cnf.d # Ubuntu/Debian 示例 sudo systemctl stop mysql sudo apt-get remove --purge -y mysql-server mysql-client mysql-common sudo apt-get autoremove -y sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysql其次安装基础依赖工具。我们后续需要用到wget来下载仓库配置用gnupg来验证软件签名。# CentOS/RHEL sudo yum install -y wget gnupg2 # Ubuntu/Debian sudo apt-get update sudo apt-get install -y wget gnupg3. 实战部署为CentOS/RHEL家族添加MySQL仓库并安装这里我们以CentOS 7为例CentOS 8或Rocky Linux、AlmaLinux等RHEL系衍生版步骤高度相似。3.1 下载并安装MySQL官方的Yum仓库MySQL官方提供了一个仓库安装包.rpm文件这个包本身不包含MySQL它只会在你的系统/etc/yum.repos.d/目录下添加一个.repo文件告诉yum去哪里下载真正的MySQL软件包。进入临时目录并下载仓库包cd /tmp sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm注意这个URL中的mysql80-community-release-el7-11.noarch.rpm是一个“仓库配置包”。它的名字里虽然有mysql80但它包含了MySQL 5.5, 5.6, 5.7, 8.0等多个版本的仓库配置。默认是启用8.0的我们需要手动启用5.7。安装这个仓库包sudo rpm -ivh mysql80-community-release-el7-11.noarch.rpm安装成功后你可以在/etc/yum.repos.d/目录下看到新增了mysql-community.repo和mysql-community-source.repo文件。3.2 关键一步启用MySQL 5.7仓库禁用8.0仓库这是核心步骤用yum-config-manager工具来自yum-utils包来修改仓库配置。安装配置工具sudo yum install -y yum-utils禁用MySQL 8.0仓库启用5.7仓库sudo yum-config-manager --disable mysql80-community sudo yum-config-manager --enable mysql57-community你可以验证一下是否设置正确sudo yum repolist enabled | grep mysql应该只看到mysql57-community相关的仓库是启用的。3.3 安装MySQL 5.7服务器并启动执行安装sudo yum install -y mysql-community-server这个命令会安装mysql-community-server主服务、mysql-community-client客户端工具、mysql-community-libs共享库等一整套组件。yum会自动处理所有依赖。启动MySQL服务并设置开机自启sudo systemctl start mysqld # 启动服务 sudo systemctl enable mysqld # 设置开机自启 sudo systemctl status mysqld # 检查服务状态看到active (running)就表示服务启动成功了。3.4 获取初始随机密码并安全加固MySQL 5.7在首次启动后会为root用户生成一个临时的随机密码并记录在日志文件中。这是安全性的重要改进。从日志中查找临时密码sudo grep temporary password /var/log/mysqld.log输出类似2024-05-10T03:02:12.123456Z 1 [Note] A temporary password is generated for rootlocalhost: JqweKsl_8Qa-。冒号后面的JqweKsl_8Qa-就是你的临时密码复制它。使用临时密码登录并修改mysql -u root -p输入刚才复制的临时密码。登录成功后你会立刻被要求修改密码否则无法执行任何其他操作。-- 必须首先修改root密码密码需符合默认策略至少8位包含大小写字母、数字、特殊字符 ALTER USER rootlocalhost IDENTIFIED BY YourNewStrongPassword123!; -- 刷新权限使更改生效 FLUSH PRIVILEGES;运行安全安装脚本强烈推荐 MySQL提供了一个交互式脚本mysql_secure_installation能帮你完成一系列安全加固操作。sudo mysql_secure_installation根据提示进行输入你刚设置的新root密码。是否设置密码验证策略建议先选0低方便测试生产环境按需选择。是否更改root密码如果刚改过选n。是否移除匿名用户选y。是否禁止root远程登录选y生产环境最佳实践。后续需要远程管理再创建独立账号。是否移除测试数据库test选y。是否立即重载权限表选y。至此CentOS 7上的MySQL 5.7就安装并基本安全加固完成了。你可以用新密码再次登录mysql -u root -p进行验证。4. 实战部署为Ubuntu/Debian家族添加MySQL仓库并安装Ubuntu的APT包管理器逻辑与Yum类似但仓库添加方式稍有不同。我们以Ubuntu 22.04 LTS为例。4.1 下载并安装MySQL官方的APT仓库配置包与RHEL系不同MySQL为Debian/Ubuntu提供的是.deb仓库配置包。下载仓库配置包cd /tmp sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb注意版本号0.8.24-1可能会更新。如果链接失效可以去MySQL官网下载页面查找最新版。安装配置包sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb安装过程中会弹出一个蓝色的文本配置界面如果是在SSH无图形环境会以后台方式设置。你需要用方向键选择选择MySQL Server Cluster-mysql-5.7。选择Ok确认。 这个操作会正确配置APT源指向MySQL 5.7的仓库。4.2 更新软件源并安装MySQL更新本地APT包缓存sudo apt-get update这个命令会读取新添加的MySQL仓库信息。安装MySQL服务器sudo apt-get install -y mysql-server在安装过程中新版本的安装程序可能会交互式地询问你设置root密码。请务必设置一个强密码。如果安装过程没有提示则和CentOS一样密码在日志中。4.3 服务管理与密码处理检查服务状态sudo systemctl status mysqlUbuntu的服务名通常是mysql而不是mysqld。处理root密码如果安装时未设置 如果安装时没有提示设置密码那么MySQL 5.7使用了名为auth_socket的插件允许Unix Socket peer即系统用户无需密码以root身份登录。这很安全但有时不方便。# 无需密码直接用sudo权限登录 sudo mysql登录后你可以选择切换到传统密码验证方式-- 切换到mysql_native_password插件并设置密码 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourNewStrongPassword123!; FLUSH PRIVILEGES;之后你就可以用mysql -u root -p和密码登录了。运行安全加固脚本sudo mysql_secure_installation步骤与CentOS部分完全一致根据提示移除匿名用户、禁止root远程登录、删除测试数据库等。5. 安装后的核心配置与基础操作指南安装完成只是第一步让MySQL按照你的需求工作还需要了解一些核心配置和操作。5.1 理解配置文件my.cnfMySQL的主要配置文件是my.cnf或my.ini在Windows上。它的读取位置有优先级/etc/my.cnf全局配置/etc/mysql/my.cnfUbuntu常见~/.my.cnf用户特定配置包管理器安装后通常会在/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf中有一个基础配置。你可以通过以下命令查找配置文件sudo mysql --help | grep -A 1 Default options常见需要修改的配置项在[mysqld]段下修改[mysqld] # 数据存储目录 datadir/var/lib/mysql # socket文件位置 socket/var/lib/mysql/mysql.sock # 字符集设置避免中文乱码非常重要 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci # 最大连接数默认151根据服务器内存和应用调整 max_connections200 # 默认存储引擎 default-storage-engineINNODB # InnoDB缓冲池大小通常是系统内存的50%-70%是性能关键参数 innodb_buffer_pool_size1G # 绑定地址0.0.0.0表示允许所有IP连接127.0.0.1表示只允许本机。生产环境慎用0.0.0.0 bind-address127.0.0.1修改配置后必须重启MySQL服务生效sudo systemctl restart mysqld # CentOS sudo systemctl restart mysql # Ubuntu5.2 基础数据库操作与用户管理登录MySQL后除了业务建库建表日常运维离不开用户和权限管理。创建新数据库和用户最佳实践 永远不要用root账户直接连接应用。应该为每个应用创建独立的数据库和用户。-- 创建一个名为myapp的数据库使用utf8mb4字符集 CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建一个用户myapp_user并设置密码限制其只能从本地连接 CREATE USER myapp_userlocalhost IDENTIFIED BY StrongUserPassword456!; -- 授予用户myapp_user对数据库myapp的所有权限 GRANT ALL PRIVILEGES ON myapp.* TO myapp_userlocalhost; -- 立即刷新权限使授权生效 FLUSH PRIVILEGES;这样你的应用程序就可以使用myapp_user和对应的密码连接localhost上的myapp数据库了。如果需要允许远程连接谨慎操作首先在my.cnf中确认bind-address不是127.0.0.1或者将其注释掉#bind-address127.0.0.1。重启MySQL服务。在MySQL中创建允许从特定IP或所有IP%连接的用户。-- 允许从192.168.1.100连接的用户 CREATE USER remote_user192.168.1.100 IDENTIFIED BY RemotePass789!; GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO remote_user192.168.1.100; FLUSH PRIVILEGES; -- 允许从任何IP连接的用户风险高仅用于测试 -- CREATE USER remote_user% IDENTIFIED BY RemotePass789!;务必配置服务器防火墙如firewalld, ufw只允许特定的IP地址访问MySQL的3306端口。5.3 日志文件与故障排查MySQL的日志是排错的生命线主要关注以下几个错误日志(Error Log)记录启动、运行、停止过程中的错误信息。默认位置CentOS:/var/log/mysqld.logUbuntu:/var/log/mysql/error.log查看最新错误sudo tail -f /var/log/mysqld.log慢查询日志(Slow Query Log)记录执行时间超过long_query_time默认10秒的查询。用于性能优化。需要在my.cnf中配置开启。[mysqld] slow_query_log1 slow_query_log_file/var/log/mysql/mysql-slow.log long_query_time2 # 设置为2秒更敏感通用查询日志(General Query Log)记录所有连接和执行的语句。对性能有影响仅在深度调试时临时开启。6. 深度排坑那些年我踩过的MySQL 5.7安装坑即便按照最详细的教程在实际的服务器环境中你仍可能遇到一些诡异的问题。这里分享几个高频坑点及其解决方案。6.1 坑一依赖库libaio缺失导致安装/初始化失败问题现象在安装二进制包或初始化数据库时报错error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory。根因分析MySQL的InnoDB存储引擎依赖异步I/O库libaio来提升性能。最小化安装的Linux系统可能没有这个库。解决方案# CentOS/RHEL sudo yum install -y libaio # Ubuntu/Debian sudo apt-get install -y libaio1如果是二进制包安装装完依赖后需要重新运行初始化脚本。6.2 坑二SELinux或AppArmor阻止MySQL访问文件问题现象MySQL服务启动失败错误日志中提示“Permission denied”或“Cannot create file”但目录的Linux文件权限ls -l看起来是正确的。根因分析这是Linux的强制访问控制MAC安全模块在作祟。CentOS/RHEL默认启用SELinuxUbuntu可能启用AppArmor。它们有比文件权限更严格的规则。解决方案临时/测试环境SELinux可以临时设置为宽容模式。sudo setenforce 0 # 临时生效 sudo getenforce # 查看状态应为Permissive永久关闭需编辑/etc/selinux/config设置SELINUXdisabled并重启生产环境不推荐直接关闭。AppArmor可以禁用MySQL的配置。sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld最佳实践生产环境根据错误日志使用正确的安全上下文或AppArmor规则而不是直接关闭。例如对于SELinux如果数据目录不是/var/lib/mysql需要修改其上下文sudo semanage fcontext -a -t mysqld_db_t /your/data/path(/.*)?然后sudo restorecon -Rv /your/data/path。6.3 坑三MySQL 5.7的密码验证策略validate_password问题现象修改用户密码时失败提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。根因分析MySQL 5.7引入了validate_password插件默认安装并启用。它要求密码满足一定强度长度、大小写、数字、特殊字符。查看当前策略SHOW VARIABLES LIKE validate_password%;你会看到关于长度、策略等级等参数。解决方案设置一个符合要求的强密码首选。临时降低策略要求仅用于测试或内部环境-- 设置策略等级为低0:低1:中2:高 SET GLOBAL validate_password_policyLOW; -- 设置密码最小长度为4 SET GLOBAL validate_password_length4; -- 然后重试修改密码彻底禁用插件不推荐有安全风险 在my.cnf的[mysqld]段添加validate_passwordOFF然后重启MySQL。6.4 坑四忘记root密码怎么办这是一个经典问题。解决思路是让MySQL在启动时跳过权限验证。停止MySQL服务sudo systemctl stop mysqld以安全模式启动MySQL跳过权限表sudo mysqld_safe --skip-grant-tables --skip-networking --skip-networking是为了防止此时被远程无密码登录增加安全性。用root用户无密码登录mysql -u root在MySQL中更新root密码-- 切换到mysql数据库 USE mysql; -- MySQL 5.7中密码存储在authentication_string字段 UPDATE user SET authentication_stringPASSWORD(YourNewStrongPassword123!) WHERE Userroot; -- 如果是较新的版本或使用了不同的插件可能需要使用ALTER USER语句 -- ALTER USER rootlocalhost IDENTIFIED BY YourNewStrongPassword123!; FLUSH PRIVILEGES; EXIT;重启MySQL服务到正常模式# 先结束安全模式的进程 sudo pkill mysqld sudo pkill mysqld_safe # 正常启动服务 sudo systemctl start mysqld现在你应该可以用新密码YourNewStrongPassword123!登录了。7. 性能初调与监控入门安装配置好后对于一个小型应用或测试环境进行一些基本的性能调优和监控设置能让数据库运行得更顺畅。7.1 几个关键的配置参数调整编辑/etc/my.cnf在[mysqld]段添加或修改以下参数根据服务器内存调整假设服务器内存为2G[mysqld] # InnoDB缓冲池用于缓存数据和索引。设置为物理内存的50%-70%。 innodb_buffer_pool_size 1G # 最大连接数。默认151如果应用有较多并发可以调高。 max_connections 300 # 查询缓存。在MySQL 5.7中查询缓存query_cache已知有严重的可扩展性问题在高并发下可能导致性能下降。从MySQL 5.7.20开始它被标记为弃用在8.0中被移除。建议直接关闭。 query_cache_type 0 query_cache_size 0 # 临时表大小。如果有很多复杂的GROUP BY或排序操作可以适当调大。 tmp_table_size 64M max_heap_table_size 64M # 连接超时和交互超时避免长时间空闲连接占用资源。 wait_timeout 600 interactive_timeout 600 # 开启慢查询日志用于后续优化 slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 2 log_queries_not_using_indexes 1 # 记录未使用索引的查询修改后重启MySQL服务。7.2 使用mysqltuner进行一键体检mysqltuner是一个用Perl写的脚本能快速分析你的MySQL状态和配置并给出优化建议。下载并运行cd /tmp wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl perl mysqltuner.pl理解输出脚本会要求你输入MySQL的管理员账号密码。之后会输出大量信息重点关注以下几部分[!!]开头的行表示可能存在的问题或严重警告。[OK]开头的行表示状态良好。General recommendations一般性建议如调整innodb_buffer_pool_size的大小。Variables to adjust具体的参数调整建议。注意不要盲目采纳所有建议尤其是关于内存的参数。需要结合你的服务器总内存和应用实际负载来判断。7.3 基础监控学会看几个重要的状态变量登录MySQL运行一些SHOW命令可以快速了解数据库健康状况。-- 查看全局状态包含大量计数器 SHOW GLOBAL STATUS; -- 查看当前正在运行的线程连接信息 SHOW PROCESSLIST; -- 查看InnoDB引擎状态包含缓冲池使用情况、行锁等信息 SHOW ENGINE INNODB STATUS\G -- \G 使结果垂直显示更易读 -- 查看关键的几个状态变量 SHOW GLOBAL STATUS LIKE Threads_connected; -- 当前连接数 SHOW GLOBAL STATUS LIKE Max_used_connections; -- 历史最大连接数 SHOW GLOBAL STATUS LIKE Innodb_buffer_pool_read%; -- 缓冲池命中率相关 -- 计算缓冲池命中率理想应99% -- (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100%把这些检查点融入到你的日常运维中就能对MySQL 5.7实例的健康状况有一个基本的把握。从安装、配置、避坑到初步调优监控这套组合拳下来你的MySQL 5.7应该已经是一个状态稳定、基础扎实的服务了。记住数据库运维是一个持续的过程尤其是在生产环境定期备份、监控告警、根据业务增长调整配置都是必不可少的后续工作。

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

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

免费获取报价