MySQL 5.1.73 一键部署中文游戏库环境
Zebra 游戏服务器数据库环境的开箱即用方案,一条命令完成 环境准备 → 源码编译 → 初始化启动 → 授权建库。
- 采用源码编译安装(非二进制分发),字符集、ABI 与运行时 locale 与业务环境一致;
- 自动切换国内镜像源与上海时区,默认中文环境
zh_CN.GBK;- 实测发现的问题已在脚本内修正,支持版本与架构均在 CI 中逐组合验证(含 arm64 上的 CentOS 7)。
脚本仓库:cloud-native-deploy
一、核心能力
| 能力 | 说明 |
|---|---|
| 中文环境可指定 | 全局默认 zh_CN.GBK,可用 --locale 覆盖为 zh_CN.UTF-8 等,覆盖新终端、已开终端、sudo、cron、systemd 所有会话 |
| 统一上海时区 | 自动切换为 Asia/Shanghai,缺失 tzdata 时自动补装 |
| 编译并行 | 按 nproc-1 并行 make(逻辑核为 1 时取 1),高版本 gcc 下的 innodb_plugin 并行竞态在各发行版分支上实测均未复现 |
| 日志不乱码 | 脚本自身日志始终以启动时终端编码输出,仅 GBK 敏感命令在 GBK 子环境中执行 |
| 开机自启 | 按 PID 1 判定 systemd(command -v systemctl 且 /run/systemd/system 存在),命中走 systemctl enable,否则回退写 /etc/rc.local(缺失时自动创建并赋可执行权限) |
| 幂等可重跑 | 换源、打补丁、写 locale 均为幂等操作,install / all 可安全重复执行 |
二、支持的发行版与架构
两套脚本按「发行系 → 变体 → 主版本白名单」三级精确分流,白名单外的组合(如 CentOS 9、CentOS Stream 7、AlmaLinux 7)直接报错退出,各分支互不复用。
| 发行版 | 脚本 | 软件源 | zh_CN.GBK 来源 |
|---|---|---|---|
| Debian 12 / 13 | debian/ | NJU 镜像(DEB822) | locale-gen 生成 |
| Ubuntu 22.04 / 24.04 | debian/ | NJU 镜像(sources.list / DEB822) | locales-all 预编译 |
| CentOS 6 / 7 | redhat/ | NJU centos-vault 6.10 / 7.9.2009(7 的 aarch64 走 altarch/7.9.2009) | localedef 现场生成 |
| CentOS 8 | redhat/ | NJU centos-vault 8.5.2111 | glibc-langpack-zh 预编译 |
| CentOS Stream 8 | redhat/ | NJU centos-vault 8-stream | glibc-langpack-zh 预编译 |
| CentOS Stream 9 / 10 | redhat/ | NJU centos-stream + CRB | glibc-langpack-zh 预编译 |
| AlmaLinux / Rocky 8 / 9 / 10 | redhat/ | NJU 镜像(9/10 需 CRB) | glibc-langpack-zh 预编译 |
| RHEL 8 / 9 / 10 | redhat/ | 保持系统自带订阅源 | glibc-langpack-zh 预编译 |
版本白名单:CentOS 传统版仅 6/7/8,CentOS Stream 仅 8/9/10,AlmaLinux / Rocky / RHEL 仅 8/9/10。
几点说明:
- Debian 12/13 与 Ubuntu 22.04/24.04 共用单一脚本
debian/deploy_mysql.sh,运行时按/etc/os-release的ID+VERSION_ID分流(Ubuntu 的/etc/debian_version是 glibc 基础版本名,不能用于判定)。已移除的 Ubuntu 26.04 不再支持。 - RHEL 本体内容受 Red Hat 订阅保护,公网镜像站不提供,脚本不改写其源。
- 架构:
x86_64与aarch64/arm64同源、同编译参数,脚本按uname -m分流——aarch64 额外应用架构识别补丁(CentOS 7 还改走 AltArch 源路径),无需传任何架构参数;两种架构都在 CI 里逐版本实测。
各版本编译差异速览(gcc / 依赖 / CRB)
| 版本 | gcc | 编译依赖差异 | CRB 仓库 |
|---|---|---|---|
| Debian 12 | 12 | 用 libncurses5-dev | 不需 |
| Debian 13 | 14 | libncurses5-dev 已移除,改 libncurses-dev | 不需 |
| Ubuntu 22.04 / 24.04 | 11 / 13 | libncurses-dev,并补 diffutils(make do_abi_check 需要 diff)与 pkg-config | 不需 |
| CentOS 6 / 7 | 4.4.7 / 4.8.5 | 无 langpack 包,glibc-common 自带 charmaps 源码;procps / procps-ng;yum 3.x 不支持 --allowerasing | 无此概念 |
| CentOS 8 / AlmaLinux 8 / Rocky 8 | 8.5 | libtirpc-devel 在 BaseOS | 不需 |
| CentOS Stream 9 / 10、AlmaLinux / Rocky 9 / 10 | 11 / 14 | libtirpc-devel 仅由 CRB 提供;精简镜像预装 curl-minimal 与 curl 冲突,需 --allowerasing | 脚本自动开启 |
全系列
CFLAGS/CXXFLAGS统一为-O3 -fPIC -DNDEBUG,configure参数集固定不变,窄化赋值 / yassl 头文件命名空间 / 缺失类型等问题一律由统一构建补丁修掉。
三、前置条件
- root 权限运行(否则脚本直接报错退出);
- 系统可访问网络,脚本会自动配置国内镜像源(apt 切 NJU,yum 按发行系分流切 NJU 或 centos-vault);
- 发行版需在白名单内(见上一章),其余组合直接报错退出;上表所有组合在两种架构上均已通过 CI 实测;
- 非默认字符环境(如
zh_CN.UTF-8)需系统能提供对应 locale 数据,否则localedef现场生成,仍失败则报错退出。
四、快速开始
需 root 权限,all 为全流程:环境准备 → 编译安装 → 初始化启动 → 授权建库。
方式一(推荐,便于审计脚本):先下载脚本再本地执行。两种发行系仅目录名不同。
Debian下载执行:
curl -sL https://cnb.cool/osaaki/cloud-native-deploy/-/git/raw/main/debian/deploy_mysql.sh -o deploy_mysql.sh
chmod +x deploy_mysql.sh
./deploy_mysql.sh all
Redhat下载执行:
curl -sL https://cnb.cool/osaaki/cloud-native-deploy/-/git/raw/main/redhat/deploy_mysql.sh -o deploy_mysql.sh
chmod +x deploy_mysql.sh
./deploy_mysql.sh all
Debian管道一键执行:
curl -sL https://cnb.cool/osaaki/cloud-native-deploy/-/git/raw/main/debian/deploy_mysql.sh | bash -s -- all
Redhat管道一键执行:
curl -sL https://cnb.cool/osaaki/cloud-native-deploy/-/git/raw/main/redhat/deploy_mysql.sh | bash -s -- all
自定义账号密码与字符环境:--locale 默认 zh_CN.GBK,下例用 UTF-8 演示覆盖写法。
# 已下载脚本
bash deploy_mysql.sh all --db-user gameuser --db-pass 'newpass' --locale zh_CN.UTF-8
# 管道执行
curl -sL https://cnb.cool/osaaki/cloud-native-deploy/-/git/raw/main/redhat/deploy_mysql.sh | bash -s --all --db-user gameuser --db-pass 'newpass' --locale zh_CN.UTF-8
# 环境变量方式
GB_LOCALE=zh_CN.UTF-8 ./deploy_mysql.sh all
五、命令与参数
5.1 子命令
| 命令 | 说明 |
|---|---|
all | 全流程:环境准备 → 编译安装 → 初始化启动 → 授权建库 |
install | 仅环境准备 + 编译安装 |
init | 仅初始化 + 启动 + 授权 + 建库 |
import <dir> | 导入指定目录下各业务库 *.sql |
backup <dir> | 备份 FLServerDB / ZtGameDB 到指定目录 |
./deploy_mysql.sh import /path/to/sql
./deploy_mysql.sh backup /path/to/backup
5.2 参数
| 参数 | 简写 | 说明 | 默认值 |
|---|---|---|---|
--db-user <name> | -u | 业务库账号 | ztgame |
--db-pass <pass> | -p | 业务库密码 | 123456 |
--locale <name> | -L | 全局字符环境 | zh_CN.GBK |
-- | — | 分隔符,其后为子命令(配合 curl | bash -s -- 使用) | — |
5.3 优先级与解析规则
- 选项与子命令顺序无关(
all --locale zh_CN.UTF-8与--locale zh_CN.UTF-8 all等价),也支持--locale=zh_CN.UTF-8写法。原先「遇到第一个非选项即跳出」的解析方式会让bash -s -- all --db-user xxx里的参数被静默忽略,现已改为逐项扫描。 - 账号密码优先级:命令行参数 > 环境变量
DB_USER/DB_PASS> 内置默认值;仅运行期内存使用,不写入/etc/profile、/etc/environment等全局文件。 - 字符环境优先级:命令行
--locale> 环境变量GB_LOCALE> 默认zh_CN.GBK。
六、部署流程
执行 all 时,脚本依次完成以下四步。
6.1 环境准备
- Debian 系:切 NJU apt 镜像后安装编译依赖(gcc、make、
libncurses*-dev、libtirpc-dev、locales-all、tzdata 等),按发行版与主版本分流包名;统一关闭 debconf 交互前端(DEBIAN_FRONTEND=noninteractive),避免tzdata在无 TTY 环境弹框挂起; - RedHat 系:检测发行版与主版本,按发行系换源并安装对应依赖,9/10 先自动开启 CRB;
- 按要求可选
--locale切换全局字符环境(默认zh_CN.GBK),并统一时区为Asia/Shanghai。
6.2 编译安装
- 从 CNB 发行版页面下载 MySQL 5.1.73 源码(
wget -c断点续传); - 自动应用内嵌构建补丁(aarch64 机器额外打架构识别补丁);
CFLAGS/CXXFLAGS固定-O3 -fPIC -DNDEBUG,不按发行版拼接;make -j$(nproc-1)并行编译,make install安装到/usr/local/mysql。
6.3 初始化与启动
- 创建带家目录的
mysql系统用户(避免su - mysql告警); - 配置
/etc/my.cnf(含datadir、skip-name-resolve,权限644,避免 world-writable 导致配置被忽略); - 通过
mysqld_safe启动并轮询等待就绪。
6.4 授权与建库
- 为业务库账号在
localhost、127.0.0.1、%三个来源授予ALL PRIVILEGES; - 创建 Zebra 业务库清单:
FLServerDB、ZtGameDB、LoginServer、roleChangeServer、roleregServer、unify00、zt; - 配置开机自启:按 PID 1 判定 systemd(
command -v systemctl且/run/systemd/system存在),命中走systemctl enable(daemon-reload/enable均加|| true,配置失败不中断部署),否则回退写/etc/rc.local。
七、字符环境(locale)
7.1 指定方式
全局字符环境默认 zh_CN.GBK(GB2312 超集),可用 --locale / -L / 环境变量 GB_LOCALE 覆盖,优先级 命令行 > 环境变量 > 默认值,选项与子命令顺序无关。
7.2 名称规范化
名称按「语言[_国家].编码」解析并规范化:
| 输入 | 规范化结果 | 说明 |
|---|---|---|
zh_CN.UTF-8 / zh_CN.utf8 / zh_cn.utf-8 | zh_CN.UTF-8 | 语言小写 + 国家大写 + 编码大写 |
zh_CN.GBK / zh_cn.gbk | zh_CN.GBK | GBK 系 |
zh_CN.GB2312 / zh_CN.GB18030 | 原样规范化 | 其他中文编码 |
en_US.UTF-8 / C.UTF-8 | 原样规范化 | 非中文环境(C / POSIX 无国家段) |
zh_CN / en_US | zh_CN.UTF-8 / en_US.UTF-8 | 只给语言/国家时补 UTF-8 |
@modifier(如sr_RS@latin)会被去掉、按基础名处理;只剩语言段(如zh)无法确定编码,直接报错退出。
7.3 处理链路与失败行为
- 查
locale -a(名称比对忽略大小写与分隔符写法); - 缺失则
localedef -i <语言_国家> -f <字符映射> <名称>现场生成; - 仍不可用时:UTF-8 系回退系统预置的
C.UTF-8并告警(部分发行版不提供 UTF-8 charmap,生成zh_CN.UTF-8必然失败,但C.UTF-8同为 UTF-8,不影响中文存取);其他编码直接报错退出,不静默回落到 GBK,避免「以为切了 UTF-8、实际还是 GBK」拖到业务写入才发现; - 用真实
date试跑确认输出正常,再写入全局位置。
7.4 全局写入
写入 /etc/locale.conf、/etc/default/locale、/etc/profile、/etc/bash.bashrc(或 /etc/bashrc)、/etc/environment,SSH 新终端、已开终端、sudo、cron、systemd 服务均可读取。
- 全局只设
LANG/LANGUAGE,不 exportLC_ALL(会锁死所有类别、排查困难); LANGUAGE=zh_CN:zh只在中文系 locale 下写入;- 写入幂等,重复执行按当前
--locale覆盖。
--locale只影响全局字符环境,不影响 MySQL 编译与连接参数:服务端存储字符集仍是--with-charset=gbk,客户端连接字符集由 MySQL 在连接时处理。
八、部署后验证
date # 应输出中文日期(GBK locale 生效),而非 202686:19:24 这类畸形
locale # LANG 应为所选 locale,默认 zh_CN.GBK
date +"%Z %z" # 应为 CST +0800
mysqladmin ping # MySQL 已运行
mysql -u<账号> -p<密码>
注意:使用默认 GBK 字符环境时,当前终端(UTF-8)可能需要将 SSH 连接编码改为 GBK 后重新连接,避免后续命令/日志乱码;部署时传入 UTF-8 系
--locale则无需改动终端。
九、实现细节
9.1 软件源与源码包
apt 源统一切 NJU 镜像:换源前官方源(deb.debian.org / archive.ubuntu.com / security.ubuntu.com)国内访问慢,会拖垮部署与 CI 耗时。Debian 12/13 改写 DEB822 debian.sources,只替换主机名、保留 /debian 与 /debian-security 路径差异;Ubuntu 22.04 重写传统 sources.list,24.04 重写 DEB822 ubuntu.sources。仓库路径按架构选择:x86 用 /ubuntu,aarch64 等用 /ubuntu-ports(对应官方 ports.ubuntu.com),写错会在 apt-get update 阶段立刻报错而不是静默带病继续。
yum 源按发行系分流、一律就地改写官方 repo:不新建也不删除 repo 文件——这些文件由 centos-release / centos-linux-repos / centos-stream-repos 等包管理,另行新建一份会在 yum update 时被覆盖回官方源(失效的 mirrorlist 复活),导致第二次换源失效。sed 本身幂等,重复执行结果完全一致。
各发行系 yum 换源细则
- CentOS 6/7/8 与 AlmaLinux / Rocky 的
sed命令与docker/Dockerfile.redhat逐条一致,仅把镜像地址换成 NJU(Dockerfile 用腾讯云镜像)。官方 repo 里$releasever一律保留,不写死版本号; - CentOS 7 的 aarch64 是 AltArch 镜像:repo 里引用的是
/altarch/$releasever,与 x86_64 的/centos/$releasever不是同一路径,x86_64 那两条正则一条都命中不了(等于没换源,yum仍打已下线的mirrorlist)。因此按uname -m再分流一次,单独一条 AltArch 正则归档到 NJUcentos-vault/altarch/7.9.2009; - CentOS 6/7 与 CentOS 8 / Stream 8:注释掉已下线的
mirrorlist,baseurl主干改写为 NJU centos-vault 归档目录(6.10/7.9.2009/8.5.2111/8-stream); - CentOS Stream 9/10:官方
centos.repo/centos-addons.repo只有metalink没有baseurl,且路径根为centos-stream/$releasever-stream/,因此按metalink的 repo 名逐条映射为 NJUbaseurl(原metalink行注释保留,便于回溯),extras-common属 SIG、在SIGs/下; - RHEL 本体保持系统自带订阅源不变。
MySQL 源码包固定走 CNB 发行版页面:https://cnb.cool/osaaki/cloud-native-deploy/-/releases/download/v5.7.3/mysql-5.1.73.tar.gz。NJU 只镜像 apt/yum 仓库、不提供 MySQL 5.1 源码 tarball(实测 404),放 CNB 发行版更稳、与脚本同源,并附带 wget -c 断点续传。
9.2 构建补丁
patches/ 下有两个补丁,来源均为 osaaki/mysql,已内嵌进两份部署脚本,无需任何额外参数:
| 补丁 | 适用范围 | 应用条件 |
|---|---|---|
mysql-5.1.73-build.patch | 新一代编译器 / glibc 构建兼容 | 所有发行版、所有架构,无条件应用 |
mysql-5.1.73-aarch64.patch | aarch64(ARM64)架构识别 | 仅 uname -m 为 aarch64 / arm64 时应用 |
构建兼容补丁修改点:extra/yassl/include/lock.hpp 的 <pthread.h> 移到全局作用域(否则系统头文件 typedef 被包进 namespace yaSSL,后续全局引入 <sys/stat.h> 报错);vio/viosocket.c 补 <netinet/tcp.h>(TCP_NODELAY);client/mysql.cc 与 instance-manager/{protocol,instance_map}.cc 去掉窄化赋值(适配 gcc 13+ / 14+)。
aarch64 补丁只改两个 autoconf 辅助脚本:config.guess 补 aarch64 / aarch64_be Linux 分支,config.sub 补同名 CPU 并把 arm64 / aarch64le 规范化。原因是 MySQL 5.1.73 自带的这两个脚本时间戳为 2008-11-15,早于 aarch64 出现,ARM64 上 configure 会直接报 cannot guess build type; you must specify one 退出;其余架构相关代码(InnoDB 同步原语、korr 宏、fast mutex、yaSSL 等)都会走通用 C 分支,无需其它补丁。
应用前对每个补丁各做一次反向预检(patch -p1 -R --dry-run),已打过则跳过,重复执行 install / all 不会失败(「全打 / 全未打 / 部分打」三种状态都能正确处理);两个补丁修改的文件不重叠,x86_64 机器不打 aarch64 补丁。
十、CI 与维护
10.1 部署测试矩阵
部署测试覆盖白名单内每个发行版 × amd64 / arm64 两种架构,各自在干净容器里跑一遍 all 全流程(换源 → 装依赖 → 编译 → 初始化 → 启动 → 授权建库)。arm64 上的 CentOS 7 也在矩阵内::centos7 制品已是 amd64 + arm64 双架构 manifest,AltArch 换源由真实 arm64 runner 验证。
10.2 测试镜像
docker/ 下的 Dockerfile 构建部署测试环境,模拟真实干净云镜像(仅预装基础命令,不含编译工具链,由实测脚本现场安装):
| 文件 | 默认基础镜像 | 说明 |
|---|---|---|
docker/Dockerfile.debian | debian:12 | Debian 12/13 与 Ubuntu 22.04/24.04 共用,按 /etc/os-release 分流 |
docker/Dockerfile.redhat | almalinux:8 | RedHat 系共用,按 ID + NAME 是否含 Stream + 主版本号分流换源 |
同一镜像名即多架构 manifest,无需按架构区分镜像名。除 docker.cnb.cool/osaaki/cloud-native-deploy:centos6 为单架构外,其余标签均为 amd64 + arm64:
| 制品标签 | 基础镜像 | 制品架构 | 部署测试 |
|---|---|---|---|
docker.cnb.cool/osaaki/cloud-native-deploy:latest | debian:13 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:debian12 | debian:12 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:ubuntu2204 | ubuntu:22.04 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:ubuntu2404 | ubuntu:24.04 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:almalinux8 | almalinux:8 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:almalinux9 | almalinux:9 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:almalinux10 | almalinux:10 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:stream8 | quay.io/centos/centos:stream8 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:stream9 | quay.io/centos/centos:stream9 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:stream10 | quay.io/centos/centos:stream10 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:centos7 | centos:7 | amd64 + arm64 | amd64 + arm64 |
docker.cnb.cool/osaaki/cloud-native-deploy:centos6 | centos:6 | 仅 amd64 | 仅 amd64 |
docker.cnb.cool/osaaki/cloud-native-deploy:centos6单架构是唯一例外:centos:6只有 amd64 镜像,且已 EOL。其余版本(含同为 vault 归档源的 CentOS 7)都是双架构。
10.3 流水线
.cnb.yml 通过 include 引入 pipeline-templates 中的共享模板,本地只保留 VSCode 与 PR 预检:
| 模板 | 触发 | 作用 |
|---|---|---|
base-templates.yml | dev / main / master / develop 分支 push | 每个发行版在 amd64 / arm64 原生机器上分别构建并推送架构专属 tag,再由 cnbcool/manifest 合成多架构 manifest,最后清理临时 tag |
Test-deploy-mysql.yml | main 分支 push | 按上面的矩阵,每个发行版在两台架构 runner 上各跑一遍 deploy_mysql.sh all |
codewiki-templates.yml | tag push | 生成 Code Wiki |
部署测试在容器内以当前分支的脚本执行,测的就是本次改动:
curl -sL https://cnb.cool/osaaki/cloud-native-deploy/-/git/raw/${CNB_BRANCH}/${SCRIPT_DIR}/deploy_mysql.sh | bash -s -- all
Debian 系列 SCRIPT_DIR=debian,RedHat 系 SCRIPT_DIR=redhat;${CNB_BRANCH} 取自当前分支,因此改动的脚本会先被真机验证,而不是只测已合入的 main。
10.4 PR 校验与本地构建
.cnb.yml 内联的 pull_request 任务只做基础镜像构建校验(docker build + ifModify 按 Dockerfile 触发),不登录、不推送制品库,避免不可信事件拿到写权限;制品库推送只发生在 base-templates.yml 的分支 push 流水线中。
本地手动构建(架构随构建机,arm64 机器上即可复现 AltArch 换源路径):
docker build -f docker/Dockerfile.redhat --build-arg BASE_IMAGE=centos:7 -t test-centos7 .
docker build -f docker/Dockerfile.debian --build-arg BASE_IMAGE=ubuntu:24.04 -t test-ubuntu2404 .
十二、安全说明
- 账号与密码仅在部署脚本运行期间内存中使用,不会以明文写入任何全局文件;
- 部署完成后请妥善记录你设置的账号密码;如遗忘可
mysql -uroot登录后查询mysql.user重置。