













一、程序介绍
1.1 程序概述
FGMySQLAutoInstall_S1是一款由风哥(FGEDU)自主研发、专为数据库管理员(DBA)和运维工程师打造的 MySQL 8/9 单机版一键自动化安装脚本。本脚本采用"配置驱动"的设计理念,通过一份 YAML 格式的配置文件(配置文件)即可完成 MySQL 数据库从系统前置配置、LVM 卷组划分、内核参数调优、安全加固、安装部署、服务注册、初始化到测试数据验证的全流程自动化操作。
本脚本旨在解决传统 MySQL 安装过程中存在的步骤繁琐、人工干预多、容易出错、难以标准化、难以重复执行等痛点。用户只需准备好 MySQL 官方二进制安装包并按需修改配置文件,执行一条命令即可在数分钟内完成一个生产可用的 MySQL 8/9 单机实例部署,极大提升了数据库交付效率,降低了人为操作失误风险。
脚本基于 Python 3 开发,遵循 MySQL 官方最佳实践配置参数,内置完善的错误处理与失败回滚清理机制,支持安装步骤失败后多次重试,并提供详尽的日志记录,便于问题排查与审计追溯。脚本同时适配国产化操作系统(麒麟 V10、欧拉 EulerOS)和主流企业级 Linux 发行版,可广泛应用于企业级数据库标准化交付、开发测试环境快速搭建、数据库培训教学等场景。
作者:风哥
官方网站 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
本脚本的核心设计理念如下:
本脚本适用于以下典型场景:
本脚本提供以下核心功能特性,覆盖 MySQL 单机部署的全生命周期:
脚本通过读取 /etc/os-release 自动识别操作系统类型与版本,内置支持列表包括:
对于不在支持列表的操作系统,脚本会主动报错退出,避免在不兼容环境上误操作。
所有部署参数集中于 配置文件,主要分为三大配置节:
脚本在执行前会对配置文件进行完整性、合法性校验,缺少必填字段会明确提示缺失项并退出。
支持配置多个磁盘、多个 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 跳过,避免重复操作。
自动完成以下系统层面的前置准备:
安装前显示系统信息(主机名、IP、操作系统、CPU 核心数、内存大小、MySQL 版本),用户输入 yes 确认后才开始安装,避免误操作。
/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/ # 备份目录(可选)
本脚本支持以下操作系统(通过 /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 | 全版本 | 华为企业版操作系统 |
| 资源项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核及以上 |
| 内存 | 2 GB | 8 GB 及以上 |
| 安装目录磁盘空间 | 10 GB | 20 GB 及以上 |
| 数据目录磁盘空间 | 20 GB | 根据业务数据量规划,建议 50 GB 及以上 |
| 网络 | 可访问 yum 仓库或本地安装源 | 千兆及以上 |
下载 MySQL 8/9 官方二进制安装包(如 mysql-8/9.0-linux-glibc2.28-x86_64.tar.xz),放置在以下任一位置:
安装包命名需符合 mysql-8/9.x.tar.gz 或 mysql-8/9.x.tar.xz 规则,脚本通过正则自动识别版本号。
脚本运行依赖 pyyaml,提供在线与离线两种安装方式。
在线安装(推荐):
yum install -y python3-pyyaml
# 或
pip3 install pyyaml
离线安装(无法联网时):
验证安装:
python3 --version
python3 -c "import yaml; print('pyyaml version:', yaml.__version__)"
复制并编辑 配置文件,根据实际环境调整以下关键参数:
chmod +x FGMySQLAutoInstall_S1.0.py
# 方式一
./FGMySQLAutoInstall_S1.0.py
# 方式二
python3 FGMySQLAutoInstall_S1.0.py
脚本执行后自动依次完成以下步骤:
安装完成后脚本输出汇总信息,包括:MySQL 版本、安装目录、数据目录、端口、root 密码、测试库、测试用户、测试密码、测试表,以及生产环境清理测试数据的步骤。
脚本目录下提供 mysql.server 脚本,用于手工启停 MySQL 与查看状态:
# 启动MySQL
./mysql.server start
# 停止MySQL
./mysql.server stop
# 重启MySQL
./mysql.server restart
# 查看状态
./mysql.server status
也可使用 systemctl 管理:
systemctl start mysql
systemctl stop mysql
systemctl restart mysql
systemctl status mysql
systemctl enable mysql
systemctl disable mysql
# 本地连接
mysql -u root -p
# 远程连接
mysql -u root -h <服务器IP> -P 3306 -p
场景描述:在一台全新的 Oracle Linux 9.3 服务器(4 核 8GB 内存,已划分好 /mysql 与 /backup 两个 LVM 挂载点)上部署 MySQL 8/9 生产实例。
操作过程:
# 将脚本目录上传至 /fgedu/fgedudb/mysql/FGMySQLAutoInstall_S1.0/
# 将 MySQL 安装包放至 /tmp/ 或 soft/ 目录
ls /tmp/mysql-8/9.0-linux-glibc2.28-x86_64.tar.xz
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
chmod +x FGMySQLAutoInstall_S1.0.py
python3 FGMySQLAutoInstall_S1.0.py
确认系统信息后输入 yes,等待安装完成。
安装完成后清理测试数据:
mysql -u root -p
DROP DATABASE fgedudb;
DROP USER 'fgedu'@'%';
FLUSH PRIVILEGES;
exit;
场景描述:一台全新服务器,有两块空闲磁盘 /dev/sdc 和 /dev/sdd,需要脚本自动完成 LVM 划分并挂载 /mysql 与 /backup 目录后部署 MySQL。
操作过程:
lsblk
pvdisplay /dev/sdc
pvdisplay /dev/sdd
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 # 需要脚本自动创建
执行安装脚本,脚本会自动执行 pvcreate、vgcreate、lvcreate、mkfs、mount、写入 /etc/fstab。
安装完成后验证挂载:
df -h | grep -E 'mysql|backup'
cat /etc/fstab | grep -E 'mysql|backup'
场景描述:之前安装过 MySQL 但未完全清理,数据目录、日志目录、应用目录中存在残留数据,需要重新安装。
操作过程:
python3 FGMySQLAutoInstall_S1.0.py
警告: 目录 /mysql/data/3306/data/ 中存在数据
是否清理目录 /mysql/data/3306/data/ 中的数据?(y/n):
输入 y,脚本会自动停止 MySQL 服务和进程,然后清理目录数据(保留目录本身),继续安装。
等待安装完成。
场景描述:在麒麟 V10 操作系统上部署 MySQL 8/9。
操作过程:
cat /etc/os-release
# 确认 NAME 包含 Kylin,VERSION_ID 为 V10
python3 --version
python3 -c "import yaml; print(yaml.__version__)"
准备 MySQL 安装包(注意选择兼容麒麟 V10 glibc 版本的安装包)。
修改配置文件后执行安装脚本。脚本会自动识别麒麟 V10 并继续。
场景描述:安装过程中某步骤(如 MySQL 服务启动)失败,需要排查后重试。
操作过程:
步骤 '注册启动服务' 失败
常见问题排查:
1. 检查端口是否被占用: lsof -i:3306
2. 检查数据目录权限: ls -la /mysql/data/3306/
3. 检查错误日志: tail -50 /mysql/log/3306/fgedudb-error.err
4. 修复问题后按回车继续,输入'q'退出:
tail -100 /mysql/log/3306/fgedudb-error.err
systemctl status mysql
journalctl -u mysql -n 50
场景描述:安装失败且脚本自动清理未完全,需要手动清理后重新安装。
操作过程:
# 停止并移除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
清理完成后重新执行安装脚本即可。
场景描述:已有 MySQL 实例,需要调整 innodb_buffer_pool_size 等参数后重新部署。
操作过程:
mysql:
my_cnf:
innodb_buffer_pool_size: 8G
max_connections: 1000
mysqldump -u root -p --all-databases > /backup/all_db_backup.sql
执行安装脚本,处理目录残留数据提示(输入 y 清理)。
完成后恢复数据(如需要):
mysql -u root -p < /backup/all_db_backup.sql
安装过程详细日志记录在脚本同目录的 mysql_install.log 文件中。排查任何问题前,建议先查看该日志文件了解完整执行过程:
# 查看完整日志
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
原因:脚本需要修改系统配置、安装软件包、创建用户等,必须 root 权限。
解决:使用 root 用户或 sudo 执行:
sudo python3 FGMySQLAutoInstall_S1.0.py
原因:配置文件未放置在脚本同目录或命名不正确。
解决:确保 配置文件 与脚本在同一目录,文件名完全一致。
原因:配置文件缺少必填字段。
解决:根据提示补充对应字段。必填字段包括:system(packages、lvm、kernel、security)、mysql(root_password、my_cnf 及其 server-id、port、basedir、datadir)、test(database、user、password、table、table_structure、test_data)。
原因:操作系统不在支持列表。
解决:确认操作系统为支持的类型(CentOS/AnolisOS/Rocky/Almalinux/RHEL/OEL 7/8/9、麒麟 V10、欧拉)。如确需在未列出系统安装,请手动完成或联系作者支持。
原因:安装包未放置在正确位置或命名不符合规则。
解决:将安装包放至当前目录、soft 目录或 /tmp 目录,文件名符合 mysql-8/9.x.tar.gz 或 mysql-8/9.x.tar.xz 规则。可用命令确认:
ls -la mysql-8/9.*.tar.*
原因:系统已有 MySQL 残留,与本次安装冲突。
解决:先卸载已有 MySQL 并清理服务:
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
或使用脚本的自动清理功能(安装失败时脚本会自动清理)。
原因:目标目录已有数据。
解决:执行脚本时按提示输入 y 清理目录数据,或手动清理后重新执行。
原因:安装目录可用空间不足 10GB 或数据目录不足 20GB。
解决:使用 df -h 检查磁盘空间,扩容或更换磁盘后重试。
原因:系统内存低于 2GB。
解决:增加内存至 2GB 以上(生产建议 8GB 以上),并相应调整 innodb_buffer_pool_size 参数。
原因:CPU 核心数低于 2 核。
解决:增加 CPU 核心数至 2 核及以上。
原因:3306 端口已被其他服务占用。
解决:
# 查看占用端口的进程
lsof -i:3306
# 或
ss -tunlp | grep 3306
# 停止占用进程后重试,或在配置文件中修改 port 为其他端口
原因:网络问题或 yum 仓库不可用。
解决:检查网络连接,配置可用的 yum 源。离线环境下可挂载系统光盘作为本地源(脚本会尝试自动挂载 /dev/cdrom 到 /mnt)。
原因:指定的磁盘或卷组/逻辑卷已被使用。
解决:选择未使用的磁盘,或使用不同的卷组/逻辑卷名称,或手动清理现有 LVM:
# 查看现有LVM
pvs
vgs
lvs
# 清理(谨慎操作)
vgremove <vg_name>
pvremove <pv_device>
对于已配置好的 LVM,可在配置文件中设置 skip: true 跳过。
原因:常见原因包括端口占用、数据目录权限不对、配置文件错误、依赖库缺失等。
解决:脚本会自动显示错误日志关键信息,可执行以下命令排查:
# 查看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 退出后排查。
原因:配置参数错误、依赖库缺失、数据目录权限不对等。
解决:
# 检查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
原因:初始化异常或权限问题。
解决:
# 检查是否能无密码登录
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;"
原因:MySQL 服务异常、root 密码不对、SQL 语法错误。
解决:检查 MySQL 服务状态、root 密码是否正确、配置文件中测试数据的 SQL 是否符合语法。
原因:Python pyyaml 库未安装。
解决:
# 在线安装
yum install -y python3-pyyaml
# 或
pip3 install pyyaml
# 离线安装:下载wheel包后
pip3 install pyyaml-xxx.whl
# 验证
python3 -c "import yaml; print(yaml.__version__)"
解决:参考 5.6 场景六手动清理,或直接重新执行脚本并按提示输入 y 清理目录数据。
原因:系统大内存页配置不足或未正确分配。
解决:检查内核参数 vm.nr_hugepages 配置值是否与实际内存匹配,或在 my.cnf 中关闭 large_pages 配置,调整 vm.hugetlb_shm_group 为 mysql 用户组 GID(1001)。
# 查看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
安装完成后务必清理测试库与测试用户:
-- 登录MySQL
mysql -u root -p
-- 删除测试库
DROP DATABASE fgedudb;
-- 删除测试用户
DROP USER 'fgedu'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出
exit;
将 root 密码修改为符合企业安全策略的强密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新的强密码';
ALTER USER 'root'@'%' IDENTIFIED BY '新的强密码';
FLUSH PRIVILEGES;
根据实际硬件配置与业务负载,调整 my.cnf 中以下关键参数:
修改后重启 MySQL 使其生效:
systemctl restart mysql
作者:风哥
官方网站 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
如有问题或建议,欢迎联系作者。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。