ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CentOS 7下MySQL 5.7安装指南:YUM与TAR两种方式详解与实战

CentOS 7下MySQL 5.7安装指南:YUM与TAR两种方式详解与实战 1. 项目概述与核心价值在Linux服务器运维和开发环境搭建的日常工作中数据库的安装是绕不开的一环。CentOS 7作为一款经典、稳定的企业级Linux发行版至今仍在大量生产环境中服役。而MySQL 5.7尽管已有更新的版本但其在性能、功能稳定性和社区生态方面的成熟度使其依然是许多传统项目、特定软件依赖或对升级持保守态度团队的首选。因此掌握在CentOS 7上部署MySQL 5.7的可靠方法是一项非常实用的基础技能。这个项目标题点出了两种主流的安装方式yum和本地tar文件。这不仅仅是两个命令的差异背后代表的是两种截然不同的运维哲学和适用场景。yum安装代表着便捷、标准化和易于管理适合追求快速部署、统一版本和通过系统包管理器进行后续维护的环境。而本地tar文件安装则代表着灵活、可控和定制化它允许你将数据库安装到任意目录使用任意版本甚至进行一些深度定制特别适合需要隔离环境、进行多版本共存测试或者对安装路径有严格规范的生产环境。对于刚接触Linux的开发者可能会觉得直接yum install万事大吉但对于有经验的系统管理员他们深知tar安装虽然步骤稍多但在某些场景下能避免很多潜在的依赖冲突和路径污染问题。接下来我将为你详细拆解这两种方法从原理到每一步操作包括我踩过的坑和总结的最佳实践让你不仅能顺利完成安装更能理解为何这么做从而在面对不同需求时能做出最合适的选择。2. 环境准备与方案选型考量在开始动手之前充分的准备工作能让你事半功倍也能避免很多中途出现的诡异问题。首先你需要一个干净的CentOS 7环境。我强烈建议在操作前为系统做一个快照如果是虚拟机或者确认有可用的备份。数据库安装过程会修改系统配置、创建用户和目录一旦误操作回退起来比较麻烦。2.1 系统基础检查与清理登录系统后第一件事是进行基础检查。运行cat /etc/redhat-release确认系统版本是 CentOS 7。然后检查系统是否已经安装了旧版本的MySQL或MariaDBCentOS 7默认的MySQL分支。这是一个非常关键的步骤因为残留的旧版本会导致新安装的MySQL无法正常启动或端口冲突。# 检查是否已安装MySQL或MariaDB rpm -qa | grep -E mysql|mariadb # 如果存在请谨慎卸载。例如卸载MariaDB常见组件生产环境请先备份数据 sudo yum remove mariadb-server mariadb-client mariadb-libs -y注意mariadb-libs这个包尤其需要注意它是许多应用的基础依赖。直接卸载可能会影响其他软件。在纯净的服务器上问题不大但如果是在已有业务的服务器上务必评估影响。我个人的习惯是对于全新服务器直接卸载干净对于已有环境则更倾向于使用tar安装到独立目录避免干扰系统库。接下来更新系统并安装一些基础工具这能保证后续过程的顺畅。sudo yum update -y sudo yum install wget vim net-tools -y2.2 防火墙与SELinux策略调整CentOS 7默认的防火墙firewalld和SELinux可能会阻止MySQL的正常通信和运行。我们需要预先配置好。防火墙设置MySQL默认使用3306端口。我们需要永久开放此端口。sudo firewall-cmd --zonepublic --add-port3306/tcp --permanent sudo firewall-cmd --reload # 验证端口是否开放 sudo firewall-cmd --zonepublic --list-portsSELinux设置对于学习或测试环境临时关闭SELinux可以简化问题排查。但生产环境建议保持开启并配置正确的上下文。# 查看当前SELinux状态 getenforce # 临时设置为宽松模式重启后失效 sudo setenforce 0 # 永久禁用需重启生效编辑 /etc/selinux/config将 SELINUXenforcing 改为 SELINUXdisabled如果选择保持SELinux开启在tar安装方式中你可能需要为MySQL的数据目录和日志文件设置正确的安全上下文否则会遇到“权限拒绝”的错误。这通常是tar安装方式的一个小坑。2.3 两种安装方式的深度对比与选型为什么要有两种方式这绝不是冗余。理解它们的核心差异你才能做出正确选择。YUM安装的核心优势与场景自动化管理自动解决依赖关系无需手动寻找libaio、numactl等库。集成度高安装的服务会自动集成到systemd可以使用systemctl start mysqld进行管理符合CentOS 7的标准运维习惯。路径标准化所有文件二进制文件、配置文件、数据文件、日志文件都遵循FHS标准位于/usr/bin/etc/my.cnf/var/lib/mysql/var/log/mysqld.log等预定位置方便统一监控和管理。适合场景快速搭建标准化的开发、测试环境新手入门对安装目录无特殊要求的单实例生产环境。本地TAR安装的核心优势与场景绝对路径控制你可以将MySQL安装到任何目录例如/opt/mysql-5.7数据目录放到/data/mysql。这对于有严格分区规划如/分区较小/data分区独立且巨大的生产环境至关重要。版本隔离与多实例可以轻松在同一台服务器上安装多个不同版本的MySQL实例只需解压到不同目录配置不同的端口和数据目录即可互不干扰。规避系统包冲突完全绕过系统包管理器不会与系统自带的mariadb-libs或其他软件包的MySQL依赖产生任何冲突。适合场景需要自定义安装路径的生产环境进行多版本测试服务器环境复杂担心yum安装引发依赖冲突希望完全掌控MySQL文件布局的运维需求。简单来说求快、求省心、环境标准用YUM要定制、要隔离、环境复杂用TAR。下面我们分别深入两种方式的每一个细节。3. 方案一使用YUM仓库安装MySQL 5.7YUM安装的核心在于配置正确的仓库。Oracle官方提供了MySQL的YUM仓库但国内访问可能较慢。幸运的是国内各大镜像站如阿里云、腾讯云都提供了同步速度飞快。3.1 配置MySQL官方YUM仓库首先我们需要下载并安装MySQL官方的YUM仓库配置文件。这个配置文件会告诉系统去哪里下载MySQL的软件包。# 切换到临时目录 cd /tmp # 使用wget下载MySQL 5.7的YUM仓库包。这里以Red Hat Enterprise Linux 7为例对应CentOS 7。 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm # 安装这个仓库包 sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm安装成功后你会在/etc/yum.repos.d/目录下看到新增的mysql-community.repo和mysql-community-source.repo文件。你可以用cat命令查看一下里面定义了软件包的下载地址。实操心得默认的仓库地址指向Oracle官网国内下载可能很慢。一个非常实用的技巧是将其替换为国内镜像源例如阿里云镜像。编辑/etc/yum.repos.d/mysql-community.repo文件找到[mysql57-community]段落将其中的baseurl行注释掉并添加阿里云的镜像地址。但请注意镜像的版本可能略有滞后。对于MySQL 5.7这种老版本通常很稳定。sudo vim /etc/yum.repos.d/mysql-community.repo找到[mysql57-community]部分修改如下[mysql57-community] nameMySQL 5.7 Community Server #baseurlhttps://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ baseurlhttp://mirrors.aliyun.com/mysql/MySQL-5.7/community/el/7/$basearch/ enabled1 gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql保存退出后运行sudo yum makecache更新元数据缓存。3.2 执行安装与初始配置配置好仓库后安装过程就非常简单了。# 安装MySQL服务器、客户端和一些常用工具 sudo yum install mysql-community-server mysql-community-client -y安装完成后MySQL的服务文件mysqld已经注册到systemd。我们首先启动服务sudo systemctl start mysqld # 设置开机自启 sudo systemctl enable mysqld # 查看服务状态确认是否运行正常 sudo systemctl status mysqldMySQL 5.7在首次启动时会自动为root用户生成一个随机密码并记录在日志文件中。这是重要的安全改进。我们需要找到这个密码sudo grep temporary password /var/log/mysqld.log输出类似A temporary password is generated for rootlocalhost: JqkfT3aQ1;e。请务必记下这个复杂密码。3.3 安全初始化与远程访问配置使用得到的临时密码登录MySQL并立即修改它。MySQL有一个密码强度校验插件要求密码包含大小写字母、数字和特殊字符且长度至少8位。mysql -uroot -p # 输入刚才查到的临时密码登录成功后必须修改密码才能执行其他操作ALTER USER rootlocalhost IDENTIFIED BY YourNewStrongPassword123!;请将YourNewStrongPassword123!替换为你自己的强密码。接下来运行MySQL自带的安全安装脚本它会引导你进行一系列安全设置如移除匿名用户、禁止root远程登录、移除测试数据库等。虽然我们可以手动操作但用脚本更省心。# 退出MySQL命令行 exit # 运行安全配置脚本 sudo mysql_secure_installation脚本会提示你输入当前root密码然后依次询问一系列问题。根据你的安全要求回答即可。通常建议设置root密码已设置输入当前密码后跳过移除匿名用户Y禁止root远程登录Y生产环境强烈建议远程管理请创建专用账户移除test数据库Y立即重新加载权限表Y配置远程访问如果需要默认情况下MySQL只允许本地连接。如果需要从其他服务器访问需要创建一个有远程连接权限的用户并授权。-- 首先登录MySQL mysql -uroot -p -- 创建一个新用户并允许从任何主机连接生产环境建议指定特定IP CREATE USER myuser% IDENTIFIED BY UserStrongPassword456!; -- 授予该用户对所有数据库的所有权限根据实际情况缩小权限范围 GRANT ALL PRIVILEGES ON *.* TO myuser% WITH GRANT OPTION; -- 刷新权限使更改生效 FLUSH PRIVILEGES;重要安全提示myuser%表示允许从任何IP连接这在公网环境中非常危险。生产环境中务必使用myuser192.168.1.%或具体IP来限制访问来源。4. 方案二使用本地TAR包安装MySQL 5.7TAR安装方式给了我们最大的自由度但相应的我们需要手动处理更多细节。整个过程可以概括为下载 - 解压 - 创建用户和目录 - 初始化 - 配置 - 启动。4.1 下载与准备安装包及依赖首先前往MySQL官方社区版下载页面或国内镜像站找到适用于Linux - Generic的MySQL 5.7压缩包。通常选择mysql-5.7.xx-linux-glibc2.12-x86_64.tar.gz这样的版本。我们将其下载到服务器上例如/opt目录。cd /opt # 使用wget下载请将链接替换为实际的镜像地址 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz # 解压 sudo tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz # 为了便于管理可以创建一个软链接或直接重命名目录 sudo mv mysql-5.7.44-linux-glibc2.12-x86_64 mysql-5.7接下来创建运行MySQL所需的系统用户和用户组并安装必要的系统库依赖。# 创建mysql用户组和用户并禁止其登录shell sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql # 安装依赖库 sudo yum install libaio numactl -y4.2 规划与创建目录结构这是TAR安装的核心步骤之一。我们需要规划好MySQL的安装目录、数据目录、日志目录等。这里我采用一个常见的生产环境规划安装目录/opt/mysql-5.7即我们解压的目录数据目录/data/mysql假设/data是一个独立的大容量分区日志目录/data/mysql/logs错误日志、慢查询日志等放这里临时文件目录/data/mysql/tmpSocket文件/data/mysql/mysql.sock创建这些目录并设置正确的所有权sudo mkdir -p /data/mysql/{data,logs,tmp} # 将安装目录的所有权赋予mysql用户 sudo chown -R mysql:mysql /opt/mysql-5.7 # 将数据目录及其父目录的所有权赋予mysql用户 sudo chown -R mysql:mysql /data/mysql # 设置目录权限 sudo chmod 750 /data/mysql/data4.3 初始化数据库实例MySQL 5.7使用mysqld --initialize或mysqld --initialize-insecure来初始化数据目录。前者会为root生成随机密码同YUM安装后者则设置空密码。生产环境建议使用前者。首先需要准备一个基础的配置文件my.cnf。我们可以基于安装目录内的样例配置文件修改。cd /opt/mysql-5.7 sudo cp support-files/my-default.cnf /etc/my.cnf然后编辑/etc/my.cnf在最简单的配置下我们至少需要指定数据目录、socket文件和端口。[mysqld] basedir/opt/mysql-5.7 datadir/data/mysql/data socket/data/mysql/mysql.sock port3306 log-error/data/mysql/logs/mysqld.log pid-file/data/mysql/mysqld.pid tmpdir/data/mysql/tmp [client] socket/data/mysql/mysql.sock现在使用mysql用户身份来初始化数据库cd /opt/mysql-5.7 sudo bin/mysqld --defaults-file/etc/my.cnf --initialize --usermysql初始化成功后务必在错误日志中查看root的临时密码sudo grep temporary password /data/mysql/logs/mysqld.log4.4 配置系统服务与启动TAR安装不会自动创建systemd服务。我们需要手动创建服务文件这是让MySQL像系统服务一样管理的关键。 创建文件/etc/systemd/system/mysqld.service内容如下[Unit] DescriptionMySQL Server 5.7 Afternetwork.target [Service] Typeforking Usermysql Groupmysql # 指定配置文件路径 ExecStart/opt/mysql-5.7/bin/mysqld --defaults-file/etc/my.cnf ExecStop/opt/mysql-5.7/bin/mysqladmin -u root -p shutdown Restarton-failure RestartSec5s PrivateTmptrue [Install] WantedBymulti-user.target注意事项上面的ExecStop使用了mysqladmin并需要密码。在第一次启动且未修改密码前这个停止命令会失败。你可以先将其注释掉使用sudo kill或sudo systemctl kill来停止服务待修改root密码后再启用。或者更安全的方法是创建一个只包含停止命令的脚本并在脚本中处理密码注意脚本文件权限。加载新的systemd配置并启动服务sudo systemctl daemon-reload sudo systemctl start mysqld sudo systemctl enable mysqld sudo systemctl status mysqld4.5 初始登录与环境变量配置使用初始化日志中的临时密码登录。由于我们自定义了socket路径登录时需要指定。/opt/mysql-5.7/bin/mysql -uroot -p --socket/data/mysql/mysql.sock登录后同样需要立即修改root密码ALTER USER rootlocalhost IDENTIFIED BY YourNewStrongPassword123!; FLUSH PRIVILEGES;为了方便日常使用可以将MySQL的二进制文件路径添加到系统的PATH环境变量中。编辑~/.bashrc或/etc/profileecho export PATH/opt/mysql-5.7/bin:$PATH ~/.bashrc source ~/.bashrc现在你就可以直接使用mysql -uroot -p命令了因为我们在my.cnf的[client]段配置了socket路径。5. 安装后的通用配置与优化无论通过哪种方式安装一些基础的配置和优化是共通的。这能提升数据库的安全性和性能。5.1 基础性能参数调优编辑MySQL配置文件/etc/my.cnf(YUM安装) 或你自定义的路径在[mysqld]段添加或修改以下参数。这些参数需要根据服务器内存大小进行调整以下配置假设服务器内存为4GB。[mysqld] # 基础设置 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-storage-engineINNODB # 连接设置 max_connections500 connect_timeout10 wait_timeout600 interactive_timeout600 # InnoDB缓冲池通常是系统内存的50%-70%这里设为2G innodb_buffer_pool_size2G # InnoDB日志文件大小通常设为缓冲池的25%这里设为512M innodb_log_file_size512M # InnoDB刷新日志到磁盘的策略1为最安全但最慢2为折中0为最快但可能丢数据不推荐 innodb_flush_log_at_trx_commit1 # 查询缓存MySQL 5.7中已弃用8.0已移除通常建议关闭 query_cache_type0 query_cache_size0 # 二进制日志用于主从复制或时间点恢复建议开启但定期清理 server-id1 log-binmysql-bin expire_logs_days7 max_binlog_size100M # 慢查询日志用于性能分析 slow_query_log1 slow_query_log_file/var/log/mysql/slow.log long_query_time2修改配置后需要重启MySQL服务使配置生效sudo systemctl restart mysqld。5.2 日常维护与监控命令安装配置完成后掌握一些基本的维护命令至关重要。查看运行状态sudo systemctl status mysqld查看进程ps -ef | grep mysqld查看端口监听netstat -tlnp | grep 3306查看MySQL错误日志sudo tail -f /var/log/mysqld.log(YUM) 或sudo tail -f /data/mysql/logs/mysqld.log(TAR)登录MySQLmysql -u root -p查看数据库SHOW DATABASES;查看用户SELECT User, Host FROM mysql.user;查看运行中的线程SHOW PROCESSLIST;查看系统变量SHOW VARIABLES LIKE %buffer_pool%;查看状态SHOW STATUS LIKE Innodb_buffer_pool%;6. 常见问题排查与解决实录在实际操作中你几乎一定会遇到一些问题。这里我记录了几个最典型的问题和我的排查思路。6.1 启动失败权限问题 (Permission Denied)这是TAR安装方式下最常见的问题尤其是数据目录、日志目录的所有权和权限设置不正确或者SELinux没有正确配置。症状systemctl status mysqld显示失败查看错误日志 (/data/mysql/logs/mysqld.log) 会发现大量的Permission denied。排查ls -ld /data/mysql /data/mysql/data确认所有者和组是否为mysql:mysql。检查目录权限数据目录通常需要750或770。如果SELinux是Enforcing模式尝试临时关闭 (setenforce 0) 看是否能启动。如果能则需要为相关目录添加正确的SELinux上下文sudo chcon -R -t mysqld_db_t /data/mysql/data。解决确保chown -R mysql:mysql命令覆盖了所有相关目录并根据SELinux策略进行调整。6.2 启动失败端口被占用 (Address already in use)症状MySQL无法启动日志提示3306端口已被占用。排查netstat -tlnp | grep 3306或ss -tlnp | grep 3306查看是哪个进程占用了端口。解决如果是旧的MySQL或MariaDB进程使用systemctl stop停止它或kill掉对应进程。如果确定不需要其他服务使用3306可以强制终止占用进程。也可以修改MySQL配置文件中的port参数换一个端口如3307但需要同步调整所有连接此数据库的客户端配置。6.3 无法远程连接症状本地mysql -h 127.0.0.1 -u root -p可以连接但远程机器无法连接。排查防火墙确认服务器防火墙已开放3306端口 (firewall-cmd --list-ports)。用户权限登录MySQL执行SELECT User, Host FROM mysql.user;。root用户的Host字段如果是localhost则只能本地连接。你需要创建一个允许远程Host如%或特定IP的用户并授权。MySQL绑定地址检查my.cnf中是否有bind-address 127.0.0.1这一行。这行配置会限制MySQL只监听本地回环地址。如果需要监听所有网卡可以将其注释掉或改为bind-address 0.0.0.0。解决根据排查结果依次解决防火墙、用户授权和绑定地址的问题。6.4 忘记root密码这是一个令人头疼但必须掌握的问题。停止MySQL服务sudo systemctl stop mysqld。以安全模式跳过权限检查启动MySQLsudo mysqld_safe --skip-grant-tables --skip-networking 对于TAR安装需要指定--defaults-file和--user无需密码登录MySQLmysql -u root在MySQL命令行中更新root密码注意MySQL 5.7的密码字段在mysql.user表的authentication_stringFLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY MyNewPass; FLUSH PRIVILEGES; exit;关闭安全模式下的MySQL进程然后正常启动服务sudo systemctl start mysqld。6.5 数据目录迁移针对TAR安装随着业务增长你可能需要将数据目录迁移到更大的磁盘。假设新目录是/newdisk/mysql_data。停止MySQL服务sudo systemctl stop mysqld。复制原数据目录sudo cp -rp /data/mysql/data/* /newdisk/mysql_data/。修改数据目录所有权sudo chown -R mysql:mysql /newdisk/mysql_data。修改my.cnf中的datadir为/newdisk/mysql_data。如果启用了SELinux更新上下文sudo chcon -R -t mysqld_db_t /newdisk/mysql_data。启动MySQL服务sudo systemctl start mysqld。整个过程的核心是保证数据文件的完整性和权限的正确性。务必在操作前进行完整的备份。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进