RHEL9 安装 MySQL 8.4.11.LTS 版本
- [三、下载 MySQL 8.4.11](#三、下载 MySQL 8.4.11)
- 四、校验安装包
- [五、创建 MySQL 系统用户](#五、创建 MySQL 系统用户)
- [六、解压 MySQL](#六、解压 MySQL)
- [七、检查 MySQL 二进制是否能运行](#七、检查 MySQL 二进制是否能运行)
- 八、规划目录
- 九、配置环境变量
- [十、创建 MySQL 配置文件](#十、创建 MySQL 配置文件)
- [十一、处理 SELinux](#十一、处理 SELinux)
- [十二、初始化 MySQL 数据库](#十二、初始化 MySQL 数据库)
- [十三、创建 systemd 服务](#十三、创建 systemd 服务)
- [十四、确认 3306 已监听](#十四、确认 3306 已监听)
- 十五、第一次登录
- 十六、运行安全初始化
- 十七、创建业务数据库和业务账号
- [十八、配置 RHEL 防火墙](#十八、配置 RHEL 防火墙)
- 十九、验证远程连接
- 二十、检查关键状态
- 二十一、检查日志
- [二十二、建议修改 limits](#二十二、建议修改 limits)
- 二十三、最终目录结构
- 二十四、以后常用的管理命令

截图里选择的是 MySQL Community Server 8.4.11 LTS → Linux Generic → glibc 2.28 → x86_64,文件名是:
text
mysql-8.4.11-linux-glibc2.28-x86_64.tar.xz
一、安装前检查
先确认系统版本和架构:
bash
cat /etc/redhat-release
uname -m
ldd --version | head -1
预期类似:
text
Red Hat Enterprise Linux release 9.8
x86_64
ldd (GNU libc) 2.34
RHEL 9 的 glibc 比该 MySQL 包要求的 glibc 2.28 更新。
再确认机器上没有已经运行的 MySQL/MariaDB:
bash
rpm -qa | grep -Ei 'mysql|mariadb'
systemctl status mysqld
systemctl status mariadb
如果这是全新服务器,没有输出或者服务不存在,可以继续。
如果机器已经有 MariaDB/MySQL,并且有现存业务数据,不要直接删除软件包或数据目录。
二、安装依赖
使用 root:
bash
dnf install -y libaio numactl-libs ncurses-compat-libs xz tar
建议再装几个日常排障工具:
bash
dnf install -y vim wget net-tools lsof
MySQL 官方 Generic Binary 安装文档特别提到 libaio;另外 EL8/EL9 上部分 Linux Generic 客户端可能需要 ncurses-compat-libs 提供兼容库,因此提前安装比较稳妥。(MySQL开发者专区1)
检查:
bash
rpm -q libaio
rpm -q numactl-libs
rpm -q ncurses-compat-libs
三、下载 MySQL 8.4.11
使用的完整包:
text
mysql-8.4.11-linux-glibc2.28-x86_64.tar.xz
建议选择第一个 Compressed TAR Archive,793.8 MB。
不要下载下面这些:
text
mysql-test-...
那些是测试套件。
Minimal Install 也可以运行,但既然是服务器正式部署,我更建议直接下载完整的:
text
mysql-8.4.11-linux-glibc2.28-x86_64.tar.xz
假设文件已经上传到:
text
/tmp/mysql-8.4.11-linux-glibc2.28-x86_64.tar.xz
检查:
bash
ls -lh /tmp/mysql-8.4.11-linux-glibc2.28-x86_64.tar.xz
应该大约:
text
794M
四、校验安装包
截图中官方给出的 MD5 是:
text
c5a7dabc8c0d91b5974d2ca43872aeeb
执行:
bash
md5sum /tmp/mysql-8.4.11-linux-glibc2.28-x86_64.tar.xz
结果应当匹配:
text
c5a7dabc8c0d91b5974d2ca43872aeeb
如果不一样,不建议继续安装,重新下载安装包。
生产环境更推荐使用 MySQL 官方提供的 GPG Signature 做签名验证。官方安装指南也建议在安装前验证下载包完整性。(MySQL开发者专区2)
五、创建 MySQL 系统用户
创建专门的 mysql 用户:
bash
groupadd mysql
bash
useradd -r -g mysql -s /sbin/nologin mysql
检查:
bash
id mysql
类似:
text
uid=995(mysql) gid=995(mysql) groups=995(mysql)
不要让 MySQL 使用 root 用户运行。官方 Generic Binary 部署指南同样采用独立的 mysql 系统账户。(MySQL开发者专区1)
六、解压 MySQL
进入:
bash
cd /usr/local
解压:
bash
tar -xJvf /tmp/mysql-8.4.11-linux-glibc2.28-x86_64.tar.xz
完成以后:
bash
ls -ld /usr/local/mysql*
应该看到:
text
/usr/local/mysql-8.4.11-linux-glibc2.28-x86_64
创建软连接:
bash
ln -s /usr/local/mysql-8.4.11-linux-glibc2.28-x86_64 /usr/local/mysql
检查:
bash
ls -l /usr/local/mysql
类似:
text
/usr/local/mysql -> /usr/local/mysql-8.4.11-linux-glibc2.28-x86_64
这样以后升级 8.4.x 会方便很多,只需要修改软链接。
MySQL 官方 Generic Binary 文档也推荐类似 /usr/local/mysql 的软链接布局。(MySQL开发者专区1)
七、检查 MySQL 二进制是否能运行
先不要急着初始化。
执行:
bash
/usr/local/mysql/bin/mysqld --version
正常应该显示类似:
text
/usr/local/mysql/bin/mysqld Ver 8.4.11 for Linux on x86_64 (MySQL Community Server - GPL)
检查客户端:
bash
/usr/local/mysql/bin/mysql --version
如果这里出现:
text
error while loading shared libraries
执行:
bash
ldd /usr/local/mysql/bin/mysqld | grep "not found"
以及:
bash
ldd /usr/local/mysql/bin/mysql | grep "not found"
正常情况下应该没有输出。
八、规划目录
推荐不要把真正的数据放 /usr/local/mysql/data。
这里使用:
text
程序目录:
/usr/local/mysql
数据目录:
/data/mysql/data
日志目录:
/data/mysql/log
临时目录:
/data/mysql/tmp
导入导出目录:
/data/mysql/mysql-files
创建:
bash
mkdir -p /data/mysql/data
mkdir -p /data/mysql/log
mkdir -p /data/mysql/tmp
mkdir -p /data/mysql/mysql-files
权限:
bash
chown -R mysql:mysql /data/mysql
bash
chmod 750 /data/mysql/mysql-files
确认:
bash
ls -ld /data/mysql/*
九、配置环境变量
创建:
bash
vim /etc/profile.d/mysql.sh
写入:
bash
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
立即生效:
bash
source /etc/profile.d/mysql.sh
检查:
bash
mysql --version
mysqld --version
应该都显示:
text
8.4.11
十、创建 MySQL 配置文件
建议使用:
bash
vim /etc/my.cnf
先用下面这一版。它适合首次部署,比直接套一份非常激进的"生产优化参数"更稳妥。
ini
[client]
port=3306
socket=/data/mysql/mysql.sock
[mysql]
default-character-set=utf8mb4
[mysqld]
user=mysql
port=3306
basedir=/usr/local/mysql
datadir=/data/mysql/data
socket=/data/mysql/mysql.sock
pid-file=/data/mysql/mysql.pid
# Character set
character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
# Network
bind-address=0.0.0.0
max_connections=500
# Logging
log-error=/data/mysql/log/error.log
slow_query_log=ON
slow_query_log_file=/data/mysql/log/slow.log
long_query_time=2
# Binary log
server-id=1
log-bin=/data/mysql/log/mysql-bin
binlog_format=ROW
binlog_expire_logs_seconds=604800
# InnoDB
default-storage-engine=InnoDB
innodb_buffer_pool_size=1G
innodb_log_buffer_size=64M
innodb_flush_log_at_trx_commit=1
# Security / files
secure-file-priv=/data/mysql/mysql-files
# SQL
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
注意:
ini
innodb_buffer_pool_size=1G
这里只是一个安全的初始值。
生产环境不能机械地固定为 1G。后面应该根据服务器实际内存和是否专用数据库服务器来调整。例如一台专用 MySQL 服务器有 32 GB 内存,可以从约:
ini
innodb_buffer_pool_size=20G
到:
ini
innodb_buffer_pool_size=24G
这个范围开始评估,但最终取值要结合业务负载。
十一、处理 SELinux
RHEL 9.8 默认 SELinux 通常开启:
bash
getenforce
如果是:
text
Enforcing
不要为了装 MySQL 就直接:
bash
setenforce 0
更不建议永久禁用 SELinux。
因为我们使用了非默认数据目录 /data/mysql,给目录设置合适的 SELinux context。
先安装工具:
bash
dnf install -y policycoreutils-python-utils
设置:
bash
semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
应用:
bash
restorecon -Rv /data/mysql
查看:
bash
ls -Zd /data/mysql
ls -Zd /data/mysql/data
如果你的环境针对自定义 tar 安装制定了更严格的 SELinux policy,则还要按照企业自己的 SELinux 基线执行。
十二、初始化 MySQL 数据库
这是整个过程中最重要的步骤之一。
先再次检查目录为空:
bash
ls -la /data/mysql/data
然后初始化:
bash
/usr/local/mysql/bin/mysqld \
--defaults-file=/etc/my.cnf \
--initialize \
--user=mysql
正常情况下不会输出太多内容。
查看日志:
bash
cat /data/mysql/log/error.log
找到:
text
A temporary password is generated for root@localhost:
例如:
text
A temporary password is generated for root@localhost: A&4hgd!xxYz
把这个临时密码保存下来。
也可以直接:
bash
grep "temporary password" /data/mysql/log/error.log
十三、创建 systemd 服务
使用:
bash
vim /etc/systemd/system/mysqld.service
内容:
ini
[Unit]
Description=MySQL Server 8.4.11
Documentation=https://dev.mysql.com/doc/refman/8.4/en/
After=network.target
Wants=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
ExecStop=/usr/local/mysql/bin/mysqladmin --defaults-file=/etc/my.cnf shutdown
LimitNOFILE=65535
TimeoutStartSec=600
TimeoutStopSec=600
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
然后:
bash
systemctl daemon-reload
启动:
bash
systemctl start mysqld
查看:
bash
systemctl status mysqld
正常应该看到:
text
Active: active (running)
设置开机启动:
bash
systemctl enable mysqld
确认:
bash
systemctl is-enabled mysqld
应该返回:
text
enabled
十四、确认 3306 已监听
bash
ss -lntp | grep 3306
应该出现类似:
text
LISTEN 0 151 0.0.0.0:3306 ...
查看进程:
bash
ps -ef | grep '[m]ysqld'
应该看到进程由:
text
mysql
用户运行,而不是 root。
十五、第一次登录
获取临时密码:
bash
grep "temporary password" /data/mysql/log/error.log
然后:
bash
mysql -uroot -p
输入临时密码。
第一次登录以后必须马上修改 root 密码:
sql
ALTER USER 'root'@'localhost'
IDENTIFIED BY '你自己的强密码';
例如不要用简单的:
text
123456
root123
password
修改完成:
sql
SELECT VERSION();
应该返回:
text
8.4.11
十六、运行安全初始化
退出:
sql
exit;
然后:
bash
mysql_secure_installation
根据你的安全要求回答。
通常生产服务器推荐:
text
Remove anonymous users? Y
Disallow root login remotely? Y
Remove test database? Y
Reload privilege tables now? Y
尤其不建议允许 root 从远程直接登录。
十七、创建业务数据库和业务账号
不要让应用程序使用 root。
重新登录:
bash
mysql -uroot -p
创建数据库:
sql
CREATE DATABASE appdb
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
创建业务用户,比如你的应用服务器 IP 是:
text
10.10.10.20
那么:
sql
CREATE USER 'appuser'@'10.10.10.20'
IDENTIFIED BY '强密码';
授权:
sql
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,ALTER,INDEX
ON appdb.*
TO 'appuser'@'10.10.10.20';
然后:
sql
SHOW GRANTS FOR 'appuser'@'10.10.10.20';
不要为了图方便直接:
sql
CREATE USER 'root'@'%' ...
也尽量不要:
sql
GRANT ALL ON *.* TO 'appuser'@'%';
十八、配置 RHEL 防火墙
首先查看:
bash
systemctl status firewalld
如果服务器需要被其他机器连接,可以开放 MySQL 服务:
bash
firewall-cmd --permanent --add-service=mysql
然后:
bash
firewall-cmd --reload
查看:
bash
firewall-cmd --list-services
不过生产环境更推荐只允许数据库客户端所在网段访问 3306,而不是把 3306 对所有来源开放。
例如只允许:
text
10.10.10.0/24
可以使用 rich rule:
bash
firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" port protocol="tcp" port="3306" accept'
然后:
bash
firewall-cmd --reload
十九、验证远程连接
在客户端执行:
bash
mysql \
-h MYSQL服务器IP \
-P 3306 \
-u appuser \
-p
进入后:
sql
SELECT VERSION();
然后:
sql
SELECT USER(), CURRENT_USER();
二十、检查关键状态
在数据库中运行:
sql
SHOW VARIABLES LIKE 'basedir';
SHOW VARIABLES LIKE 'datadir';
SHOW VARIABLES LIKE 'socket';
SHOW VARIABLES LIKE 'port';
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';
SHOW VARIABLES LIKE 'log_bin';
预期包括:
text
basedir /usr/local/mysql/
datadir /data/mysql/data/
socket /data/mysql/mysql.sock
port 3306
character_set_server utf8mb4
collation_server utf8mb4_0900_ai_ci
log_bin ON
检查:
sql
SHOW DATABASES;
二十一、检查日志
错误日志:
bash
tail -100 /data/mysql/log/error.log
实时查看:
bash
tail -f /data/mysql/log/error.log
慢日志:
bash
tail -f /data/mysql/log/slow.log
systemd:
bash
journalctl -u mysqld
最近 100 行:
bash
journalctl -u mysqld -n 100 --no-pager
二十二、建议修改 limits
创建:
bash
vim /etc/security/limits.d/mysql.conf
写:
text
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft nproc 65535
mysql hard nproc 65535
由于我们已经在 systemd 里面设置:
ini
LimitNOFILE=65535
对于 mysqld 本身主要由 systemd 的限制生效。
重启:
bash
systemctl restart mysqld
查看:
bash
cat /proc/$(pidof mysqld)/limits | grep "open files"
应该类似:
text
Max open files 65535
二十三、最终目录结构
安装完成后,大致应该是:
text
/usr/local/
├── mysql -> mysql-8.4.11-linux-glibc2.28-x86_64
└── mysql-8.4.11-linux-glibc2.28-x86_64/
├── bin/
├── include/
├── lib/
├── share/
└── support-files/
/data/mysql/
├── data/
├── log/
│ ├── error.log
│ ├── slow.log
│ ├── mysql-bin.000001
│ └── mysql-bin.index
├── mysql-files/
├── tmp/
├── mysql.sock
└── mysql.pid
/etc/
├── my.cnf
├── profile.d/mysql.sh
└── systemd/system/mysqld.service
这也符合 MySQL Generic Unix/Linux 二进制分发本身的目录设计;官方文档列出的包内主要目录包括 bin、lib、include、share 和 support-files。(MySQL开发者专区1)
二十四、以后常用的管理命令
启动:
bash
systemctl start mysqld
停止:
bash
systemctl stop mysqld
重启:
bash
systemctl restart mysqld
状态:
bash
systemctl status mysqld
开机自启:
bash
systemctl enable mysqld
取消开机启动:
bash
systemctl disable mysqld
登录:
bash
mysql -uroot -p
版本:
bash
mysql --version
查看错误:
bash
tail -100 /data/mysql/log/error.log