Debian 11 安装 MySQL 8.4(LTS 版本)

大纲

前言

本文将介绍 Debian 11 如何使用已编译的二进制包原生安装 MySQL 8.4(LTS 版本),绝大部分安装步骤同样适用于其他 Linux 发行版,比如 CentOS、Ubuntu 等。值得一提的是,Debian 11 不支持使用 APT 存储库的方式来安装 MySQL 8.4,因为 MySQL 官方没有相应的支持。

版本历史

LTS 版本

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

准备工作

更换软件源

1
2
# 备份配置文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 更改配置文件
sudo cat > /etc/apt/sources.list << EOF
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bullseye-security main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bullseye-security main contrib non-free
EOF
1
2
# 更新 APT 索引
sudo apt update

安装常用工具

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

安装软件依赖

1
sudo apt-get install -y libaio1 libncurses6 libnuma1 sysv-rc-conf

安装 GLIBC 依赖

执行以下命令查看系统是否支持 GLIBC 2.28,如果没有任何输出内容,则说明不支持,此时则需要手动安装 GLIBC 2.28。

1
2
# 查看是否支持 GLIBC 2.28
sudo strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_2.28

GLIBC 2.28 安装

创建 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.28-x86_64.tar.xz

MySQL 安装

移除旧版本数据库

特别注意

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

1
2
# 关闭服务
sudo systemctl stop mysql
1
2
3
4
5
6
# 卸载软件
sudo apt-get remove --purge mysql-*

# 清除残留
sudo apt-get autoremove
sudo apt-get autoclean
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.28-x86_64.tar.xz -C /usr/local/

# 重命名安装目录
sudo mv /usr/local/mysql-8.4.2-linux-glibc2.28-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 服务

方法一

提示

推荐使用此方式来注册 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 服务,因为 /etc/my.conf 配置文件里指定的 PID 文件和 Socket 文件不会生效。

注册服务
  • 注册服务
1
2
3
4
5
6
7
8
# 拷贝配置文件
sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

# 赋予可执行权限
sudo chmod +x /etc/init.d/mysqld

# 注册服务
sudo sysv-rc-conf mysqld on
  • 验证服务
1
2
3
4
5
# 查看服务列表
sudo sysv-rc-conf --list

# 如果看到 mysqld 服务,并且 3、4、5 都是 on 的话,则说明注册服务成功;如果是 off,则需要执行以下命令来开启
sudo sysv-rc-conf --level 345 mysqld on
移除服务
  • 在移除服务之前,先确保该服务已停止
1
sudo systemctl stop mysqld
  • 运行 sysv-rc-conf 命令,然后找到需要移除的服务。在交互式界面中,取消该服务所有运行级别(0-6)中的复选框,这将从所有运行级别中禁用该服务
1
sudo sysv-rc-conf
  • 删除服务的启动脚本
1
sudo rm /etc/init.d/mysqld
  • 更新运行级别链接,以确保服务已完全移除
1
sudo update-rc.d -f mysqld remove
  • 验证服务已被移除
1
sudo service --status-all

管理 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 连接

更改 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

参考资料