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
相关推荐
海兰1 小时前
【数据库】tdsql(MySQL )的事务隔离级别
android·数据库·mysql
哆啦A梦z1 小时前
Android BLE 实战:从小米手环 7 踩坑到完整连接框架
android
灵析表格2 小时前
Excel连接MySQL的函数化革命:灵析表格MySQL函数族业务应用分析
数据库·mysql·adb·excel·wps·灵析表格·excel公式盒子
笑一下蒜了.2 小时前
Linux 存储多路径访问手册|multipath.conf 各配置段详解
android·linux·运维
凡泰AI2 小时前
如何通过小程序多端框架,让一个小程序同时运行在iOS、安卓、鸿蒙以及PC客户端,实现一次开发多端运行的效果
android·ios·小程序
ruleslol2 小时前
MySQL: Undo日志与MVCC多版本并发控制
mysql
二十雨辰3 小时前
[Java]-MySql面试题
mysql
一笑的小酒馆3 小时前
Androidiot扫地机器人设备详情页地图加载慢卡顿优化方案
android
xixiaoyunya4 小时前
安卓远程管理电脑/NAS文件:从传统SMB方案到Web化私有云的选型与落地实践
android·电脑