RHEL9 安装 MySQL 8.4.11.LTS 版本

RHEL9 安装 MySQL 8.4.11.LTS 版本

MySQL官网下载地址

截图里选择的是 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 二进制分发本身的目录设计;官方文档列出的包内主要目录包括 binlibincludesharesupport-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
相关推荐
美狐美颜sdk2 小时前
直播APP开发技术栈详解:视频美颜SDK、人脸识别与实时渲染
android·人工智能·音视频·美颜sdk·直播美颜sdk
独泪了无痕5 小时前
SQL函数实战:GREATEST与LEAST的技巧
数据库·sql·mysql
麻辣布丁5 小时前
MySQL篇面试题模拟
mysql
这个DBA有点耶6 小时前
MySQL 8.0.20移除了Block Nested Loop,之前学的JOIN优化知识还适用吗?
数据库·mysql·架构
奈斯先生Vector7 小时前
当模型版本不断变化,RelayRouter 能否帮助 AI 应用摆脱深度绑定
android·java·人工智能·开源·aigc
TimeFine7 小时前
让强模型做“总工”,让高性价比模型写代码
android
又见情义9 小时前
RK3568 Android 13 屏蔽 healthd 电池日志经验分享
android
开心麻瓜9 小时前
一条 SQL 跑了 8 秒,优化到 200ms 的全过程
mysql
FYKJ_201010 小时前
【毕设分享】基于Web的校园兼职信息发布与申请系统07059
前端·vue.js·spring boot·mysql·typescript·spark·课程设计
文人sec11 小时前
MYSQL:insert...select:为什么锁源表的所有行和间隙?怎么最快地复制一张表?
数据库·python·mysql