# 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 - 5.6.47-1 - Initial RPM package for SmartTMS MySQL 5.6.47.