CentOS 7 安装 MySQL 8.4(LTS 版本)

大纲

前言

本文将介绍 CentOS 7 如何使用已编译的二进制包原生安装 MySQL 8.4(LTS 版本),绝大部分安装步骤同样适用于其他 Linux 发行版,比如 Debian、Ubuntu 等。值得一提的是,在 CentOS 7 上,由于默认的官方 YUM 存储库中并不包含 MySQL 8.4,因此无法通过 YUM 存储库在线安装 MySQL 8.4。

版本历史

LTS 版本

MySQL 8.4 是一个长期支持(LTS)版本,它的主流支持将持续到 2029 年 4 月 30 日,而延长支持将持续到 2032 年 4 月 30 日。这意味着 MySQL 8.4 将享有总计 8 年的支持周期,其中前 5 年为完全支持,后 3 年为延长支持。

准备工作

安装常用工具

1
sudo yum install -y vim curl tree net-tools binutils

安装软件依赖

1
sudo yum install -y libaio ncurses numactl

安装 GLIBC 依赖

执行以下命令查看系统是否支持 GLIBC 2.17,如果没有任何输出内容,则说明不支持,此时则需要手动安装 GLIBC 2.17,具体的安装步骤请自行查阅网络资料。

1
2
# 查看是否支持 GLIBC 2.17
sudo strings /lib64/libc.so.6 | grep GLIBC_2.17

创建 Linux 用户

1
2
3
4
5
# 创建用户组
sudo groupadd mysql

# 创建用户,禁止远程登录
sudo useradd -r -g mysql -s /bin/false mysql

MySQL 下载

打开 MySQL 官方网,根据自己的系统架构选择下载对应的二进制包。

或者通过 wget 命令下载,比如:

1
wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.2-linux-glibc2.17-x86_64.tar.xz

MySQL 安装

移除旧版本数据库

特别注意

如果以前安装过旧版本的 MySQL,切记要先备份数据,然后再移除旧版本 MySQL。

1
2
# 关闭服务
sudo systemctl stop mysql
1
2
3
4
5
6
7
8
# 查询已安装的 MySQL 相关包
sudo rpm -qa | grep -i mysql

# 卸载 MySQL 相关包
sudo yum remove mysql-*

# 查询是否卸载干净
sudo rpm -qa | grep -i mysql
1
2
3
4
# 删除文件
sudo rm -rf /etc/my.cnf
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql

安装新版本数据库

解压文件

1
2
3
4
5
6
7
8
# 解压文件
sudo tar -xvf mysql-8.4.2-linux-glibc2.17-x86_64.tar.xz -C /usr/local/

# 重命名安装目录
sudo mv /usr/local/mysql-8.4.2-linux-glibc2.17-x86_64/ /usr/local/mysql

# 授权给安装目录
sudo chown mysql:mysql -R /usr/local/mysql/

创建目录

  • 数据目录
1
2
3
4
5
# 创建数据目录
sudo mkdir -p /var/lib/mysql

# 授权给数据目录
sudo chown mysql:mysql /var/lib/mysql
  • 日志目录
1
2
3
4
5
6
7
8
# 创建日志目录
sudo mkdir -p /var/log/mysql

# 创建错误日志文件
sudo touch /var/log/mysql/error.log

# 授权给日志目录
sudo chown mysql:mysql -R /var/log/mysql

添加环境变量

1
2
3
4
5
6
7
8
# 编辑配置文件
sudo vim /etc/profile

# 在配置文件的末尾添加以下内容后保存退出
export PATH=$PATH:/usr/local/mysql/bin

# 使配置文件生效
sudo source /etc/profile

创建配置文件

  • 创建配置文件,MySQL 在初始化和正常运行的时候都会使用到该配置文件
1
2
3
4
5
# 创建配置文件
sudo touch /etc/my.cnf

# 授权给配置文件
sudo chown mysql:mysql /etc/my.cnf
  • 编辑配置文件 /etc/my.cnf
1
2
# 编辑配置文件
sudo vim /etc/my.cnf
  • 往配置文件添加以下内容
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
41
[client]
# 设置客户端的默认字符集
default-character-set=utf8mb4
# 客户端连接时使用的套接字文件路径
socket = /var/lib/mysql/mysql.sock

[mysql]
# 设置命令行客户端的默认字符集
default-character-set=utf8mb4

[mysqld]
# MySQL 服务的运行用户
user = mysql
# MySQL 的监听端口
port = 3306
# 允许访问数据库的 IP 地址
bind-address=0.0.0.0
# MySQL 的安装目录
basedir = /usr/local/mysql
# MySQL 的数据目录
datadir = /var/lib/mysql
# MySQL 服务器端的套接字文件路径
socket = /var/lib/mysql/mysql.sock
# MySQL 的 PID 文件路径
pid_file = /var/lib/mysql/mysql.pid
# MySQL 的错误日志文件路径
log_error = /var/log/mysql/error.log
# 允许的最大连接数
max_connections = 151
# 设置每个客户端在连接时默认使用的字符集,如何客户端在连接时明确指定了字符集,则客户端指定的字符集具有较高优先级
init_connect = 'SET NAMES utf8mb4'
# 设置服务端的默认字符集
character-set-server = utf8mb4
# 设置服务端的默认排序规则
collation-server=utf8mb4_unicode_ci
# 创建新表时使用的默认存储引擎
default-storage-engine = INNODB
# MySQL8 默认使用 caching_sha2_password 插件认证,以前默认是 mysql_native_password(已被弃用)
mysql_native_password = ON
# MySQL 使用的 SQL 模式
sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

初始化 MySQL

初始化 MySQL,未指定的初始参数默认会从配置文件 /etc/my.conf 获取,成功初始化后会在 MySQL 的数据目录下创建对应的数据文件。

1
2
# 未指定的初始参数会自动从配置文件中获取
sudo /usr/local/mysql/bin/mysqld --initialize

若需要指定部分初始参数,可以参考以下命令:

1
2
# 指定部分初始化参数
sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql --log-error=/var/log/mysql/error.log

初始化参数说明:

  • --user:指定使用哪个 Linux 用户
  • --basedir:指定 MySQL 的安装目录
  • --datadir:指定 MySQL 的数据目录
  • --log-error:指定 MySQL 的错误日志文件

初始化完成后,默认会将 root 账户的初始化密码输出在错误日志文件中。

1
2
# 查看错误日志文件
sudo cat /var/log/mysql/error.log

错误日志文件的内容如下,其中包含了 root 账户的初始化密码

1
2
3
4
5
6
2024-05-02T08:35:45.327763Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2024-05-02T08:35:48.227966Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.4.2) initializing of server in progress as process 723
2024-05-02T08:35:48.308630Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-05-02T08:35:53.705371Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-05-02T09:33:05.832399Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: _:ti(yFd58rh
2024-05-02T09:33:14.256519Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.

或者直接使用以下命令来查看 root 账户的初始化密码

1
sudo grep 'root@localhost:' /var/log/mysql/error.log | cut -d':' -f2-

创建运行时文件

1
2
3
4
5
6
7
8
# 创建 PID 文件
sudo touch /var/lib/mysql/mysql.pid

# 创建套接字文件
sudo touch /var/lib/mysql/mysql.sock

# 授权给文件
sudo chown mysql:mysql -R /var/lib/mysql

注册 MySQL 服务

注册服务
  • 创建配置文件
1
sudo touch /lib/systemd/system/mysqld.service
  • 编辑配置文件
1
sudo vim /lib/systemd/system/mysqld.service
  • 在配置文件中添加以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
User=mysql
Group=mysql
TimeoutSec=300
PrivateTmp=true

[Install]
WantedBy=multi-user.target
  • 使用配置文件生效
1
sudo systemctl daemon-reload
移除服务
  • 在移除服务之前,先确保该服务已停止
1
sudo systemctl stop mysqld
  • 删除配置文件
1
sudo rm /lib/systemd/system/mysqld.service
  • 使用配置文件生效
1
sudo systemctl daemon-reload

管理 MySQL 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 开机自启动服务
sudo systemctl enable mysqld

# 启动服务
sudo systemctl start mysqld

# 关闭服务
sudo systemctl stop mysqld

# 重启服务
sudo systemctl restart mysqld

# 查看服务状态
sudo systemctl status mysqld

MySQL 连接

防火墙配置

如果 CentOS 7 启用了防火墙,则需要开放 MySQL 的 3306 端口,否则外部无法连接 MySQL。

1
2
3
4
5
6
7
8
9
10
11
12
# 查看防火墙的运行状态
sudo systemctl status firewalld

# 开放 MySQL 端口
sudo firewall-cmd --zone=public --permanent --add-port=3306/tcp
sudo firewall-cmd --zone=public --permanent --add-port=3306/udp

# 保存防火墙配置
sudo firewall-cmd --reload

# 查看防火墙已开放的端口
sudo firewall-cmd --list-ports

更改 Root 用户的密码

  • 登录 MySQL,root 账户的初始化密码在 /var/log/mysql/error.log 错误日志文件中
1
mysql -h localhost -u root -p
  • 更改 root 账户的密码
1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
  • 若希望可以使用 root 账户远程登录 MySQL,则可以执行以下授权(考虑到数据库的安全性,不建议授权 root 账户远程登录)
1
2
3
4
5
6
7
8
9
10
11
# 切换数据库
USE mysql;

# 更改记录
UPDATE user set host = '%' where user = 'root';

# 刷新权限
FLUSH PRIVILEGES;

# 验证修改结果
select host, user from user;

常见问题

初始化 MySQL 失败

MySQL 初始化失败,一般是配置文件 /etc/my.conf 的内容有误,解决方法如下:

  • 查看 MySQL 的错误日志文件,观察有没有可用的错误信息
1
sudo cat /var/log/mysql/error.log
  • 删除 MySQL 数据目录下的所有文件
1
sudo rm -rf /var/lib/mysql/*
  • 清空 MySQL 错误日志文件的内容
1
sudo echo "" > /var/log/mysql/error.log
  • 修正 MySQL 配置文件 /etc/my.conf 的内容后,重新初始化 MySQL
1
2
# 未指定的初始参数会自动从配置文件中获取
sudo /usr/local/mysql/bin/mysqld --initialize
  • 查看 MySQL 的错误日志文件,观察是否初始化成功
1
sudo cat /var/log/mysql/error.log
  • MySQL 初始化成功后,重新创建运行时文件
1
2
3
4
5
6
7
8
# 创建 PID 文件
sudo touch /var/lib/mysql/mysql.pid

# 创建套接字文件
sudo touch /var/lib/mysql/mysql.sock

# 授权给文件
sudo chown mysql:mysql -R /var/lib/mysql
  • 最后启动 MySQL 服务
1
2
3
4
5
6
7
8
# 开机自启动服务
sudo systemctl enable mysqld

# 启动服务
sudo systemctl start mysqld

# 查看服务状态
sudo systemctl status mysqld

参考资料