系统环境

我的服务器系统信息如图:

系统信息

下载

下载地址:https://dev.mysql.com/downloads/mysql/

操作系统选择 Linux - Generic,系统架构根据自己的需求选择。

下载文件选择

解压,重命名,移动,新建目录

1
2
3
4
5
6
7
8
tar -xvf mysql-8.4.3-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.4.3-linux-glibc2.28-x86_64 mysql-8.4.3
sudo mv mysql-8.4.3 /usr/local
sudo mkdir -pv /usr/local/mysql-8.4.3/{data,log}
sudo touch /usr/local/mysql-8.4.3/log/error.log
sudo touch /usr/local/mysql-8.4.3/log/slow.log
sudo touch /usr/local/mysql-8.4.3/log/general.log
mkdir /tmp/mysql

配置文件

新建了一个配置文件 /etc/mysql.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
42
43
44
45
46
47
48
49
50
51
[mysqld]
#=====================基本路径配置=====================
basedir=/usr/local/mysql-8.4.3
datadir=/usr/local/mysql-8.4.3/data
port=3306
socket=/tmp/mysql/mysql.sock
mysqlx_socket=/tmp/mysql/mysqlx.sock
pid-file=/tmp/mysql/mysqld.pid
# ===================== 性能优化配置 =====================
# InnoDB配置
innodb_buffer_pool_size = 4G # 根据系统内存大小调整
innodb_log_buffer_size = 64M
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000


#=====================日志配置=====================
#错误日志
log-error=/usr/local/mysql-8.4.3/log/error.log

#慢查询日志
slow_query_log=1
slow_query_log_file=/usr/local/mysql-8.4.3/log/slow.log
long_query_time=2#记录执行时间超过2秒的查询

#通用查询日志
general_log=1
general_log_file=/usr/local/mysql-8.4.3/log/general.log

#=====================字符集设置=====================
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

#=====================主从复制配置=====================
#如果有主从复制,确保每个实例的server-id唯一
#启用二进制日志及设置server-id
server-id=1

#=====================系统资源配置=====================
#文件描述符限制(适用于大连接数的系统)
[mysqld_safe]
ulimit=65535

[mysql]
default-character-set=utf8mb4

[client]
port=3306
socket=/tmp/mysql/mysql.sock

新建 mysql 用户及权限配置

1
2
3
4
5
6
7
sudo groupadd mysql
sudo useradd -r -g mysql mysql

# 更改刚才新建的文件及目录的所属用户和用户组
sudo chown -R mysql:mysql /usr/local/mysql-8.4.3
sudo chown mysql:mysql /tmp/mysql
sudo chown mysql:mysql /etc/mysql.conf

SELinux

在不关闭 selinux 的情况下,需要配置刚才新建的文件及目录的安全上下文,否则会导致权限问题,selinux 无法让 MySQL 正常启动。

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
sudo semanage fcontext -a -t mysqld_exec_t "/usr/local/mysql-8.4.3/bin/mysqld"
sudo restorecon -v /usr/local/mysql-8.4.3/bin/mysqld


sudo semanage fcontext -a -t mysqld_db_t "/usr/local/mysql-8.4.3/data(/.*)?"
sudo restorecon -Rv /usr/local/mysql-8.4.3/data


sudo semanage fcontext -a -t mysqld_etc_t "/etc/mysql.cnf"
sudo restorecon -R -v /etc/mysql.cnf

sudo semanage fcontext -a -t mysqld_log_t "/usr/local/mysql-8.4.3/log(/.*)?"
sudo restorecon -Rv /usr/local/mysql-8.4.3/log


sudo semanage fcontext -a -t mysqld_var_run_t "/tmp/mysql/mysql.sock"
sudo restorecon -v /tmp/mysql/mysql.sock

sudo semanage fcontext -a -t mysqld_var_run_t "/tmp/mysql/mysqlx.sock"
sudo restorecon -v /tmp/mysql/mysqlx.sock

sudo semanage fcontext -a -t mysqld_var_run_t "/tmp/mysql/mysqld.pid"
sudo restorecon -v /tmp/mysql/mysqld.pid

sudo semanage fcontext -a -t mysqld_var_run_t "/tmp/mysql(/.*)?"
sudo restorecon -Rv /tmp/mysql(/.*)?

此外,一些可能用得到的查询的命令:

1
2
3
4
5
6
7
8
9
# 查询selinux的mysql策略
sudo semanage fcontext -l | grep mysql
# 查询selinux开放了mysql的端口
sudo semanage port -l | grep mysql
# selinux添加新的端口,mysqlx 的端口为 33060
sudo semanage port -a -t mysqld_port_t -p tcp 33060
# 删除刚才给文件设置的安全上下文:
sudo semanage fcontext -d "/path/your/set"
sudo restorecon -v /path/your/set

可参考 SELinux File Context

MySQL 的初始化及系统服务

MySQL 8.4以后,建议不要再使用 mysqld_safe 来启动 MySQL,直接使用 mysqld 即可。 mysqld_safe 的历史使命已经完成,现代的 systemd 能够提供更强大和灵活的服务管理功能,包括自动重启失败的服务、日志管理等。

1
2
cd /usr/local/mysql-8.4.3/bin
./mysqld --defaults-file=/etc/mysql.conf --user=mysql --initialize

初始化完成后,可以在 log/error.log 中看到为 root 用户生成的默认密码。

使用 systemd 来管理 MySQL,新建的 /etc/systemd/system/mysql.service 文件内容应该如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=MySQL Community Server
After=network.target

[Service]
Type=notify
User=mysql
Group=mysql
ExecStart=/usr/local/mysql-8.4.3/bin/mysqld --defaults-file=/etc/mysql.cnf
LimitNOFILE=65535
Environment=NOTIFY_SOCKET=/run/systemd/notify

[Install]
WantedBy=multi-user.target

特别注意:

  1. 根据官方文档,mysql 8.4 以后的版本 Type 改为了 notify。 见 Managing MySQL Server with systemd

In MySQL 8.4, mysqld uses the Type=notify process startup type. (Type=forking was used in MySQL 5.7.) With Type=notify, systemd automatically configures a socket file and exports the path to the NOTIFY_SOCKET environment variable.

  1. 这里面的 ExecStart 不能使用 mysqld_safe,否则会造成进程间无法通信。根据 AI 的说法,MySQL 的子进程尝试通过 NOTIFY_SOCKET 向 systemd 发送通知,但 systemd 只接受来自主进程的通知。这通常是由于 mysqld_safe 和 mysqld 之间的交互导致的问题。官方文档 Managing MySQL Server with systemd 里面提到:

On platforms for which systemd support for MySQL is installed, scripts such as mysqld_safe and the System V initialization script are unnecessary and are not installed. For example, mysqld_safe can handle server restarts, but systemd provides the same capability, and does so in a manner consistent with management of other services rather than by using an application-specific program.

重启服务或重启系统后,如果 systemctl status mysql 显示服务运行正常,即可用 mysql -uroot -p 命令登录,密码是log文件中生成的默认密码,登录后首先修改 root 用户密码

1
2
3
4
use mysql;

alter user 'root'@'localhost' identified by 'your new password';
flush privileges;

至此,安装阶段基本完成。