# mysqldeploy **Repository Path**: hh688/mysqldeploy ## Basic Information - **Project Name**: mysqldeploy - **Description**: 可在linux系统上安装 mysql5.5/5.6/5.7/8.0/8.4 版本的 MySQL,可以初始化多实例 MySQL。 - **Primary Language**: Go - **License**: MIT - **Default Branch**: main - **Homepage**: https://gitee.com/hh688/mysqldeploy - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-22 - **Last Updated**: 2026-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: MySQL, install, Linux, mysql安装, Go语言 ## README # mysqldeploy `mysqldeploy` 是面向 CentOS 7 x86_64 的非交互式 MySQL 安全部署工具。它可以全新安装 MySQL,也可以复用同版本 `basedir` 创建端口隔离的多实例。 - 当前版本:**3.0.0** - 发布日期:**2026-07-15** - 版本状态:**非交互式稳定版** ## 核心能力 - 全程使用命令行参数,无交互式选择。 - 必须由 root 用户运行,包括 `--help`、`--version` 和 `--dry-run`。 - 安装前一次性执行完整检查,汇总所有错误及对应处理建议。 - 非空目录、错误版本和未知内容绝不覆盖。 - 支持安全复用同版本 `basedir`,为不同端口创建独立实例。 - 安装失败自动回滚本次创建的服务、配置和目录。 - 日志直接输出到控制台,不额外创建日志文件。 - 服务名称固定为 `mysqld{端口}`,例如 `mysqld3306`。 ## 支持版本 | 命令行版本 | 默认使用的精确版本 | 架构 | |---|---:|---| | 5.5 | 5.5.62 | Linux x86_64 | | 5.6 | 5.6.51 | Linux x86_64 | | 5.7 | 5.7.44 | Linux x86_64 | | 8.0 | 8.0.46 | Linux x86_64 | | 8.4 | 8.4.10 | Linux x86_64 | 未指定 `--package` 时,程序下载表中固定版本并校验 MD5,保证重复安装结果一致。 ## 默认配置 不带参数执行时使用: ```text MySQL系列 8.4 basedir /usr/local/mysql/8.4 instance-root /usr/local/mysql/8.4 实例目录 /usr/local/mysql/8.4/3306 数据目录 /usr/local/mysql/8.4/3306/data 端口 3306 root密码 123456 Buffer Pool 512MB 服务名称 mysqld3306 ``` 建议正式环境通过 `--password` 设置独立强密码。 ## 参数说明 | 参数 | 默认值 | 说明 | |---|---|---| | `--mysql-version` | `8.4` | MySQL 系列版本 | | `--basedir` | `/usr/local/mysql/{版本}` | MySQL 程序目录 | | `--instance-root` | 与 `basedir` 相同 | 实例存储根目录,程序自动追加端口 | | `--password` | `123456` | MySQL root 密码 | | `--port` | `3306` | MySQL 服务端口 | | `--buffer-pool-size` | `512MB` | 支持 M、MB、G、GB | | `--package` | 空 | 指定本地 `.tar.gz` 或 `.tar.xz` 安装包 | | `--dry-run` | 关闭 | 只检查并显示执行计划,不修改系统 | | `--help`、`-h` | - | 显示帮助 | | `--version`、`-V` | - | 显示工具、提交和构建版本信息 | ## 推荐执行流程 先执行完整检查: ```bash sudo ./mysqldeploy --dry-run ``` 检查全部通过后,去掉 `--dry-run` 执行安装: ```bash sudo ./mysqldeploy ``` 安装 3307 端口实例: ```bash sudo ./mysqldeploy \ --mysql-version 8.4 \ --basedir /usr/local/mysql/8.4 \ --instance-root /data/mysql \ --port 3307 \ --password 'ChangeMe.123' \ --buffer-pool-size 1GB ``` `--instance-root` 是实例存储根目录,程序会自动追加端口和 `data`。例如: ```bash sudo ./mysqldeploy \ --port 3308 \ --instance-root /data/test \ --password 'ChangeMe.123' ``` 最终路径为: ```text MySQL程序目录 /usr/local/mysql/8.4 实例根目录 /data/test 实例目录 /data/test/3308 数据目录 /data/test/3308/data 配置文件 /data/test/3308/etc/my.cnf 服务名称 mysqld3308 ``` 使用本地安装包: ```bash sudo ./mysqldeploy \ --mysql-version 8.4 \ --package /opt/packages/mysql-8.4.tar.xz ``` 查看项目版本: ```bash sudo ./mysqldeploy --version ``` ## 安装前检查 任何系统修改发生前,程序会完成并汇总以下检查: - root 身份、CentOS 7 和 x86_64 架构; - 参数合法性、端口范围、内存、磁盘和 Unix socket 路径长度; - 端口监听、systemd 服务名和快捷登录脚本冲突; - `basedir`、`instance-root`、实例目录和数据目录是否缺失、为空、非空或为符号链接; - 实例目录与程序目录是否存在危险路径重叠; - 已有 `basedir` 是否是真实 MySQL、版本是否匹配、动态库是否完整; - 本地安装包格式、版本、目录结构和路径穿越; - yum、rpm、systemctl、tar 等系统命令和运行依赖; - SELinux 状态及官网下载连通性。 检查失败时输出所有已发现问题,每项均包含处理建议;程序不会创建目录、下载文件或修改服务。 ## 目录安全与 basedir 复用 - `basedir` 不存在或为空:执行全新安装。 - `basedir` 非空且是同系列的完整 MySQL 程序目录:安全复用,仅创建新实例。 - `basedir` 不是 MySQL、版本不匹配或动态依赖缺失:强制退出。 - 复用 `basedir` 时不能同时指定 `--package`。 - `--instance-root` 表示实例存储根目录,不是最终 MySQL 数据目录。 - 实例目录固定为 `{instance-root}/{port}`,数据目录固定为 `{instance-root}/{port}/data`。 - 配置、日志、PID、Socket、Binlog 和 Relaylog 全部位于当前端口实例目录内。 - 实例目录内存在任何文件或子目录:强制退出。 - 同一个 `instance-root` 可以通过不同端口安全创建多个实例。 - 原 `--datadir` 参数已经删除,继续使用会返回参数错误,避免“根目录”与“最终数据目录”产生歧义。 实例目录结构: ```text {instance-root}/{port}/ ├── data ├── etc/my.cnf ├── log ├── socket ├── pid ├── tmp ├── binlog └── relaylog ``` ## 安装结果 安装成功后会在控制台显示版本、程序目录、实例目录、数据目录、配置文件、服务名、端口、Buffer Pool 和 root 密码。 常用管理命令: ```bash systemctl status mysqld3306 systemctl restart mysqld3306 systemctl stop mysqld3306 3306_mysql_login ``` ## 退出码 | 退出码 | 含义 | |---:|---| | 0 | 检查通过、dry-run 完成或安装成功 | | 1 | 安装执行失败,程序已尝试回滚 | | 2 | 非 root、参数错误或安装前检查未通过 | ## 构建 普通构建: ```bash go build -o mysqldeploy . ``` 写入 Git 提交和 UTC 构建时间: ```bash go build -trimpath \ -ldflags "-s -w \ -X mysqldeploy/internal/conf.GitCommit=$(git rev-parse --short HEAD) \ -X mysqldeploy/internal/conf.BuildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ -o mysqldeploy . ``` Linux AMD64 交叉编译: ```bash GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -o mysqldeploy-linux-amd64 . ``` 正式部署建议: ```bash install -o root -g root -m 0755 mysqldeploy-linux-amd64 /usr/local/bin/mysqldeploy ``` ## 测试 ```bash go test ./... go test -race ./... go vet ./... ``` ### 自动化代码测试 - 256种用户参数存在/缺省组合; - 参数边界、默认值派生和废弃参数拒绝; - 聚合错误提示、目录状态、符号链接和路径重叠; - 安装包版本、MD5、路径穿越和复制语义; - 配置、systemd服务、密码转义、下载和失败回滚; - 单元测试、Race检测、`go vet` 和Linux AMD64编译。 ### 测试服务器穷举验证 2026-07-15完成当前3.0.0版本测试: ```text 测试用例:319 通过: 319 失败: 0 ``` 测试范围: - 256种参数存在/缺省组合在CentOS 7目标环境逐一执行; - 非root、未知参数、位置参数和已删除的 `--datadir`; - 非法版本、端口、Buffer Pool、空密码和聚合错误输出; - 相对路径、系统危险路径、空格路径、文件、符号链接和非空目录; - 端口占用、服务冲突、已有实例、非MySQL basedir和版本不匹配; - 安装包缺失、空文件和错误格式; - dry-run零修改验证; - 服务启动、开机自启、端口监听、SQL查询、运行参数和重启恢复; - 测试服务、端口、目录及全新下载basedir的清理验证。 五版本真实安装矩阵: | MySQL系列 | 精确版本 | basedir测试方式 | 结果 | |---|---:|---|---| | 5.5 | 5.5.62 | 复用已有basedir | 通过 | | 5.6 | 5.6.51 | 复用已有basedir | 通过 | | 5.7 | 5.7.44 | 官网下载、全新安装 | 通过 | | 8.0 | 8.0.46 | 官网下载、全新安装 | 通过 | | 8.4 | 8.4.10 | 复用已有basedir | 通过 | 每个版本均验证:实例目录、配置文件、数据目录、Socket、systemd服务、监听端口、数据库版本、实际端口、实际数据目录、Buffer Pool以及服务重启后的可用性。 ### 测试服务器保留状态 穷举测试产生的临时服务、端口、目录和测试脚本已经清理。为了便于人工复核,服务器保留: ```text 程序文件 /tmp/mysqldeploy 程序版本 3.0.0 保留服务 mysqld3308 实例根目录 /data/test 实例目录 /data/test/3308 数据目录 /data/test/3308/data 服务状态 active / enabled ``` README不记录测试服务器登录凭据和数据库实际密码。 测试服务器二进制SHA-256: ```text 34ce0a1c9ac44dc7316c8d27cd3e455e56e58157934c382f97dc1d97ae6400fd ``` ## 版本信息 - 工具版本以根目录的 `VERSION` 和 `internal/conf/version.go` 为准,两者当前均为 `3.0.0`。 - `--mysql-version` 是需要安装的 MySQL 版本,与工具自身的 `--version` 不冲突。 - 本版本由原交互式安装流程升级为可审计、可自动化执行的非交互式 CLI。