190 lines
6.2 KiB
RPMSpec
190 lines
6.2 KiB
RPMSpec
# smarttms-mysql.spec
|
||
#
|
||
# 这个 spec 文件用于将 MySQL 5.6.47 及其相关配置打包成 RPM。
|
||
# 它会创建 mysql 用户和组,初始化数据库,设置root密码,并导入初始SQL数据。
|
||
|
||
Name: smarttms-mysql
|
||
Version: 5.6.47
|
||
Release: 1%{?dist}
|
||
Summary: MySQL 5.6.47 Database Server for SmartTMS Application
|
||
# 禁用 debuginfo 包的生成
|
||
%define debug_package %{nil}
|
||
%global __debug_install_post %{nil}
|
||
Group: Applications/Databases
|
||
License: GPLv2
|
||
URL: https://www.mysql.com/
|
||
BuildArch: x86_64
|
||
|
||
# Source0 是 MySQL 预编译二进制包
|
||
Source0: mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz
|
||
# Source1 是自定义的 my.cnf 配置文件
|
||
Source1: my.cnf
|
||
# Source2 是 systemd 服务单元文件
|
||
Source2: mysqld.service
|
||
# Source3 是 SmartTMS 应用程序的初始数据库 SQL 文件
|
||
Source3: tms_db_s3.sql
|
||
|
||
# 构建依赖
|
||
BuildRequires: systemd
|
||
BuildRequires: tar
|
||
BuildRequires: gzip
|
||
|
||
# 运行时依赖
|
||
Requires: systemd
|
||
Requires: shadow-utils
|
||
Requires: libaio
|
||
Requires: perl-Data-Dumper
|
||
|
||
%description
|
||
This package provides the MySQL 5.6.47 database server specifically configured
|
||
for the SmartTMS application. It includes the necessary binaries,
|
||
configuration files, systemd service unit, and initial database schema.
|
||
|
||
%prep
|
||
# 解压 Source0 (MySQL二进制包)
|
||
# -q: 静默模式
|
||
# -n: 指定解压后目录名,与 Source0 的 tarball 内部顶层目录名一致
|
||
%setup -q -n mysql-5.6.47-linux-glibc2.12-x86_64
|
||
|
||
%build
|
||
# 对于预编译二进制包,通常不需要编译步骤。
|
||
# 如果需要,可以在这里添加编译命令。
|
||
|
||
%install
|
||
# 清理构建根目录
|
||
rm -rf %{buildroot}
|
||
|
||
# 创建安装路径
|
||
mkdir -p %{buildroot}/usr/local
|
||
mkdir -p %{buildroot}%{_unitdir}
|
||
mkdir -p %{buildroot}/etc
|
||
mkdir -p %{buildroot}/etc/profile.d
|
||
mkdir -p %{buildroot}/usr/share/smarttms-mysql # 用于存放 SQL 导入文件
|
||
|
||
# 复制 MySQL 二进制文件到 /usr/local/
|
||
# 注意:%setup 已经将内容解压到当前目录 (即 %{_builddir}/mysql-5.6.47-linux-glibc2.12-x86_64)
|
||
cp -a . %{buildroot}/usr/local/mysql-5.6.47-linux-glibc2.12-x86_64
|
||
|
||
# 创建 /usr/local/mysql 软链接
|
||
ln -s mysql-5.6.47-linux-glibc2.12-x86_64 %{buildroot}/usr/local/mysql
|
||
|
||
# 复制配置文件
|
||
cp %{SOURCE1} %{buildroot}/etc/my.cnf
|
||
|
||
# 复制 systemd 服务文件
|
||
cp %{SOURCE2} %{buildroot}%{_unitdir}/mysqld.service
|
||
|
||
# 创建 PATH 环境变量配置脚本
|
||
echo 'PATH=/usr/local/mysql/bin:$PATH' > %{buildroot}/etc/profile.d/mysql.sh
|
||
chmod 0644 %{buildroot}/etc/profile.d/mysql.sh
|
||
|
||
# 复制初始 SQL 导入文件
|
||
cp %{SOURCE3} %{buildroot}/usr/share/smarttms-mysql/tms_db_s3.sql
|
||
|
||
%clean
|
||
rm -rf %{buildroot}
|
||
|
||
%pre
|
||
# 在安装包之前执行的脚本
|
||
# 创建 mysql 用户和组,如果不存在的话
|
||
getent group mysql >/dev/null || groupadd -r -g 306 mysql
|
||
getent passwd mysql >/dev/null || useradd -r -g 306 -u 306 -d /data/mysql -s /sbin/nologin mysql
|
||
|
||
# 创建数据目录并设置权限
|
||
# 注意:/data/mysql 是数据目录,不直接打包在 RPM 中,而是在 %pre 或 %post 中创建和管理
|
||
mkdir -p /data/mysql
|
||
chown mysql:mysql /data/mysql
|
||
chmod 0750 /data/mysql
|
||
|
||
%post
|
||
# 在安装包之后执行的脚本
|
||
# $1 是安装类型,1 表示安装,2 表示升级
|
||
|
||
# 重新加载 systemd 配置,启用并启动 MySQL 服务
|
||
%systemd_post mysqld.service
|
||
|
||
# 仅在首次安装时初始化数据库、设置密码和导入数据
|
||
if [ "$1" -eq 1 ]; then
|
||
echo "Initializing MySQL database..."
|
||
# 切换到 MySQL 安装目录
|
||
cd /usr/local/mysql/
|
||
|
||
# 初始化数据库
|
||
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
|
||
# 确保数据目录权限正确
|
||
chown -R mysql:mysql /data/mysql
|
||
|
||
# 等待 MySQL 服务启动并可用
|
||
echo "Waiting for MySQL server to start..."
|
||
for i in $(seq 1 60); do
|
||
/usr/local/mysql/bin/mysqladmin ping -h 127.0.0.1 -P 3306 &>/dev/null && break
|
||
sleep 1
|
||
done
|
||
|
||
if ! /usr/local/mysql/bin/mysqladmin ping -h 127.0.0.1 -P 3306 &>/dev/null; then
|
||
echo "Error: MySQL server did not start in time for post-install setup." >&2
|
||
exit 1
|
||
fi
|
||
|
||
echo "MySQL server is running. Performing initial setup..."
|
||
# 设置 root 密码
|
||
/usr/local/mysql/bin/mysqladmin -uroot password PythA90ra5
|
||
|
||
# 删除匿名用户和 test 数据库
|
||
/usr/local/mysql/bin/mysql -uroot -pPythA90ra5 -e "DROP USER ''@'localhost'"
|
||
/usr/local/mysql/bin/mysql -uroot -pPythA90ra5 -e "DROP DATABASE test"
|
||
/usr/local/mysql/bin/mysql -uroot -pPythA90ra5 -e "FLUSH PRIVILEGES"
|
||
|
||
# 导入初始数据库
|
||
echo "Importing initial database schema from %{_datadir}/smarttms-mysql/tms_db_s3.sql..."
|
||
/usr/local/mysql/bin/mysql -uroot -pPythA90ra5 < %{_datadir}/smarttms-mysql/tms_db_s3.sql
|
||
echo "Database initialization and import complete."
|
||
else
|
||
echo "MySQL package upgraded. Skipping database initialization."
|
||
fi
|
||
|
||
%preun
|
||
# 在卸载包之前执行的脚本
|
||
# 停止 MySQL 服务
|
||
%systemd_preun mysqld.service
|
||
|
||
%postun
|
||
# 在卸载包之后执行的脚本
|
||
# $1 是卸载类型,0 表示完全卸载,1 表示升级
|
||
|
||
# 禁用 MySQL 服务并重新加载 systemd 配置
|
||
%systemd_postun mysqld.service
|
||
|
||
# 如果是完全卸载 (即 $1 为 0),则清理用户、组和数据目录
|
||
if [ "$1" -eq 0 ]; then
|
||
echo "Performing full uninstallation cleanup..."
|
||
# 删除数据目录 (请谨慎操作,这会删除所有数据!)
|
||
rm -rf /data/mysql
|
||
# 删除用户和组
|
||
userdel mysql
|
||
groupdel mysql
|
||
# 删除 PATH 环境变量配置脚本
|
||
rm -f /etc/profile.d/mysql.sh
|
||
echo "Full uninstallation cleanup complete."
|
||
fi
|
||
|
||
%files
|
||
# 列出所有属于这个 RPM 包的文件和目录
|
||
%defattr(-,root,root,-)
|
||
# MySQL 安装目录及其内容
|
||
/usr/local/mysql-5.6.47-linux-glibc2.12-x86_64/
|
||
# 软链接
|
||
/usr/local/mysql
|
||
# 配置文件 (noreplace 表示如果文件被修改,升级时不会覆盖)
|
||
%config(noreplace) /etc/my.cnf
|
||
# systemd 服务文件
|
||
%{_unitdir}/mysqld.service
|
||
# PATH 环境变量配置脚本
|
||
/etc/profile.d/mysql.sh
|
||
# 初始 SQL 导入文件 (作为文档或辅助文件)
|
||
%{_datadir}/smarttms-mysql/tms_db_s3.sql
|
||
|
||
%changelog
|
||
* Fri Dec 06 2025 Your Name <your.email@example.com> - 5.6.47-1
|
||
- Initial RPM package for SmartTMS MySQL 5.6.47.
|