01 在 CentOS 7 中安装 MySQL

在 CentOS 7.6 上从零安装并配置 MySQL 详细教程

配置之前,请先使用 root 账号登录!后续命令都是基于 root 权限的!

1. 工程实践中的常态

在公司级、工程级的开发环境里,数据库几乎都是部署在 Linux 上。原因很现实:

  • 稳定性:Linux 的内核和生态对长时间运行的服务(数据库、Web 服务器)更稳。
  • 性能:Linux 的 I/O 调度、文件系统、网络栈优化比 Windows 更适合高并发和大数据量场景。
  • 生态一致性:大部分运维工具、监控方案(Prometheus、Ansible、Docker/K8s)都是围绕 Linux 构建的。
  • 服务器环境:绝大多数云服务(阿里云、华为云、AWS、GCP)默认都跑 Linux,不会给你装 Windows Server 再跑 MySQL。

换句话说,“工程实践里数据库跑在 Linux 上” 已经是行业共识

2. 那 Windows 下用 MySQL 就“愚蠢”吗?

也不能这么绝对。Windows 下用 MySQL 有几个合理的场景:

  • 个人开发/学习:很多初学者直接用 Windows 装 MySQL,图形化界面工具丰富,上手快。
  • 小型应用/测试:有些实验性项目或 demo,没必要起一台 Linux 服务器。
  • 企业遗留环境:部分公司内部系统历史包袱大,早期就跑在 Windows + MySQL 上,一时半会没迁移。

所以在 学习/个人项目 阶段,Windows 并不是愚蠢,而是 易用。只是它天然不适合工业级、持续稳定运行的数据库。

3. 为什么大公司更青睐 Linux + MySQL?

因为要考虑的远不止“能不能跑”:

  • 集群部署:Linux 下搭建主从复制、MGR 集群、分布式架构更成熟。
  • 高可用:用 Linux 的 keepalived、pacemaker、systemd 脚本能做自动容灾。
  • 容器化/云原生:MySQL 在 Docker/Kubernetes 中的镜像都是基于 Linux。Windows 几乎没有原生容器支持。

1. 准备工作:卸载旧的、不要的 MySQL/MariaDB 环境

1. 检查正在运行的 mysqld / mysql / mariadb 进程

在安装新版本 MySQL 之前,务必确保系统中没有残留的旧版本数据库,避免冲突。如果有输出,说明有正在运行的 MySQL 或 MariaDB 进程。

1
2
3
4
ps ajx | grep mysql
ps ajx | grep mariadb
# 或者:
ps aux | egrep 'mysqld|mysql|mariadb' # 列出相关进程

注意看最后一列的命令内容。 如果最后一列显示是 grep …,这个其实是刚刚执行的 grep 本身。比如:14375 14838 14837 14375 pts/0 14837 S+ 1000 0:00 grep --color=auto mysql,不要将这个当作 MySQL 的进程!

2. 停止正在运行的服务

如果上面检查出了有 mysqld / mysql / mariadb 进程的存在才需要执行这一步。 执行下面的命令,如果输出中存在 service not loaded. 的字样说明大概率就是 MySQL/MariaDB 服务未安装,我们就可以直接进行下一步了。当然也存在 及其少见 的情况:服务名称不同,非常罕见,不做讨论。

1
2
systemctl stop mysql
systemctl stop mariadb

2. 检查系统安装包

1. 查找已安装的相关 RPM 包

有些人可能会想要备份当前的数据目录和配置,可以执行下方命令,后续可以从 /var/lib/mysql.bak 进行恢复。当然,我们这里是从 0 安装 MySQL,我想要干净、易于管理就不进行备份了,备份是可选项,个人感觉没有太多必要。

1
2
3
4
>sudo systemctl stop mysqld || sudo systemctl stop mariadb || true
>sudo cp -a /var/lib/mysql /var/lib/mysql.bak # 备份数据目录
>sudo cp -a /etc/my.cnf /etc/my.cnf.bak || true # 备份配置文件(如存在)
>sudo tar czvf /root/mysql_backup_$(date +%F).tgz /var/lib/mysql /etc/my.cnf || true
1
2
rpm -qa | grep -i mysql			# -i 选项可忽略(下同)
rpm -qa | grep -i mariadb

2. 删除已安装的 MySQL/MariaDB 包

1
2
3
4
5
6
rpm -qa | grep -i mysql | xargs yum -y remove			# 删除所有 mysql 相关 rpm
rpm -qa | grep -i mariadb | xargs yum -y remove # 删除 mariadb 相关 rpm

# 再次确认
rpm -qa | grep -i mysql || true
rpm -qa | grep -i mariadb || true

使用 xargs 可以将查询结果作为参数传递给 yum remove,实现批量卸载。

3. 处理残留文件

1
2
ls /etc/my.cnf          # 配置文件
ls /var/lib/mysql/ # 数据目录
1
2
3
4
5
6
7
[root@hcss-ecs-be68 ~]# which mysql mysqld mysqld_safe			# 检查二进制文件残留(可选)
/usr/bin/which: no mysql in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
/usr/bin/which: no mysqld in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
/usr/bin/which: no mysqld_safe in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

# mysql(客户端命令),mysqld(服务器主程序),mysqld_safe(服务器安全启动脚本)
# 这些关键二进制文件都不存在于系统的环境变量路径中,进一步证明了 MySQL/MariaDB 相关组件已经被彻底卸载,没有残留的可执行文件。

如有残留,建议删除残留文件,当然这一步是可选的,不清理残留可能会影响后续使用。

1
2
rm -rf /etc/my.cnf
rm -rf /var/lib/mysql/

3. 获取 MySQL 官方 yum 源

CentOS 默认 YUM 源中不包含 MySQL 常用版本,需手动添加官方仓库。

1. 确认系统版本

1
2
cat /etc/redhat-release
# 本机输出示例:CentOS Linux release 7.6.1810 (Core)

我们需要选择 MySQL 5.7 安装包,因为大多数公司使用的版本依旧在 5.7 左右,所以选择这个,另外选择这个版本会方便后续出错问题的排查。但是很可惜,我在安装这个版本时出错了,倒腾了很久,遂放弃。所以我们选用 MySQL 8.0(具体是 8.0.43),但后面的讲解依旧会参杂部分的 MySQL 5.7 的讲解。

MySQL 8.0 和 MySQL 5.7 存在一些差异, 基础学习,有差异的地方查一下就行了,SQL 语句基本上是一样的,问题不大。

2. 下载并安装 MySQL YUM 仓库 RPM 包

在 Windows 中前往 MySQL YUM Repository,选择对应版本进行下载。由于网页不是很好筛选,在浏览器中右键选择 查看网页源代码(ctrl+u 去寻找对应版本的安装包。这里我选择是

1
mysql-community-release-el7.rp

通过 rz 命令将下载好的 RPM 包上传至我们的 Linux。 输入命令 ls /etc/yum.repos.d/ -l 可以查看系统中配置了哪些软件仓库,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@hcss-ecs-be68 ~]# ls /etc/yum.repos.d/ -l
total 48
-rw-r--r-- 1 root root 1732 Jul 7 2024 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 Nov 23 2018 CentOS-CR.repo
-rw-r--r--. 1 root root 649 Nov 23 2018 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 Nov 23 2018 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 Nov 23 2018 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 Nov 23 2018 CentOS-Sources.repo
-rw-r--r--. 1 root root 5701 Nov 23 2018 CentOS-Vault.repo
-rw-r--r-- 1 root root 927 Jul 7 2024 epel.repo
-rw-r--r-- 1 root root 1358 Sep 5 2021 epel.repo.rpmnew
-rw-r--r-- 1 root root 1457 Sep 5 2021 epel-testing.repo
-rw-r--r-- 1 root root 192 Jan 20 2016 wandisco-git.repo

为了方便管理,可以整理一下目录结构,比如:

1
2
3
4
[root@hcss-ecs-be68 ~]# tree
.
└── MySQL
└── mysql-community-release-el7.rpm

3. 安装仓库 RPM

1
2
3
4
5
6
7
8
rpm -ivh mysql-community-release-el7.rpm	# 注意这里是自己实际的 rpm 包名

# 示例:
[root@hcss-ecs-be68 MySQL]# rpm -ivh mysql-community-release-el7.rpm
warning: mysql-community-release-el7.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql80-community-release-el7-3 ################################# [100%]

4. 验证仓库是否添加成功

1
2
3
ls /etc/yum.repos.d/ -l
# 或者:
ls /etc/yum.repos.d/ -l | grep mysql

包含下面的字段,则代表安装成功:

1
2
mysql-community.repo
mysql-community-source.repo

前提警告:只可远观而不可亵玩焉,不要擅自进行修改!!!

你可以使用 vim /etc/yum.repos.d/mysql-community.repo 进行 MySQL 官方软件仓库的查看,这里面是纯文本配置内容,记录了 MySQL 官方软件仓库的地址、可安装的 MySQL 版本(如 5.7、8.0 等)、软件包校验信息等。给系统的包管理器(yum)指路 —— 告诉 yum 从哪里下载官方正版的 MySQL 软件(包括服务器、客户端等组件),以及如何验证下载的软件是否安全,从而实现通过 yum install mysql 等命令一键安装 / 更新 MySQL。

5. 检查是否可列出 MySQL 包

1
yum list | grep mysql

首次执行可能较慢(需下载元数据),耐心等待。若看到 mysql-community-server.x86_64 等条目,说明配置成功。

此时可删除下载的 .rpm 文件(非必需):

1
rm mysql-community-release-el7.rpm

4. 正式安装 MySQL 服务

1. 安装 MySQL Server

1
yum install -y mysql-community-server

等待安装完成,过程中会自动安装依赖包。

很不幸,我当时在这里出现了报错:AI 的说法: 日志末尾出现 GPG 密钥验证失败报错,这是导致安装无法继续的核心问题,具体报错信息:

1
2
3
4
5
>The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package.
>Check that the correct key URLs are configured for this repository.

>Failing package is: mysql-community-client-8.0.43-1.el7.x86_64
>GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

第一次执行 yum install 时,还出现过 SSH 连接断开Socket error Event: 32 Error: 10053),导致安装过程中途终止;重新连接后再次执行安装,才暴露了 GPG 密钥不匹配的核心报错。

解决办法:导入 MySQL 官方的 GPG key

  • MySQL 8.0.43 需要执行:

    1
    rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
  • 如果是 MySQL 5.7(或者 8.0 的早期版本 < 8.0.34),才会用旧的:

    1
    rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql

导入完 MySQL 官方的 GPG key 后需要再次执行 yum install -y mysql-community-server。我在这一次才成功,来看看几个关键点:

  1. Transaction test succeeded 👉 说明依赖检查通过,可以正常安装。
  2. Running transaction ... Installing ... Verifying ... 👉 依赖包一个个安装并验证通过,没有报错。
  3. 最后输出 Complete! 👉 这是 yum 安装成功的标志。

2. 验证安装结果

1
2
3
ls /etc/my.cnf           # 配置文件应已生成
which mysqld # MySQL 服务程序路径
which mysql # MySQL 客户端路径

输出示例:

1
2
3
/etc/my.cnf
/usr/sbin/mysqld
/usr/bin/mysql

5. 启动 MySQL 服务并验证

1. 启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
systemctl start mysqld					# 启动服务
systemctl status mysqld # 检查服务状态

# 启动成功示例:
[root@hcss-ecs-be68 ~]# systemctl start mysqld
[root@hcss-ecs-be68 ~]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2025-08-16 20:49:34 CST; 5ms ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 30782 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 30852 (mysqld)
Status: "Server is operational"
CGroup: /system.slice/mysqld.service
└─30852 /usr/sbin/mysqld

2. 设置开机自启(推荐)

在上面的运行启动示例中 已经显示 MySQL 服务默认配置了开机自启,如果你不确定开机自启是否启用,可执行:

1
systemctl enable mysqld

3. 检查服务状态

1
2
3
4
5
ps ajx | grep mysqld     # 查看守护进程

netstat -nltp | grep 3306 # 查看监听端口(默认3306)
# 或
ss -nltp | grep 3306 # 查看 3306 端口是否已监听

正常应看到 mysqld 进程及 0.0.0.0:3306 监听状态。

MySQL 本质上其实是一种网络服务,默认监听 3306 端口,可通过防火墙或云平台安全组放行。

6. 首次登录 MySQL 并重置 root 密码

1. 获取临时密码

安装后 MySQL 默认会生成一个随机 root 密码,写在日志里:

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

你会得到类似:

1
2025-08-16T12:49:30.049756Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Rhszstdgg3#!		# 临时密码各不相同!

复制 Rhszstdgg3#! 部分作为临时密码。

⚠️ 如果日志中没有,可能服务未正常启动或未生成,请检查 /var/log/mysqld.log 全文。

2. 登录 MySQL

1
mysql -u root -p

输入上面复制的临时密码进行登录。

3. 修改 root 密码(必须操作)

登录后,立即修改密码,否则多数操作会被拒绝:

1
2
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxxxxxxxxx';
# 你需要把 xxxxxxxxxxx 换成自己实际的密码,注意要用 ; 结尾!!

MySQL 5.7 默认有密码强度策略,密码至少 8 位,包含大小写、数字和特殊字符,否则修改会出错!

4. 重新登录(使用自己的密码)

在 MySQL 里输入:

1
exit;		# 注意要一直输入直到退出到 Linux 的 shell 中,不要丢掉了分号结尾!!

重新登录:

1
mysql -u root -p		# 这里再输入自己的密码,注意这里不回显。

如果能成功进入 MySQL,就说明密码修改完成 🎉

7. 配置优化(可选)

1. 修改配置文件

可以使用 vim /etc/my.cnf 或者用 VS Code 进行修改,我们需要 调整字符集为 utf8mb4(防止后续中文或 emoji 出现乱码)以及一些其他设置,下面是完整文件内容,可以直接复制替换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

# 数据库存储目录
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# 错误日志和 PID 文件
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# 设置默认字符集为 utf8mb4,避免中文和 emoji 乱码
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

# 开启远程访问(默认只允许本地连接)
bind-address = 0.0.0.0

说明:

  • character-set-server = utf8mb4 → 设置服务端默认字符集为 utf8mb4。
  • collation-server = utf8mb4_general_ci → 设置默认的排序规则,utf8mb4_general_ci 兼容性好,性能也不错。
  • bind-address = 0.0.0.0 → 默认 MySQL 只监听 127.0.0.1(只能本机访问),加上这行才能接受远程连接。
1
2
systemctl restart mysqld		# 保存退出后,重启 MySQL
systemctl status mysqld # 再检查服务是否起来

2. port=3306 有必要写吗?

建议:不用额外写,保持默认,除非有特殊需求。MySQL 默认就是 3306, 我们可以添加字段 port=3306,也可以不添加。需要改的时候才写:如果你要跑多个实例,或者公司要求用非默认端口(比如 3307、13306),这时候才需要在 my.cnf 明确写 port=xxx(即 3306 可以自定义成其他值/端口)。

3. default-storage-engine=innodb 有必要吗?

MySQL 8.0 默认存储引擎就是 InnoDB,所以写不写效果一样。在 5.1、5.5 那个时代,MyISAM 还是默认引擎,所以 MySQL 5.7 左右的配置里常常会加这行,这里我们就不需要了。

4. 其他补充项

优化项(根据机器内存调整),这里我们就跳过,依旧使用上面的可覆盖文件内容。

  • innodb_buffer_pool_size = 1G(内存充足时设大一点)

  • max_connections = 200(并发上限,根据业务调)

  • 慢查询日志(调试优化时用):

    1
    2
    3
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql-slow.log
    long_query_time = 2

8. RPM VS YUM

1. RPM 是什么?

RPM(RedHat Package Manager)= 一个软件的安装包。就像一个压缩文件,里面装着:

  • 可执行程序(比如 /usr/sbin/mysqld
  • 配置文件(比如 /etc/my.cnf
  • 安装说明(依赖、版本号、校验信息)

我们可以直接用 rpm -ivh xxx.rpm 安装,就像手工解压+复制到系统目录。特点:只装这个包本身,不会自动去找依赖(比如你装 MySQL,缺少 libaio,它不会帮你装)。

2. YUM 源是什么?

YUM(Yellowdog Updater, Modified)= 一个包管理工具。它的任务是:

  • 根据命令(yum install mysql-community-server),自动去找相应的 RPM 包;
  • 如果缺少依赖,会自动从仓库里拉依赖包;
  • 自动校验包的签名,保证安全;
  • 还负责卸载、升级等操作。

YUM 源(repo 文件)就是给 YUM 指路的「仓库地址清单」,告诉它:

  • 仓库的网址(http/https 地址)
  • 里面有哪些 RPM 包(比如 mysql-community-server、mysql-community-client)
  • 用哪个 GPG key 校验

特点:一条命令自动装好依赖,比手工 rpm 安全省心。

3. RPM 与 YUM 源的关系

  • RPM 包 → 一个个软件快递盒子。
  • YUM 源 → 快递仓库的导航地图。
  • 我们做的事
    1. rpm -ivh mysql-community-release-el7.rpm → 装了一个「导航地图」(repo 文件),让 yum 知道 MySQL 仓库在哪里。
    2. yum install mysql-community-server → yum 拿着地图去官方仓库,把 MySQL 的 RPM 和依赖都搬到系统里装上。

4. 如果只用 RPM,不用 YUM 会怎样?

得自己一个个下载 RPM(server、client、libs、common、依赖库…),可能缺一个依赖包就报错,得再去手动找,过程麻烦,还容易遗漏。而用 YUM,只要源配置好:

1
yum install -y mysql-community-server

它会自动把 server + client + libs + common + 依赖库 都装好。

MySQL 安装『适用于 CentOS 7』 | CSDN

MySQL:安装和 MySQL 基础 | CSDN