###一、程序介绍
###1.1 程序概述
FGMySQLAutoInstall_S1是一款由风哥(FGEDU)自主研发、专为数据库管理员(DBA)和运维工程师打造的 MySQL 8/9 单机版一键自动化安装脚本。本脚本采用”配置驱动”的设计理念,通过一份 YAML 格式的配置文件(配置文件)即可完成 MySQL 数据库从系统前置配置、LVM 卷组划分、内核参数调优、安全加固、安装部署、服务注册、初始化到测试数据验证的全流程自动化操作。
本脚本旨在解决传统 MySQL 安装过程中存在的步骤繁琐、人工干预多、容易出错、难以标准化、难以重复执行等痛点。用户只需准备好 MySQL 官方二进制安装包并按需修改配置文件,执行一条命令即可在数分钟内完成一个生产可用的 MySQL 8/9 单机实例部署,极大提升了数据库交付效率,降低了人为操作失误风险。
脚本基于 Python 3 开发,遵循 MySQL 官方最佳实践配置参数,内置完善的错误处理与失败回滚清理机制,支持安装步骤失败后多次重试,并提供详尽的日志记录,便于问题排查与审计追溯。脚本同时适配国产化操作系统(麒麟 V10、欧拉 EulerOS)和主流企业级 Linux 发行版,可广泛应用于企业级数据库标准化交付、开发测试环境快速搭建、数据库培训教学等场景。
### 1.2 作者信息
作者:风哥
官方网站 http://www.fgedu.net.cn, http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html
mysql一键安装教程1 https://edu.51cto.com/course/40552.html
mysql一键安装教程2 https://edu.51cto.com/course/40553.html
### 1.3 设计理念
本脚本的核心设计理念如下:
1. **配置驱动**:所有可变参数(系统配置、LVM 划分、内核参数、安全设置、MySQL 参数、测试数据等)全部集中在一个 YAML 配置文件中,做到”一份配置,一次部署”,便于版本管理和环境复用。
2. **一键自动化**:从权限校验到结果验证,全流程无需人工编写命令,极大降低部署门槛。
3. **安全可靠**:安装前进行多项前置检查(权限、操作系统版本、安装包、配置冲突、磁盘/内存/CPU 资源、端口占用等),失败时自动清理已做的配置,避免残留脏数据。
4. **官方最佳实践**:MySQL 参数、内核参数、资源限制等均参考官方推荐值,开箱即用即可满足生产级别要求。
5. **可重试可回滚**:每个安装步骤支持失败后重试(最大 10 次),用户退出或安装失败时自动执行清理,保证环境干净。
6. **日志可追溯**:全程详细记录每一条命令、每一份配置文件内容、每一次执行结果,便于审计与故障定位。
### 1.4 适用场景
本脚本适用于以下典型场景:
– 企业生产环境 MySQL 8/9 单机实例的标准化快速交付。
– 开发、测试、预发环境的 MySQL 快速搭建与重建。
– 数据库运维自动化平台中作为底层部署引擎被编排调用。
– 数据库培训教学场景,快速生成可练习的 MySQL 实例。
– 国产化适配场景(麒麟、欧拉等操作系统)下的 MySQL 部署。
## 二、程序功能与特性
### 2.1 核心功能特性
本脚本提供以下核心功能特性,覆盖 MySQL 单机部署的全生命周期:
#### 2.1.1 自动识别并适配多种操作系统
脚本通过读取 /etc/os-release 自动识别操作系统类型与版本,内置支持列表包括:
– CentOS Linux 7/8+
– AnolisOS 7/8+
– Rocky Linux 7/8/9+
– Almalinux 7/8/9+
– RHEL(Red Hat Enterprise Linux)7/8/9+
– OEL(Oracle Linux Server)7/8/9+
– 麒麟 Kylin V10+
– 欧拉 openEuler / EulerOS
对于不在支持列表的操作系统,脚本会主动报错退出,避免在不兼容环境上误操作。
#### 2.1.2 配置驱动部署
所有部署参数集中于 配置文件,主要分为三大配置节:
– system:依赖包、LVM、内核参数、安全配置。
– mysql:root 密码、my.cnf 全量参数(含 client、mysql、mysqld、mysqldump 各段)。
– test:测试库、测试用户、测试表结构与测试数据。
脚本在执行前会对配置文件进行完整性、合法性校验,缺少必填字段会明确提示缺失项并退出。
#### 2.1.3 多 LVM 卷组支持
支持配置多个磁盘、多个 VG 卷组,可分别用于 MySQL 数据目录、备份目录等不同用途。每条 LVM 配置包含:vg_name(卷组名)、lv_name(逻辑卷名)、pv_devices(物理卷设备)、mount_point(挂载点)、filesystem(文件系统,如 xfs)、size(大小)、skip(是否跳过已存在的 LVM)。
LVM 配置流程包括:pvcreate、vgcreate、lvcreate、mkfs、mkdir、mount、写入 /etc/fstab 实现开机自动挂载。对于已配置好的 LVM,可设置 skip: true 跳过,避免重复操作。
#### 2.1.4 系统前置配置
自动完成以下系统层面的前置准备:
– 依赖包安装(libaio、numactl、net-tools、perl、wget、tar 等),优先尝试挂载光驱本地源,失败则使用现有 yum 仓库。
– 内核参数配置(sysctl):网络参数、文件系统参数、内存参数、大内存页配置等,写入 /etc/sysctl.d/mysql.conf 并立即生效。
– 资源限制配置(limits):mysql 用户的 nofile、nproc 限制,写入 /etc/security/limits.d/mysql.conf。
– 安全加固:关闭防火墙(firewalld)、关闭 SELinux、关闭 NUMA、关闭透明大页(THP)、设置 IO 调度策略(如 deadline)、设置 RemoveIPC=no。
– 系统时区设置:自动设置为 Asia/Shanghai。
– 创建 mysql 用户与用户组(GID 1001)。
– 创建安装目录、数据目录、日志目录、binlog 目录等并设置正确权限。
#### 2.1.5 MySQL 安装与初始化
– 自动扫描当前目录、soft 目录、/tmp 目录,识别符合 mysql-8/9.x.tar.gz 或 mysql-8/9.x.tar.xz 命名规则的安装包。
– 目录数据检查:解压前检查数据目录、日志目录、应用目录是否已有数据,有数据时提示用户是否清理。
– 清理目录数据前自动停止 MySQL 服务和进程,避免文件占用。
– 解压安装包到指定目录并重命名为标准路径(默认 /mysql/app/mysql)。
– 检查 mysqld 版本与依赖库(ldd),确保运行环境完整。
– 使用 mysqld –initialize-insecure 完成数据库初始化,并读取错误日志确认初始化成功。
– 初始化后统一设置目录权限归属 mysql:mysql。
#### 2.1.6 服务注册与启动
– 自动生成 systemd 服务文件(/etc/systemd/system/mysql.service),配置开机自启、失败自动重启、文件句柄限制等。
– 支持 mysqld_safe 方式启动,确保子进程异常停止时自动重启。
– 启动失败时支持多次重试(最大 10 次),并自动获取 MySQL 错误日志、systemctl 状态、journalctl 日志辅助排查。
– 启动后校验服务运行状态(active running)。
#### 2.1.7 安全与远程配置
– 修改 root 本地密码为配置文件中指定的强密码。
– 创建 root 远程账号(root@%)并授予全部权限,支持远程管理。
– 刷新权限使其立即生效。
#### 2.1.8 测试数据初始化
– 自动创建测试库(默认 fgedudb)。
– 创建测试用户(默认 fgedu)并授权。
– 创建测试表(默认 fgtest_table)并按配置插入测试数据。
– 便于安装后立即进行连通性与功能验证。
#### 2.1.9 错误处理与自动清理
– 每个安装步骤均支持失败后重试,最大重试次数为 10 次。
– 用户主动退出(输入 q/quit 或 Ctrl+C)或安装失败时,自动执行清理:停止并移除 MySQL 服务、清理数据目录/应用目录/日志目录内容(保留目录本身)、清理 MySQL 用户与用户组、清理配置文件等。
– 清理使用 find 命令删除目录内容而保留目录本身,便于重新安装。
#### 2.1.10 日志记录
– 全程记录到 mysql_install.log(脚本同目录)。
– 记录内容包括:每步操作的时间戳、执行的每条命令、生成的每份配置文件内容、每步执行结果、错误信息、用户交互选择等。
– 日志同时输出到控制台,便于实时观察安装进度。
#### 2.1.11 安装前确认
安装前显示系统信息(主机名、IP、操作系统、CPU 核心数、内存大小、MySQL 版本),用户输入 yes 确认后才开始安装,避免误操作。
#### 2.1.12 其他特性
– 自动删除系统默认的 /etc/my.cnf,避免配置冲突。
– 自动卸载已安装的 mysql、mariadb、percona 包,避免版本冲突。
– my.cnf 默认生成并读取 /mysql/data/3306/my.cnf。
– 支持 .tar.gz 和 .tar.xz 两种安装包格式。
– 启用 rc-local 服务实现开机自启动部分配置(如关闭透明大页)。
– 提供独立的 mysql.server 脚本用于手工启停 MySQL 服务与查看状态。
### 2.2 程序目录结构
“`
/fgedu/fgedudb/mysql/FGMySQLAutoInstall_S1.0/
├── FGMySQLAutoInstall_S1.0.py # 主安装脚本(Python3)
├── 配置文件 # 配置文件(部署参数)
├── mysql.server # 手工启停MySQL服务脚本
├── mysql_install.log # 安装过程日志
├── INSTALL.md # 安装步骤说明
├── README.md # 说明文档
├── docs/
│ └── README2.md # 本详细说明手册
├── python-pkgs/ # 离线Python依赖包
│ ├── fgedudb.repo # 本地yum源配置示例
│ ├── pip-23.3.1.tar.gz
│ ├── setuptools-68.2.2.tar.gz
│ └── pyyaml wheel 包
└── soft/ # MySQL安装包目录(需自备)
└── mysql-8/9.x.tar.gz/xz
“`
安装完成后 MySQL 相关目录结构:
“`
/mysql/
├── app/mysql/ # MySQL 程序安装目录(basedir)
├── data/3306/
│ ├── data/ # 数据目录(datadir)
│ ├── my.cnf # MySQL配置文件
│ ├── mysql.pid # PID文件
│ └── mysql.sock -> /tmp/mysql.sock
└── log/3306/
├── fgedudb-error.err # 错误日志
├── fgedudb-general.err # 通用查询日志
├── fgedudb-query.err # 慢查询日志
└── binlog/ # 二进制日志目录
/backup/ # 备份目录(可选)
“`
## 三、支持环境
### 3.1 操作系统支持
本脚本支持以下操作系统(通过 /etc/os-release 自动识别):
| 操作系统 | 支持版本 | 说明 |
|———|———|——|
| CentOS Linux | 7、8 | 社区企业级 Linux |
| AnolisOS | 7、8 | 阿里龙蜥 |
| Rocky Linux | 7、8、9 | CentOS 替代发行版 |
| Almalinux | 7、8、9 | CentOS 替代发行版 |
| RHEL(Red Hat Enterprise Linux) | 7、8、9 | 红帽企业版 |
| OEL(Oracle Linux Server) | 7、8、9 | 甲骨文企业版 |
| 麒麟 Kylin | V10 | 国产化操作系统 |
| 欧拉 openEuler | 全版本 | 华为开源操作系统 |
| 欧拉 EulerOS | 全版本 | 华为企业版操作系统 |
### 3.2 硬件资源要求
| 资源项 | 最低要求 | 推荐配置 |
|——–|———|———|
| CPU | 2 核 | 4 核及以上 |
| 内存 | 2 GB | 8 GB 及以上 |
| 安装目录磁盘空间 | 10 GB | 20 GB 及以上 |
| 数据目录磁盘空间 | 20 GB | 根据业务数据量规划,建议 50 GB 及以上 |
| 网络 | 可访问 yum 仓库或本地安装源 | 千兆及以上 |
### 3.3 软件依赖
– Python 3(系统自带)
– pyyaml:用于解析 YAML 配置文件(在线安装 yum install -y python3-pyyaml,或离线安装)
– MySQL 8/9 官方二进制安装包(.tar.gz 或 .tar.xz 格式)
– 系统命令:systemctl、yum/dnf、pvcreate/vgcreate/lvcreate、mkfs、mount、sysctl、grubby、timedatectl 等
### 3.4 运行权限
– 必须以 root 用户身份运行(脚本会校验 os.geteuid() == 0)。
– 需具备修改系统配置文件、安装软件包、创建用户、操作磁盘等权限。
## 四、程序使用
### 4.1 安装准备
#### 4.1.1 准备 MySQL 安装包
下载 MySQL 8/9 官方二进制安装包(如 mysql-8/9.0-linux-glibc2.28-x86_64.tar.xz),放置在以下任一位置:
– 当前脚本所在目录(.)
– soft 子目录
– /tmp 目录
安装包命名需符合 mysql-8/9.x.tar.gz 或 mysql-8/9.x.tar.xz 规则,脚本通过正则自动识别版本号。
#### 4.1.2 安装 Python 依赖包
脚本运行依赖 pyyaml,提供在线与离线两种安装方式。
在线安装(推荐):
“`bash
yum install -y python3-pyyaml
# 或
pip3 install pyyaml
“`
离线安装(无法联网时):
1. 在有网络机器上下载 pyyaml 的 wheel 包。
2. 将 wheel 包复制到目标机器。
3. 执行:pip3 install pyyaml-xxx.whl
验证安装:
“`bash
python3 –version
python3 -c “import yaml; print(‘pyyaml version:’, yaml.__version__)”
“`
#### 4.1.3 修改配置文件
复制并编辑 配置文件,根据实际环境调整以下关键参数:
– system.packages:依赖包列表。
– system.lvm:LVM 卷组配置(磁盘设备、卷组名、逻辑卷名、挂载点、大小、是否跳过)。
– system.kernel:内核参数。
– system.security:防火墙、SELinux、NUMA、透明大页、IO 调度等。
– mysql.root_password:root 密码(请使用强密码)。
– mysql.my_cnf:MySQL 全部参数(端口、目录、字符集、连接数、InnoDB、日志等)。
– test:测试库、用户、表、数据。
### 4.2 执行安装
#### 4.2.1 赋予执行权限
“`bash
chmod +x FGMySQLAutoInstall_S1.0.py
“`
#### 4.2.2 运行脚本
“`bash
# 方式一
./FGMySQLAutoInstall_S1.0.py
# 方式二
python3 FGMySQLAutoInstall_S1.0.py
“`
#### 4.2.3 安装流程说明
脚本执行后自动依次完成以下步骤:
#### 4.2.4 安装完成输出
安装完成后脚本输出汇总信息,包括:MySQL 版本、安装目录、数据目录、端口、root 密码、测试库、测试用户、测试密码、测试表,以及生产环境清理测试数据的步骤。
### 4.3 手工管理 MySQL 服务
脚本目录下提供 mysql.server 脚本,用于手工启停 MySQL 与查看状态:
“`bash
# 启动MySQL
./mysql.server start
# 停止MySQL
./mysql.server stop
# 重启MySQL
./mysql.server restart
# 查看状态
./mysql.server status
“`
也可使用 systemctl 管理:
“`bash
systemctl start mysql
systemctl stop mysql
systemctl restart mysql
systemctl status mysql
systemctl enable mysql
systemctl disable mysql
“`
### 4.4 连接 MySQL
“`bash
# 本地连接
mysql -u root -p
# 远程连接
mysql -u root -h <服务器IP> -P 3306 -p
“`
## 五、程序各种案例场景与操作过程
### 5.1 场景一:全新生产环境标准部署
**场景描述**:在一台全新的 Oracle Linux 9.3 服务器(4 核 8GB 内存,已划分好 /mysql 与 /backup 两个 LVM 挂载点)上部署 MySQL 8/9 生产实例。
**操作过程**:
1. 上传安装包与脚本到服务器:
“`bash
# 将脚本目录上传至 /fgedu/fgedudb/mysql/FGMySQLAutoInstall_S1.0/
# 将 MySQL 安装包放至 /tmp/ 或 soft/ 目录
ls /tmp/mysql-8/9.0-linux-glibc2.28-x86_64.tar.xz
“`
2. 修改 配置文件,因为是已配好 LVM,将 LVM 配置 skip 设为 true:
“`yaml
system:
lvm:
– vg_name: mysqlvg
lv_name: mysqllv
pv_devices: /dev/sdc
mount_point: /mysql
filesystem: xfs
size: 50G
skip: true # 已配置,跳过
– vg_name: vgbackup
lv_name: lvbackup
pv_devices: /dev/sdd
mount_point: /backup
filesystem: xfs
size: 100G
skip: true # 已配置,跳过
mysql:
root_password: YourStrongPwd123!
my_cnf:
innodb_buffer_pool_size: 4G # 按内存调整
max_connections: 500
“`
3. 执行安装:
“`bash
chmod +x FGMySQLAutoInstall_S1.0.py
python3 FGMySQLAutoInstall_S1.0.py
“`
4. 确认系统信息后输入 yes,等待安装完成。
5. 安装完成后清理测试数据:
“`bash
mysql -u root -p
DROP DATABASE fgedudb;
DROP USER ‘fgedu’@’%’;
FLUSH PRIVILEGES;
exit;
“`
### 5.2 场景二:全新裸机自动划分 LVM 部署
**场景描述**:一台全新服务器,有两块空闲磁盘 /dev/sdc 和 /dev/sdd,需要脚本自动完成 LVM 划分并挂载 /mysql 与 /backup 目录后部署 MySQL。
**操作过程**:
1. 确认磁盘未被使用:
“`bash
lsblk
pvdisplay /dev/sdc
pvdisplay /dev/sdd
“`
2. 修改 配置文件,LVM 配置 skip 设为 false:
“`yaml
system:
lvm:
– vg_name: mysqlvg
lv_name: mysqllv
pv_devices: /dev/sdc
mount_point: /mysql
filesystem: xfs
size: 50G
skip: false # 需要脚本自动创建
– vg_name: vgbackup
lv_name: lvbackup
pv_devices: /dev/sdd
mount_point: /backup
filesystem: xfs
size: 100G
skip: false # 需要脚本自动创建
“`
3. 执行安装脚本,脚本会自动执行 pvcreate、vgcreate、lvcreate、mkfs、mount、写入 /etc/fstab。
4. 安装完成后验证挂载:
“`bash
df -h | grep -E ‘mysql|backup’
cat /etc/fstab | grep -E ‘mysql|backup’
“`
### 5.3 场景三:重复安装(目录已有残留数据)
**场景描述**:之前安装过 MySQL 但未完全清理,数据目录、日志目录、应用目录中存在残留数据,需要重新安装。
**操作过程**:
1. 直接执行脚本:
“`bash
python3 FGMySQLAutoInstall_S1.0.py
“`
2. 脚本在解压安装包前会检查各目录是否存在数据,提示:
“`
警告: 目录 /mysql/data/3306/data/ 中存在数据
是否清理目录 /mysql/data/3306/data/ 中的数据?(y/n):
“`
3. 输入 y,脚本会自动停止 MySQL 服务和进程,然后清理目录数据(保留目录本身),继续安装。
4. 等待安装完成。
### 5.4 场景四:国产化操作系统(麒麟 V10)部署
**场景描述**:在麒麟 V10 操作系统上部署 MySQL 8/9。
**操作过程**:
1. 确认操作系统版本:
“`bash
cat /etc/os-release
# 确认 NAME 包含 Kylin,VERSION_ID 为 V10
“`
2. 确认 Python3 与 pyyaml 已安装:
“`bash
python3 –version
python3 -c “import yaml; print(yaml.__version__)”
“`
3. 准备 MySQL 安装包(注意选择兼容麒麟 V10 glibc 版本的安装包)。
4. 修改配置文件后执行安装脚本。脚本会自动识别麒麟 V10 并继续。
### 5.5 场景五:安装失败后重试
**场景描述**:安装过程中某步骤(如 MySQL 服务启动)失败,需要排查后重试。
**操作过程**:
1. 脚本启动失败时会自动重试(最多 10 次),并提示常见排查方法:
“`
步骤 ‘注册启动服务’ 失败
常见问题排查:
1. 检查端口是否被占用: lsof -i:3306
2. 检查数据目录权限: ls -la /mysql/data/3306/
3. 检查错误日志: tail -50 /mysql/log/3306/fgedudb-error.err
4. 修复问题后按回车继续,输入’q’退出:
“`
2. 根据提示排查问题,例如查看错误日志:
“`bash
tail -100 /mysql/log/3306/fgedudb-error.err
systemctl status mysql
journalctl -u mysql -n 50
“`
3. 修复问题后按回车继续重试,或输入 q 退出(退出会自动清理)。
### 5.6 场景六:安装失败后手动清理
**场景描述**:安装失败且脚本自动清理未完全,需要手动清理后重新安装。
**操作过程**:
“`bash
# 停止并移除MySQL服务
systemctl stop mysql
systemctl disable mysql
rm -f /etc/systemd/system/mysql.service
systemctl daemon-reload
# 清理MySQL相关目录内容(保留目录)
find /mysql/app/mysql -mindepth 1 -delete
find /mysql/data/3306/data -mindepth 1 -delete
find /mysql/log/3306/binlog -mindepth 1 -delete
rm -f /tmp/mysql.sock*
# 清理配置文件
rm -f /etc/my.cnf
rm -f /mysql/data/3306/my.cnf
rm -f /etc/sysctl.d/mysql.conf
rm -f /etc/security/limits.d/mysql.conf
# 清理用户
userdel -r mysql
groupdel mysql
“`
清理完成后重新执行安装脚本即可。
### 5.7 场景七:调整 MySQL 参数后重新部署
**场景描述**:已有 MySQL 实例,需要调整 innodb_buffer_pool_size 等参数后重新部署。
**操作过程**:
1. 修改 配置文件 中对应参数:
“`yaml
mysql:
my_cnf:
innodb_buffer_pool_size: 8G
max_connections: 1000
“`
2. 备份现有数据(如需要):
“`bash
mysqldump -u root -p –all-databases > /backup/all_db_backup.sql
“`
3. 执行安装脚本,处理目录残留数据提示(输入 y 清理)。
4. 完成后恢复数据(如需要):
“`bash
mysql -u root -p < /backup/all_db_backup.sql
“`
## 六、常用问题与排查
### 6.1 日志文件位置
安装过程详细日志记录在脚本同目录的 mysql_install.log 文件中。排查任何问题前,建议先查看该日志文件了解完整执行过程:
“`bash
# 查看完整日志
cat mysql_install.log | more
# 查看最后100行
tail -100 mysql_install.log
# 查看包含错误的行
grep -i “错误\|error\|fail” mysql_install.log
“`
MySQL 运行错误日志默认位于:/mysql/log/3306/fgedudb-error.err
### 6.2 常见问题与排查
#### 问题1:必须以 root 用户身份运行此脚本
**原因**:脚本需要修改系统配置、安装软件包、创建用户等,必须 root 权限。
**解决**:使用 root 用户或 sudo 执行:
“`bash
sudo python3 FGMySQLAutoInstall_S1.0.py
“`
#### 问题2:配置文件 配置文件 不存在
**原因**:配置文件未放置在脚本同目录或命名不正确。
**解决**:确保 配置文件 与脚本在同一目录,文件名完全一致。
#### 问题3:配置文件验证失败,缺少某字段
**原因**:配置文件缺少必填字段。
**解决**:根据提示补充对应字段。必填字段包括:system(packages、lvm、kernel、security)、mysql(root_password、my_cnf 及其 server-id、port、basedir、datadir)、test(database、user、password、table、table_structure、test_data)。
#### 问题4:不支持的操作系统版本
**原因**:操作系统不在支持列表。
**解决**:确认操作系统为支持的类型(CentOS/AnolisOS/Rocky/Almalinux/RHEL/OEL 7/8/9、麒麟 V10、欧拉)。如确需在未列出系统安装,请手动完成或联系作者支持。
#### 问题5:未找到 MySQL 安装包
**原因**:安装包未放置在正确位置或命名不符合规则。
**解决**:将安装包放至当前目录、soft 目录或 /tmp 目录,文件名符合 mysql-8/9.x.tar.gz 或 mysql-8/9.x.tar.xz 规则。可用命令确认:
“`bash
ls -la mysql-8/9.*.tar.*
“`
#### 问题6:系统中已安装 MySQL / MySQL 服务已存在
**原因**:系统已有 MySQL 残留,与本次安装冲突。
**解决**:先卸载已有 MySQL 并清理服务:
“`bash
yum remove -y mysql mysql-server mysql-client mariadb percona
systemctl stop mysql 2>/dev/null
systemctl disable mysql 2>/dev/null
rm -f /etc/systemd/system/mysql.service
systemctl daemon-reload
“`
或使用脚本的自动清理功能(安装失败时脚本会自动清理)。
#### 问题7:安装目录 / 数据目录已存在
**原因**:目标目录已有数据。
**解决**:执行脚本时按提示输入 y 清理目录数据,或手动清理后重新执行。
#### 问题8:磁盘空间不足
**原因**:安装目录可用空间不足 10GB 或数据目录不足 20GB。
**解决**:使用 df -h 检查磁盘空间,扩容或更换磁盘后重试。
#### 问题9:内存不足
**原因**:系统内存低于 2GB。
**解决**:增加内存至 2GB 以上(生产建议 8GB 以上),并相应调整 innodb_buffer_pool_size 参数。
#### 问题10:CPU 核心数不足
**原因**:CPU 核心数低于 2 核。
**解决**:增加 CPU 核心数至 2 核及以上。
#### 问题11:端口 3306 被占用
**原因**:3306 端口已被其他服务占用。
**解决**:
“`bash
# 查看占用端口的进程
lsof -i:3306
# 或
ss -tunlp | grep 3306
# 停止占用进程后重试,或在配置文件中修改 port 为其他端口
“`
#### 问题12:依赖包安装失败
**原因**:网络问题或 yum 仓库不可用。
**解决**:检查网络连接,配置可用的 yum 源。离线环境下可挂载系统光盘作为本地源(脚本会尝试自动挂载 /dev/cdrom 到 /mnt)。
#### 问题13:LVM 配置失败 – 磁盘已是物理卷 / 卷组已存在 / 逻辑卷已存在
**原因**:指定的磁盘或卷组/逻辑卷已被使用。
**解决**:选择未使用的磁盘,或使用不同的卷组/逻辑卷名称,或手动清理现有 LVM:
“`bash
# 查看现有LVM
pvs
vgs
lvs
# 清理(谨慎操作)
vgremove <vg_name>
pvremove <pv_device>
“`
对于已配置好的 LVM,可在配置文件中设置 skip: true 跳过。
#### 问题14:MySQL 服务启动失败
**原因**:常见原因包括端口占用、数据目录权限不对、配置文件错误、依赖库缺失等。
**解决**:脚本会自动显示错误日志关键信息,可执行以下命令排查:
“`bash
# 查看MySQL错误日志
tail -100 /mysql/log/3306/fgedudb-error.err
# 查看服务状态
systemctl status mysql
# 查看systemd日志
journalctl -u mysql -n 50
# 检查端口
lsof -i:3306
# 检查数据目录权限
ls -la /mysql/data/3306/
“`
修复后按回车让脚本重试,或输入 q 退出后排查。
#### 问题15:数据库初始化失败
**原因**:配置参数错误、依赖库缺失、数据目录权限不对等。
**解决**:
“`bash
# 检查mysqld依赖库
ldd /mysql/app/mysql/bin/mysqld | grep “not found”
# 如有 not found,安装对应依赖包
# 查看初始化错误日志
cat /mysql/log/3306/fgedudb-error.err
# 确认数据目录权限
ls -ld /mysql/data/3306/data
chown -R mysql:mysql /mysql
chmod 700 /mysql/data/3306/data
“`
#### 问题16:root 密码设置失败 / 远程连接失败
**原因**:初始化异常或权限问题。
**解决**:
“`bash
# 检查是否能无密码登录
mysql -u root -e “SELECT 1;”
# 手动设置密码
mysql -u root -e “ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘新密码’;”
mysql -u root -p -e “CREATE USER ‘root’@’%’ IDENTIFIED BY ‘新密码’; GRANT ALL ON *.* TO ‘root’@’%’ WITH GRANT OPTION; FLUSH PRIVILEGES;”
“`
#### 问题17:测试数据初始化失败
**原因**:MySQL 服务异常、root 密码不对、SQL 语法错误。
**解决**:检查 MySQL 服务状态、root 密码是否正确、配置文件中测试数据的 SQL 是否符合语法。
#### 问题18:pyyaml 未安装
**原因**:Python pyyaml 库未安装。
**解决**:
“`bash
# 在线安装
yum install -y python3-pyyaml
# 或
pip3 install pyyaml
# 离线安装:下载wheel包后
pip3 install pyyaml-xxx.whl
# 验证
python3 -c “import yaml; print(yaml.__version__)”
“`
#### 问题19:安装中断后如何完全清理重装
**解决**:参考 5.6 场景六手动清理,或直接重新执行脚本并按提示输入 y 清理目录数据。
#### 问题20:大内存页配置告警(large_page_aligned_alloc mmap failed; errno 12)
**原因**:系统大内存页配置不足或未正确分配。
**解决**:检查内核参数 vm.nr_hugepages 配置值是否与实际内存匹配,或在 my.cnf 中关闭 large_pages 配置,调整 vm.hugetlb_shm_group 为 mysql 用户组 GID(1001)。
### 6.3 排查常用命令速查
“`bash
# 查看MySQL服务状态
systemctl status mysql
# 查看MySQL进程
ps -ef | grep mysqld
# 查看端口监听
ss -tunlp | grep 3306
lsof -i:3306
# 查看MySQL错误日志
tail -100 /mysql/log/3306/fgedudb-error.err
# 查看安装日志
tail -100 mysql_install.log
# 查看systemd日志
journalctl -u mysql -n 50 –no-pager
# 查看数据目录权限
ls -la /mysql/data/3306/
# 查看磁盘空间
df -h
# 查看内存
free -h
# 查看CPU
lscpu
# 查看LVM
pvs; vgs; lvs
# 查看挂载
mount | grep mysql
cat /etc/fstab | grep mysql
“`
## 七、生产环境建议
### 7.1 清理测试数据
安装完成后务必清理测试库与测试用户:
“`sql
— 登录MySQL
mysql -u root -p
— 删除测试库
DROP DATABASE fgedudb;
— 删除测试用户
DROP USER ‘fgedu’@’%’;
— 刷新权限
FLUSH PRIVILEGES;
— 退出
exit;
“`
### 7.2 修改默认密码
将 root 密码修改为符合企业安全策略的强密码:
“`sql
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘新的强密码’;
ALTER USER ‘root’@’%’ IDENTIFIED BY ‘新的强密码’;
FLUSH PRIVILEGES;
“`
### 7.3 调整 MySQL 参数
根据实际硬件配置与业务负载,调整 my.cnf 中以下关键参数:
– innodb_buffer_pool_size:建议为物理内存的 50%~70%。
– max_connections:根据并发连接数调整。
– innodb_redo_log_capacity:根据写入量调整。
– binlog_expire_logs_seconds:根据保留周期调整。
修改后重启 MySQL 使其生效:
“`bash
systemctl restart mysql
“`
### 7.4 安全加固
– 生产环境建议不开放 root 远程账号,改为创建专用业务账号并授予最小权限。
– 启用防火墙并仅开放必要端口(3306)。
– 配置 MySQL SSL 连接。
– 定期审计账号与权限。
### 7.5 定期备份
– 配置定期逻辑备份(mysqldump)与物理备份(如使用 mysqlbackup 或 xtrabackup)。
– 备份文件存放至 /backup 目录或其他独立存储。
– 定期验证备份可恢复性。
## 八、脚本更新记录
### v1.0 初始版本
– 实现配置驱动型一键自动化安装。
– 支持 CentOS/AnolisOS/Rocky/Almalinux/RHEL/OEL/麒麟 V10/欧拉 EulerOS 系统。
– 自动执行系统前置配置。
– 自动安装、初始化、配置 MySQL 8/9。
– 自动创建测试数据并验证连接。
– 添加错误处理和清理功能。
– 完善日志记录。
– 支持 .tar.gz 和 .tar.xz 格式安装包。
– 支持多磁盘、多 VG 的 LVM 配置。
– 支持跳过已配置的 LVM。
– 使用 mysqld_safe 方式启动 MySQL。
– 自动删除系统默认 /etc/my.cnf 和已安装的 mysql/mariadb/percona。
– my.cnf 默认读取 /mysql/data/3306/my.cnf。
– 自动设置系统时区为 Asia/Shanghai。
– 启用 rc-local 服务实现开机自启动配置。
– 安装前显示系统信息并要求确认。
– 支持安装步骤失败后重试。
– MySQL 启动失败时显示关键错误日志。
### v1.0 功能增强
– 添加目录数据检查:解压安装包时检查数据目录、日志目录、应用目录是否有数据。
– 添加用户交互:提示用户是否清理目录数据。
– 优化服务管理:清理目录数据前自动停止 MySQL 服务和进程。
– 改进清理方式:使用 find 命令清理目录内容,保留目录本身。
## 九、联系方式
作者:风哥
官方网站 http://www.fgedu.net.cn, http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html
mysql一键安装教程1 https://edu.51cto.com/course/40552.html
mysql一键安装教程2 https://edu.51cto.com/course/40553.html
如有问题或建议,欢迎联系作者。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
