CentOS 7下MySQL 5.7安装指南:YUM与TAR两种方式详解与实战
2026/9/8 15:01:55 网站建设 项目流程

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或MariaDB(CentOS 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 -y

2.2 防火墙与SELinux策略调整

CentOS 7默认的防火墙(firewalld)和SELinux可能会阻止MySQL的正常通信和运行。我们需要预先配置好。

防火墙设置:MySQL默认使用3306端口。我们需要永久开放此端口。

sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent sudo firewall-cmd --reload # 验证端口是否开放 sudo firewall-cmd --zone=public --list-ports

SELinux设置:对于学习或测试环境,临时关闭SELinux可以简化问题排查。但生产环境建议保持开启并配置正确的上下文。

# 查看当前SELinux状态 getenforce # 临时设置为宽松模式(重启后失效) sudo setenforce 0 # 永久禁用(需重启生效),编辑 /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabled

如果选择保持SELinux开启,在tar安装方式中,你可能需要为MySQL的数据目录和日志文件设置正确的安全上下文,否则会遇到“权限拒绝”的错误。这通常是tar安装方式的一个小坑。

2.3 两种安装方式的深度对比与选型

为什么要有两种方式?这绝不是冗余。理解它们的核心差异,你才能做出正确选择。

YUM安装的核心优势与场景:

  • 自动化管理:自动解决依赖关系,无需手动寻找libaionumactl等库。
  • 集成度高:安装的服务会自动集成到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.7

YUM安装的核心在于配置正确的仓库。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.repomysql-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] name=MySQL 5.7 Community Server #baseurl=https://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ baseurl=http://mirrors.aliyun.com/mysql/MySQL-5.7/community/el/7/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///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 mysqld

MySQL 5.7在首次启动时,会自动为root用户生成一个随机密码,并记录在日志文件中。这是重要的安全改进。我们需要找到这个密码:

sudo grep 'temporary password' /var/log/mysqld.log

输出类似:A temporary password is generated for root@localhost: JqkfT3&aQ1;e。请务必记下这个复杂密码。

3.3 安全初始化与远程访问配置

使用得到的临时密码登录MySQL,并立即修改它。MySQL有一个密码强度校验插件,要求密码包含大小写字母、数字和特殊字符,且长度至少8位。

mysql -uroot -p # 输入刚才查到的临时密码

登录成功后,必须修改密码才能执行其他操作:

ALTER USER 'root'@'localhost' 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连接,这在公网环境中非常危险。生产环境中,务必使用'myuser'@'192.168.1.%'或具体IP来限制访问来源。

4. 方案二:使用本地TAR包安装MySQL 5.7

TAR安装方式给了我们最大的自由度,但相应的,我们需要手动处理更多细节。整个过程可以概括为:下载 -> 解压 -> 创建用户和目录 -> 初始化 -> 配置 -> 启动。

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 -y

4.2 规划与创建目录结构

这是TAR安装的核心步骤之一。我们需要规划好MySQL的安装目录、数据目录、日志目录等。这里我采用一个常见的生产环境规划:

  • 安装目录/opt/mysql-5.7(即我们解压的目录)
  • 数据目录/data/mysql(假设/data是一个独立的大容量分区)
  • 日志目录/data/mysql/logs(错误日志、慢查询日志等放这里)
  • 临时文件目录/data/mysql/tmp
  • Socket文件/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/data

4.3 初始化数据库实例

MySQL 5.7使用mysqld --initializemysqld --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 port=3306 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 --user=mysql

初始化成功后,务必在错误日志中查看root的临时密码

sudo grep 'temporary password' /data/mysql/logs/mysqld.log

4.4 配置系统服务与启动

TAR安装不会自动创建systemd服务。我们需要手动创建服务文件,这是让MySQL像系统服务一样管理的关键。 创建文件/etc/systemd/system/mysqld.service,内容如下:

[Unit] Description=MySQL Server 5.7 After=network.target [Service] Type=forking User=mysql Group=mysql # 指定配置文件路径 ExecStart=/opt/mysql-5.7/bin/mysqld --defaults-file=/etc/my.cnf ExecStop=/opt/mysql-5.7/bin/mysqladmin -u root -p shutdown Restart=on-failure RestartSec=5s PrivateTmp=true [Install] WantedBy=multi-user.target

注意事项:上面的ExecStop使用了mysqladmin并需要密码。在第一次启动且未修改密码前,这个停止命令会失败。你可以先将其注释掉,使用sudo killsudo systemctl kill来停止服务,待修改root密码后再启用。或者,更安全的方法是创建一个只包含停止命令的脚本,并在脚本中处理密码(注意脚本文件权限!)。

加载新的systemd配置并启动服务:

sudo systemctl daemon-reload sudo systemctl start mysqld sudo systemctl enable mysqld sudo systemctl status mysqld

4.5 初始登录与环境变量配置

使用初始化日志中的临时密码登录。由于我们自定义了socket路径,登录时需要指定。

/opt/mysql-5.7/bin/mysql -uroot -p --socket=/data/mysql/mysql.sock

登录后,同样需要立即修改root密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword123!'; FLUSH PRIVILEGES;

为了方便日常使用,可以将MySQL的二进制文件路径添加到系统的PATH环境变量中。编辑~/.bashrc/etc/profile

echo '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-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-storage-engine=INNODB # 连接设置 max_connections=500 connect_timeout=10 wait_timeout=600 interactive_timeout=600 # InnoDB缓冲池,通常是系统内存的50%-70%,这里设为2G innodb_buffer_pool_size=2G # InnoDB日志文件大小,通常设为缓冲池的25%,这里设为512M innodb_log_file_size=512M # InnoDB刷新日志到磁盘的策略,1为最安全但最慢,2为折中,0为最快但可能丢数据(不推荐) innodb_flush_log_at_trx_commit=1 # 查询缓存(MySQL 5.7中已弃用,8.0已移除,通常建议关闭) query_cache_type=0 query_cache_size=0 # 二进制日志(用于主从复制或时间点恢复),建议开启但定期清理 server-id=1 log-bin=mysql-bin expire_logs_days=7 max_binlog_size=100M # 慢查询日志,用于性能分析 slow_query_log=1 slow_query_log_file=/var/log/mysql/slow.log long_query_time=2

修改配置后,需要重启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
  • 排查
    1. ls -ld /data/mysql /data/mysql/data确认所有者和组是否为mysql:mysql
    2. 检查目录权限,数据目录通常需要750770
    3. 如果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 3306ss -tlnp | grep 3306查看是哪个进程占用了端口。
  • 解决
    • 如果是旧的MySQL或MariaDB进程,使用systemctl stop停止它,或kill掉对应进程。
    • 如果确定不需要其他服务使用3306,可以强制终止占用进程。
    • 也可以修改MySQL配置文件中的port参数,换一个端口(如3307),但需要同步调整所有连接此数据库的客户端配置。

6.3 无法远程连接

  • 症状:本地mysql -h 127.0.0.1 -u root -p可以连接,但远程机器无法连接。
  • 排查
    1. 防火墙:确认服务器防火墙已开放3306端口 (firewall-cmd --list-ports)。
    2. 用户权限:登录MySQL,执行SELECT User, Host FROM mysql.user;root用户的Host字段如果是localhost,则只能本地连接。你需要创建一个允许远程Host(如%或特定IP)的用户并授权。
    3. MySQL绑定地址:检查my.cnf中是否有bind-address = 127.0.0.1这一行。这行配置会限制MySQL只监听本地回环地址。如果需要监听所有网卡,可以将其注释掉或改为bind-address = 0.0.0.0
  • 解决:根据排查结果,依次解决防火墙、用户授权和绑定地址的问题。

6.4 忘记root密码

这是一个令人头疼但必须掌握的问题。

  1. 停止MySQL服务:sudo systemctl stop mysqld
  2. 以安全模式(跳过权限检查)启动MySQL:
    sudo mysqld_safe --skip-grant-tables --skip-networking &
    (对于TAR安装,需要指定--defaults-file--user
  3. 无需密码登录MySQL:mysql -u root
  4. 在MySQL命令行中,更新root密码(注意MySQL 5.7的密码字段在mysql.user表的authentication_string):
    FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass'; FLUSH PRIVILEGES; exit;
  5. 关闭安全模式下的MySQL进程,然后正常启动服务:sudo systemctl start mysqld

6.5 数据目录迁移(针对TAR安装)

随着业务增长,你可能需要将数据目录迁移到更大的磁盘。假设新目录是/newdisk/mysql_data

  1. 停止MySQL服务:sudo systemctl stop mysqld
  2. 复制原数据目录:sudo cp -rp /data/mysql/data/* /newdisk/mysql_data/
  3. 修改数据目录所有权:sudo chown -R mysql:mysql /newdisk/mysql_data
  4. 修改my.cnf中的datadir/newdisk/mysql_data
  5. 如果启用了SELinux,更新上下文:sudo chcon -R -t mysqld_db_t /newdisk/mysql_data
  6. 启动MySQL服务:sudo systemctl start mysqld

整个过程的核心是保证数据文件的完整性和权限的正确性。务必在操作前进行完整的备份。

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

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

立即咨询