1. 项目概述与核心价值
在服务器运维和开发环境搭建的日常工作中,数据库的部署几乎是绕不开的一环。MySQL 5.7作为一款经典、稳定且功能强大的关系型数据库版本,至今仍在大量生产环境中服役。而CentOS,尤其是CentOS 7系列,以其稳定性和企业级支持,是许多开发者和运维人员首选的服务器操作系统。将这两者结合起来,在CentOS上手动安装并配置好MySQL 5.7,是一项非常基础但又至关重要的技能。这个教程的目的,就是为你提供一个清晰、完整、可复现的安装路径,让你不仅能成功装上MySQL,更能理解每一步操作背后的逻辑,从而在遇到问题时能够自行排查,而不是简单地复制粘贴命令。
很多人可能会问,现在Docker这么方便,或者直接用yum安装更新的版本不行吗?当然可以,但手动安装能给你带来更深层次的控制和理解。通过源码包或官方仓库的RPM包进行安装,你可以精确控制安装路径、配置文件位置、服务管理方式,这对于后续的性能调优、安全加固和故障排查都至关重要。尤其是在一些对版本有严格要求的遗留系统迁移,或者需要定制化编译选项的场景下,掌握手动安装的方法是不可或缺的。本教程将基于CentOS 7.9环境,使用MySQL官方提供的Yum仓库进行安装,这种方法兼顾了便捷性和可控性,是目前最推荐的生产环境标准做法之一。
2. 环境准备与系统检查
在开始安装之前,充分的准备工作能避免后续很多不必要的麻烦。这一步的核心是确保你的系统环境干净、网络通畅,并且没有潜在的软件冲突。
2.1 系统环境确认
首先,我们需要确认操作系统的具体版本。打开终端,执行以下命令:
cat /etc/redhat-release对于CentOS 7.9,你会看到类似CentOS Linux release 7.9.2009 (Core)的输出。确保你的系统是CentOS 7.x版本,因为本教程的步骤和软件源都是针对此版本验证的。虽然CentOS 8已经停止维护,但仍有部分用户在使用,其步骤略有不同,主要在于默认的软件包管理器从yum换成了dnf。
接下来,检查系统中是否已经存在旧版本的MySQL或MariaDB。MariaDB是MySQL的一个流行分支,如果系统中预装了它,可能会与我们要安装的MySQL 5.7产生端口、服务名或文件冲突。
rpm -qa | grep -E ‘mysql|mariadb’如果这条命令返回了任何包含mysql或mariadb的包名(例如mariadb-libs-5.5.68-1.el7.x86_64),那么你需要决定是否移除它们。请注意:如果这台服务器上已经运行着其他依赖旧版本数据库的服务,盲目卸载可能会导致服务不可用。在测试或新环境中,我们可以安全地移除它们:
sudo yum remove mariadb-libs -y这个操作会移除CentOS 7默认自带的MariaDB兼容库,为安装官方MySQL扫清障碍。
2.2 依赖包安装与SELinux/防火墙考量
MySQL的正常运行需要一些系统库的支持。虽然通过官方Yum仓库安装时会自动解决大部分依赖,但提前安装一些基础编译工具和库总是一个好习惯。
sudo yum install -y wget curl vim net-toolsnet-tools包含了netstat等网络工具,方便我们后续查看MySQL的端口监听情况。
接下来,我们需要考虑两个重要的系统级安全组件:SELinux和Firewalld(防火墙)。对于学习或测试环境,为了简化问题,我们通常会暂时将它们设置为宽松模式。但在生产环境中,更推荐的是配置精确的规则,而不是直接关闭。
SELinux: 它可以防止MySQL进程访问非授权的文件路径。如果安装后MySQL无法启动或无法写入数据,SELinux很可能是元凶。查看当前状态:
getenforce如果返回
Enforcing,你可以临时将其设置为宽容模式Permissive(重启后失效):sudo setenforce 0若要永久关闭(不推荐用于生产环境),需编辑
/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled,然后重启系统。Firewalld: MySQL默认使用3306端口。我们需要放行这个端口,以便远程客户端能够连接(如果不需要远程访问,可跳过)。
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent sudo firewall-cmd --reload--permanent参数使规则永久生效,--reload重载防火墙配置使其立即生效。
注意:在生产环境中,请务必结合你的安全策略来处理SELinux和防火墙。一个更安全的做法是为MySQL创建自定义的SELinux策略模块,并配置防火墙仅允许特定IP段访问3306端口。
3. 官方Yum仓库配置与MySQL安装
这是整个流程的核心步骤。我们将从MySQL官方网站获取并安装其提供的Yum仓库,然后通过yum命令来安装MySQL服务器和客户端。这种方法能确保我们获取到的是经过Oracle官方测试和签名的软件包,并且能方便地接收安全更新。
3.1 添加MySQL官方Yum仓库
MySQL为不同的Linux发行版提供了专门的Yum仓库配置包(.rpm)。我们需要下载并安装这个包,它会在/etc/yum.repos.d/目录下创建mysql-community.repo等文件。
首先,切换到临时目录并下载仓库安装包。你可以访问 MySQL Yum仓库页面 查看最新版本,但通常以下命令可以获取到适用于CentOS 7的最新仓库包。
cd /tmp sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm这里有一个关键点:上面下载的mysql80-community-release-el7-11.noarch.rpm这个包,其默认启用的(enabled)是MySQL 8.0的仓库。我们的目标是安装5.7,所以需要手动调整,禁用8.0的仓库,启用5.7的仓库。
安装这个仓库包:
sudo rpm -ivh mysql80-community-release-el7-11.noarch.rpm安装完成后,检查/etc/yum.repos.d/mysql-community.repo文件。你会看到类似下面的内容节选:
[mysql80-community] name=MySQL 8.0 Community Server baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/ enabled=1 # 默认是1,即启用 gpgcheck=1 ... [mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=0 # 默认是0,即禁用 gpgcheck=1 ...我们需要将mysql80-community部分的enabled改为0,将mysql57-community部分的enabled改为1。使用vim或sed命令进行修改:
sudo sed -i ‘s/enabled=1/enabled=0/g’ /etc/yum.repos.d/mysql-community.repo sudo sed -i ‘/\[mysql57-community\]/,/^\[/ s/enabled=0/enabled=1/’ /etc/yum.repos.d/mysql-community.repo第一条命令将所有enabled=1改为enabled=0(这是一种快速禁用所有仓库的方法)。第二条命令则精准地在[mysql57-community]章节内,将enabled=0改为enabled=1。
3.2 执行安装与验证
仓库配置好后,先更新yum的本地缓存,然后安装MySQL服务器社区版。
sudo yum makecache sudo yum install -y mysql-community-server这个命令会安装mysql-community-server包及其所有依赖,包括客户端mysql-community-client、公共库mysql-community-common和共享库mysql-community-libs。
安装完成后,验证MySQL是否安装成功:
mysql --version如果安装成功,你会看到类似mysql Ver 14.14 Distrib 5.7.44, for Linux (x86_64) using EditLine wrapper的输出,其中5.7.44就是具体的版本号。
此时,MySQL的程序文件通常安装在/usr/bin/(如mysql, mysqldump等命令),配置文件模板在/usr/share/mysql,而最重要的数据目录和配置文件的默认位置是:
- 数据目录 (datadir):
/var/lib/mysql。这是数据库文件(表数据、日志等)存放的地方。 - 配置文件 (my.cnf):
/etc/my.cnf。这是MySQL服务的主要配置文件。 - 错误日志文件: 默认在
/var/log/mysqld.log。这个文件是排查启动失败等问题时第一个要查看的地方。
了解这些关键路径,对于后续的运维和故障排查至关重要。
4. 数据库初始化与安全配置
安装完软件包后,MySQL服务还处于“未初始化”状态。我们需要启动服务,并运行一个安全脚本来设置root密码、移除匿名用户、禁止root远程登录等,这是一个至关重要的安全加固步骤。
4.1 启动服务与获取临时密码
首先,启动MySQL服务并设置开机自启:
sudo systemctl start mysqld sudo systemctl enable mysqld使用systemctl status mysqld检查服务状态,确认其处于active (running)。
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 root@localhost: JqweKsl_8fha。冒号后面的JqweKsl_8fha就是你的临时密码,请务必记下。
4.2 运行安全配置向导
使用临时密码登录MySQL,注意-p后面不直接跟密码,回车后会提示输入。
mysql -uroot -p输入刚才找到的临时密码。成功登录后,你会发现命令行提示符变成了mysql>,但此时几乎不能执行任何操作,系统会强制要求你立即修改密码。
我们退出MySQL,然后使用MySQL自带的安全安装脚本mysql_secure_installation来完成一系列安全设置,这比手动执行SQL命令更便捷、更不易出错。
mysql_secure_installation运行这个脚本后,它会交互式地引导你完成以下配置:
- 为root用户设置新密码: 输入刚才的临时密码,然后设置一个强健的新密码。MySQL 5.7默认启用了密码强度验证插件,密码需要包含大小写字母、数字和特殊字符,且长度通常不少于8位。
- 移除匿名用户: 输入
Y。匿名用户允许任何人无需密码登录MySQL,这在生产环境中是极大的安全隐患。 - 禁止root账户远程登录: 输入
Y。root账户权限过大,只允许从本地服务器(localhost)登录,可以防止来自网络的暴力破解。远程管理建议创建具有所需权限的专用账户。 - 移除测试数据库: 输入
Y。默认存在的test数据库可以被任何用户访问,移除它以减少攻击面。 - 立即重新加载权限表: 输入
Y。使上述所有安全更改立即生效。
完成这些步骤后,你的MySQL 5.7实例就已经有了一个基础的安全配置。现在,你可以使用新设置的root密码再次登录,并开始创建你的业务数据库和用户了。
5. 基础配置与性能调优入门
安装并完成安全初始化后,一个默认配置的MySQL实例可能并不完全适合你的服务器硬件和业务需求。调整核心配置参数是提升性能和安全性的关键一步。配置文件/etc/my.cnf是进行调整的主战场。
5.1 核心配置文件解析
MySQL的配置文件采用“节”的结构。在[mysqld]这个节下的配置,才是作用于MySQL服务进程的。让我们打开并编辑这个文件:
sudo vim /etc/my.cnf一个典型的、针对拥有2GB内存的服务器的基础优化配置示例如下,你可以将其添加到[mysqld]节中:
[mysqld] # 基础设置 character-set-server=utf8mb4 # 设置默认字符集为utf8mb4,支持完整的UTF-8(如emoji) collation-server=utf8mb4_unicode_ci # 设置默认的排序规则 skip-name-resolve # 禁用DNS反向解析,加快连接速度,但授权时需用IP而非主机名 # 连接与线程 max_connections=500 # 最大连接数,根据应用并发量调整 thread_cache_size=64 # 线程缓存大小,减少频繁创建销毁线程的开销 wait_timeout=300 # 非交互式连接超时时间(秒) interactive_timeout=300 # 交互式连接超时时间(秒) # InnoDB存储引擎优化(默认且最常用的引擎) innodb_buffer_pool_size=1G # **最关键参数**:InnoDB缓冲池大小,建议设置为物理内存的50%-70% innodb_log_file_size=256M # InnoDB重做日志文件大小,影响崩溃恢复速度 innodb_flush_log_at_trx_commit=1 # 事务提交时日志刷新到磁盘,1为最安全(性能较差),2或0可提升性能但风险增加 innodb_file_per_table=ON # 每个表使用独立的表空间文件,便于管理和维护 # 日志 slow_query_log=ON # 开启慢查询日志 slow_query_log_file=/var/log/mysql-slow.log # 慢查询日志路径 long_query_time=2 # 定义慢查询的阈值(秒),超过此时间的SQL会被记录 log-error=/var/log/mysqld.log # 错误日志路径(通常已默认设置)参数详解与选择逻辑:
innodb_buffer_pool_size: 这是MySQL中最重要的性能调优参数,没有之一。它相当于InnoDB存储引擎的“内存缓存区”,用来缓存表数据和索引。设置得太小,会导致大量磁盘I/O,性能急剧下降;设置得太大,可能挤占操作系统和其他进程的内存。对于一台2GB内存的专用数据库服务器,设置为1G是一个合理的起点。skip-name-resolve: 强烈建议开启。当客户端连接时,MySQL会尝试将IP地址解析成主机名。如果DNS服务器响应慢或不可用,会导致连接建立缓慢。开启后,授权表中的host列必须使用IP地址,而不能使用主机名。max_connections: 需要根据你的应用程序的并发连接数来设定。设置过高会浪费内存,过低则会导致应用无法连接。可以通过监控Threads_connected状态变量来观察实际峰值。innodb_flush_log_at_trx_commit: 这是一个在“性能”和“数据安全”之间权衡的参数。=1表示每次事务提交都写入磁盘,最安全,但性能最低。=2表示每秒刷盘,性能好,但服务器崩溃可能丢失1秒数据。=0性能最好,但风险最高。对于数据一致性要求极高的金融业务,用1;对于可容忍少量数据丢失的日志、缓存类业务,可以考虑2。
修改完配置文件后,必须重启MySQL服务才能使更改生效:
sudo systemctl restart mysqld重启后,登录MySQL,可以查看一些关键参数是否生效:
SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’; SHOW VARIABLES LIKE ‘character_set_server’;5.2 创建应用数据库与用户
在生产环境中,直接使用root用户进行日常操作是极不安全的。最佳实践是为每个应用创建独立的数据库和专属用户,并授予最小必要权限。
假设我们要为一个名为“myapp”的博客系统创建数据库和用户。
登录MySQL:
mysql -uroot -p创建数据库并指定字符集:
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;创建专属用户并设置密码:
CREATE USER ‘myapp_user’@‘localhost’ IDENTIFIED BY ‘YourStrongPassword123!’;这里
@‘localhost’表示该用户只能从本机连接。如果应用部署在同一台服务器上,这就够了。如果应用在另一台服务器,需要将‘localhost’改为具体的IP地址,如‘192.168.1.100’,或者使用‘%’允许从任何主机连接(极度不推荐用于生产环境)。授予权限:
GRANT ALL PRIVILEGES ON myapp_db.* TO ‘myapp_user’@‘localhost’;这条命令将
myapp_db数据库下的所有表(*)的所有权限授予myapp_user用户。你也可以授予更细粒度的权限,如SELECT, INSERT, UPDATE, DELETE。刷新权限:
FLUSH PRIVILEGES;退出MySQL:
EXIT;
现在,你的应用程序就可以使用myapp_user这个账户和对应的密码,连接到myapp_db数据库进行操作了。这种方式将不同应用的数据和权限隔离,极大地提升了系统的安全性。
6. 日常运维、监控与故障排查
MySQL安装配置好后,日常的运维和监控是保证其稳定运行的关键。这里介绍几个最常用、最有效的命令和排查思路。
6.1 服务管理与状态监控
服务启停与状态查看:
sudo systemctl status mysqld # 查看运行状态 sudo systemctl start mysqld # 启动 sudo systemctl stop mysqld # 停止 sudo systemctl restart mysqld # 重启(配置修改后常用) sudo systemctl enable mysqld # 设置开机自启 sudo systemctl disable mysqld # 取消开机自启查看MySQL进程与端口:
ps aux | grep mysqld # 查看MySQL进程 sudo netstat -tlnp | grep 3306 # 查看3306端口监听状态如果
netstat显示0.0.0.0:3306或:::3306,说明MySQL正在监听所有网络接口,允许远程连接(前提是防火墙已放行且用户有远程权限)。如果只显示127.0.0.1:3306,则仅允许本地连接。进入MySQL命令行查看关键状态:
mysql -uroot -p登录后,可以运行以下有用的命令:
SHOW PROCESSLIST; -- 查看当前所有连接和正在执行的SQL SHOW STATUS LIKE ‘Threads_connected’; -- 查看当前连接数 SHOW STATUS LIKE ‘Max_used_connections’; -- 查看历史最大连接数 SHOW VARIABLES LIKE ‘max_connections’; -- 查看最大连接数设置 SHOW ENGINE INNODB STATUS\G -- 查看详细的InnoDB引擎状态(信息很多)
6.2 常见问题与排查技巧实录
即使按照教程操作,你也可能会遇到一些问题。下面是一些典型问题的排查思路。
问题1:MySQL服务启动失败 (systemctl status mysqld显示failed)。
- 首要检查点:错误日志。执行
sudo tail -50 /var/log/mysqld.log。日志末尾通常会明确告诉你失败原因。 - 常见原因1:权限问题。数据目录
/var/lib/mysql的属主必须是mysql:mysql。检查并修复:sudo chown -R mysql:mysql /var/lib/mysql - 常见原因2:端口被占用。3306端口可能被其他程序(如旧的MariaDB或另一个MySQL实例)占用。使用
sudo netstat -tlnp | grep 3306查看。 - 常见原因3:配置文件语法错误。如果你修改了
/etc/my.cnf,一个拼写错误或错误的参数值都可能导致启动失败。可以尝试注释掉最近的修改,或者用mysqld --verbose --help检查参数名是否正确。
问题2:使用root密码无法登录 (Access denied for user ‘root’@‘localhost’)。
- 可能1:密码错误。确认密码大小写,或是否在安全脚本中成功修改。
- 可能2:MySQL的授权表未加载或损坏。可以尝试在启动时跳过授权表来重置密码(此操作有安全风险,仅用于紧急恢复):
- 停止MySQL服务:
sudo systemctl stop mysqld。 - 以安全模式启动,跳过权限验证:
sudo mysqld_safe --skip-grant-tables &。 - 无密码登录:
mysql -uroot。 - 执行SQL更新密码(MySQL 5.7):
USE mysql; UPDATE user SET authentication_string=PASSWORD(‘YourNewPassword’) WHERE User=‘root’; FLUSH PRIVILEGES; EXIT; - 关闭安全模式进程,正常启动服务。
- 停止MySQL服务:
问题3:应用程序无法远程连接数据库。 这是一个“复合型”问题,需要层层排查:
- 防火墙:确认服务器防火墙(如firewalld)已放行3306端口。
- MySQL用户权限:root用户默认禁止远程登录。你需要确认连接使用的用户是否有从远程IP登录的权限。登录MySQL后执行:
查看对应用户的SELECT user, host FROM mysql.user;host列是否是‘%’或具体的远程IP,而不是‘localhost’。 - MySQL绑定地址:检查
/etc/my.cnf中是否有bind-address配置。如果它是127.0.0.1,则MySQL只监听本地回环地址。可以将其改为0.0.0.0(监听所有接口)或服务器的具体IP地址,然后重启服务。 - 网络连通性:从应用服务器使用
telnet <数据库服务器IP> 3306测试端口是否能通。
问题4:数据库磁盘空间占用异常增长。 除了业务数据正常增长,还需要检查:
- 二进制日志 (binlog): 如果开启了二进制日志(用于主从复制或数据恢复),它会持续增长。定期清理过期日志:
或在PURGE BINARY LOGS BEFORE ‘2024-01-01 00:00:00’; -- 清理指定时间前的日志my.cnf中设置expire_logs_days参数自动清理。 - 慢查询日志、错误日志: 检查
/var/log/下的mysql-slow.log和mysqld.log文件大小。 - InnoDB临时表空间: 复杂的查询可能会在磁盘上创建巨大的临时文件。
掌握这些基本的运维命令和排查思路,你就能独立应对MySQL日常运行中的大部分常见问题,从一个“安装者”真正进阶为“管理者”。