跳到主要内容

MySQL 5.1.73 一键部署中文游戏库环境

Zebra 游戏服务器数据库环境的开箱即用方案,一条命令完成 环境准备 → 源码编译 → 初始化启动 → 授权建库

  • 采用源码编译安装(非二进制分发),字符集、ABI 与运行时 locale 与业务环境一致;
  • 自动切换国内镜像源与上海时区,默认中文环境 zh_CN.GBK
  • 实测发现的问题已在脚本内修正,支持版本与架构均在 CI 中逐组合验证(含 arm64 上的 CentOS 7)。

脚本仓库:cloud-native-deploy

push 构建状态 Release 准备耗时 流水线配置


一、核心能力

能力说明
中文环境可指定全局默认 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 / 13debian/NJU 镜像(DEB822)locale-gen 生成
Ubuntu 22.04 / 24.04debian/NJU 镜像(sources.list / DEB822)locales-all 预编译
CentOS 6 / 7redhat/NJU centos-vault 6.10 / 7.9.2009(7 的 aarch64 走 altarch/7.9.2009localedef 现场生成
CentOS 8redhat/NJU centos-vault 8.5.2111glibc-langpack-zh 预编译
CentOS Stream 8redhat/NJU centos-vault 8-streamglibc-langpack-zh 预编译
CentOS Stream 9 / 10redhat/NJU centos-stream + CRBglibc-langpack-zh 预编译
AlmaLinux / Rocky 8 / 9 / 10redhat/NJU 镜像(9/10 需 CRB)glibc-langpack-zh 预编译
RHEL 8 / 9 / 10redhat/保持系统自带订阅源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-releaseID + VERSION_ID 分流(Ubuntu 的 /etc/debian_version 是 glibc 基础版本名,不能用于判定)。已移除的 Ubuntu 26.04 不再支持。
  • RHEL 本体内容受 Red Hat 订阅保护,公网镜像站不提供,脚本不改写其源。
  • 架构:x86_64aarch64 / arm64 同源、同编译参数,脚本按 uname -m 分流——aarch64 额外应用架构识别补丁(CentOS 7 还改走 AltArch 源路径),无需传任何架构参数;两种架构都在 CI 里逐版本实测。
各版本编译差异速览(gcc / 依赖 / CRB)
版本gcc编译依赖差异CRB 仓库
Debian 1212libncurses5-dev不需
Debian 1314libncurses5-dev 已移除,改 libncurses-dev不需
Ubuntu 22.04 / 24.0411 / 13libncurses-dev,并补 diffutilsmake do_abi_check 需要 diff)与 pkg-config不需
CentOS 6 / 74.4.7 / 4.8.5无 langpack 包,glibc-common 自带 charmaps 源码;procps / procps-ng;yum 3.x 不支持 --allowerasing无此概念
CentOS 8 / AlmaLinux 8 / Rocky 88.5libtirpc-devel 在 BaseOS不需
CentOS Stream 9 / 10、AlmaLinux / Rocky 9 / 1011 / 14libtirpc-devel 仅由 CRB 提供;精简镜像预装 curl-minimalcurl 冲突,需 --allowerasing脚本自动开启

全系列 CFLAGS / CXXFLAGS 统一为 -O3 -fPIC -DNDEBUGconfigure 参数集固定不变,窄化赋值 / 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(含 datadirskip-name-resolve,权限 644,避免 world-writable 导致配置被忽略);
  • 通过 mysqld_safe 启动并轮询等待就绪。

6.4 授权与建库

  • 为业务库账号在 localhost127.0.0.1% 三个来源授予 ALL PRIVILEGES
  • 创建 Zebra 业务库清单:FLServerDBZtGameDBLoginServerroleChangeServerroleregServerunify00zt
  • 配置开机自启:按 PID 1 判定 systemd(command -v systemctl/run/systemd/system 存在),命中走 systemctl enabledaemon-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-8zh_CN.UTF-8语言小写 + 国家大写 + 编码大写
zh_CN.GBK / zh_cn.gbkzh_CN.GBKGBK 系
zh_CN.GB2312 / zh_CN.GB18030原样规范化其他中文编码
en_US.UTF-8 / C.UTF-8原样规范化非中文环境(C / POSIX 无国家段)
zh_CN / en_USzh_CN.UTF-8 / en_US.UTF-8只给语言/国家时补 UTF-8

@modifier(如 sr_RS@latin)会被去掉、按基础名处理;只剩语言段(如 zh)无法确定编码,直接报错退出。

7.3 处理链路与失败行为

  1. locale -a(名称比对忽略大小写与分隔符写法);
  2. 缺失则 localedef -i <语言_国家> -f <字符映射> <名称> 现场生成;
  3. 仍不可用时:UTF-8 系回退系统预置的 C.UTF-8 并告警(部分发行版不提供 UTF-8 charmap,生成 zh_CN.UTF-8 必然失败,但 C.UTF-8 同为 UTF-8,不影响中文存取);其他编码直接报错退出,不静默回落到 GBK,避免「以为切了 UTF-8、实际还是 GBK」拖到业务写入才发现;
  4. 用真实 date 试跑确认输出正常,再写入全局位置。

7.4 全局写入

写入 /etc/locale.conf/etc/default/locale/etc/profile/etc/bash.bashrc(或 /etc/bashrc)、/etc/environment,SSH 新终端、已开终端、sudo、cron、systemd 服务均可读取。

  • 全局只设 LANG / LANGUAGE不 export LC_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 正则归档到 NJU centos-vault/altarch/7.9.2009
  • CentOS 6/7 与 CentOS 8 / Stream 8:注释掉已下线的 mirrorlistbaseurl 主干改写为 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 名逐条映射为 NJU baseurl(原 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.patchaarch64(ARM64)架构识别uname -maarch64 / arm64 时应用

构建兼容补丁修改点extra/yassl/include/lock.hpp<pthread.h> 移到全局作用域(否则系统头文件 typedef 被包进 namespace yaSSL,后续全局引入 <sys/stat.h> 报错);vio/viosocket.c<netinet/tcp.h>TCP_NODELAY);client/mysql.ccinstance-manager/{protocol,instance_map}.cc 去掉窄化赋值(适配 gcc 13+ / 14+)。

aarch64 补丁只改两个 autoconf 辅助脚本:config.guessaarch64 / 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.debiandebian:12Debian 12/13 与 Ubuntu 22.04/24.04 共用,按 /etc/os-release 分流
docker/Dockerfile.redhatalmalinux:8RedHat 系共用,按 ID + NAME 是否含 Stream + 主版本号分流换源

同一镜像名即多架构 manifest,无需按架构区分镜像名。除 docker.cnb.cool/osaaki/cloud-native-deploy:centos6 为单架构外,其余标签均为 amd64 + arm64

制品标签基础镜像制品架构部署测试
docker.cnb.cool/osaaki/cloud-native-deploy:latestdebian:13amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:debian12debian:12amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:ubuntu2204ubuntu:22.04amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:ubuntu2404ubuntu:24.04amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:almalinux8almalinux:8amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:almalinux9almalinux:9amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:almalinux10almalinux:10amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:stream8quay.io/centos/centos:stream8amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:stream9quay.io/centos/centos:stream9amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:stream10quay.io/centos/centos:stream10amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:centos7centos:7amd64 + arm64amd64 + arm64
docker.cnb.cool/osaaki/cloud-native-deploy:centos6centos: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.ymldev / main / master / develop 分支 push每个发行版在 amd64 / arm64 原生机器上分别构建并推送架构专属 tag,再由 cnbcool/manifest 合成多架构 manifest,最后清理临时 tag
Test-deploy-mysql.ymlmain 分支 push按上面的矩阵,每个发行版在两台架构 runner 上各跑一遍 deploy_mysql.sh all
codewiki-templates.ymltag 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 重置。