数据库灾备【免费下载链接】databasusPostgreSQL backup tool with Point-In-Time-Recovery and restore verification项目地址https://gitcode.com/gh_mirrors/po/databasus点击查看免费下载Databasus 把 PostgreSQL、MySQL、MariaDB、MongoDB 四个引擎的客户端二进制直接提交在仓库的assets/tools/目录下由 Go 后端在运行时按GOOS/GOARCH解析具体路径。读完本篇你将理解这套捆绑树的目录布局与发布线身份release line identity设计、启动时逐个执行--version的校验机制、各引擎捆绑版本的来源与刷新流程以及二进制对运行镜像共享库的依赖边界并能在本地安全地刷新或新增一个客户端版本。为什么把二进制提交进仓库而不是在 Dockerfile 里 apt 安装Databasus 备份流程依赖每个引擎每个受支持主版本的官方客户端PostgreSQL 的pg_dump/pg_restore/psql17 还有pg_basebackup等MySQL 与 MariaDB 的mysqldump/mysqlMariaDB 侧为mariadb-dump/mariadbMongoDB 的mongodump/mongorestore。项目最初的方案是在构建镜像时从 PGDG、MySQL、MariaDB、MongoDB 各自的 apt 仓库逐个apt-get install。当支持矩阵扩大后这条路径出现了 CI 耗时超 30 分钟且频繁因镜像源超时、GPG 密钥轮换等外部原因失败Dockerfile 里堆满仓库配置、密钥导入、多主版本安装等复杂度。ADR-0005 记录的决策是把实际用到的客户端二进制一次性下载后按引擎 主版本 架构提交到assets/下Dockerfile 只做COPY。收益是构建不再依赖任何第三方包仓库可从干净 checkout 离线可复现构建、发进镜像的字节就是仓库里可 review 的字节、升级客户端是一个可见的二进制替换提交。assets/tools/AGENTS.md也由此立下第一条规则仓库里的字节就是发版的字节因此二进制必须在运行时环境中验证而不是在开发机上验证。目录布局与架构键整棵树的形状在两种架构下完全一致每个子树一个 archassets/tools/arch/ postgresql/postgresql-{12,13,14,15,16,17,18}/bin/ pg_dump, pg_restore, psql mysql/mysql-{5.7,8.0,8.4,9,26}/bin/ mysql, mysqldump mysql/mysql-26/lib/private/ libssl.so.3, libcrypto.so.3 mariadb/mariadb-{10.6,12.3,13.0}/bin/ mariadb, mariadb-dump mongodb/bin/ mongodump, mongorestorearch的取值由 backend/internal/util/tools/paths.go 中的archAssetsKey()依据runtime.GOOSruntime.GOARCH决定不支持的组合会直接 panic没有客户端二进制后端无法工作GOOS / GOARCHkey体积linux/amd64x64~157 MBlinux/arm64arm~146 MB后端解析单个二进制的完整路径规则是assets/tools/arch/engine/engine-bundle/bin/command。根目录不是写死的AssetsToolsDir从当前工作目录逐级向上查找assets/tools/arch-key目录Docker 里 cwd 是/app解析到/app/assets/tools/arch-key/找不到则 panic见 paths.go。版本标识是发布线不是补丁号理解这棵树的关键概念是目录名是一个发布线release line不是一个补丁号。mysql-26只装一个 26.x 的构建但要服务所有 MySQL 26.x 服务器mariadb-13.0装一个 13.0.x 构建服务所有 MariaDB 13.x 服务器。目录名是我们自己贴的标签构建捆绑时没有任何东西能强制它与实际字节一致——兜底是启动校验后端会运行每个二进制的 version flag拒绝任何报告版本不属于本目录所登记发布线的捆绑使名字和字节无法悄悄漂移。版本比较的实现集中在 releaseline.goparseReleaseLine把26、10.6这类标识拆成数字分量compareReleaseLines按数字逐位比较保证后加入的新标识自动排到正确位置不需要维护任何查找表README 明确告诫不要再去找版本表来扩展——已经没有遗留的了isVersionOnReleaseLine判断客户端报告的版本如10.6.28是否属于某条发布线客户端可以比线号晚一个补丁但绝不能来自另一条线。这个设计的动机来自一个真实事故捆绑内二进制版本不一致曾让 issue #725pg_dump 18.1 悄悄输出错误的 sequence 值长期未被发现。因此刷新时的铁律是同一条发布线内所有二进制必须来自同一个上游构建。各引擎的捆绑版本明细PostgreSQL两个架构捆绑的 minor 完全相同来源是 Debian bookworm 的 PGDGapt.postgresql.org的postgresql-client-majormajorminorsource package1212.2212.22-3.pgdg121finalEOL1313.2313.23-1.pgdg121finalEOL1414.2314.23-1.pgdg1211515.1815.18-1.pgdg1211616.1416.14-1.pgdg1211717.1017.10-1.pgdg1211818.418.4-1.pgdg12112 和 13 已过上游 EOL表中的 minor 就是该主版本永远存在的最后一个小版本。PostgreSQL 还是校验的致命层从 postgresql.go 可以看到12–16 要求pg_dump与psql而 17 额外要求pg_basebackup、pg_receivewal、pg_combinebackuppg_basebackup --incremental与pg_combinebackup是 PG 17 才有的能力服务于 Databasus 的 PG 17 物理备份链路。common.go 中只有 PostgreSQL 捆绑损坏会让进程退出其他引擎缺失则降级为警告并禁用该版本支持——一个不备份任何 MySQL 数据库的实例没有理由因为缺mysqldump而拒绝启动。MySQL两个架构的补丁号相同来源是上游 glibc2.28 静态链接二进制 tarballURL 模板形如https://cdn.mysql.com/Downloads/MySQL-dir/mysql-patch-linux-glibc2.28-{x86_64,aarch64}.tar.xz其中dir在 9 及以前按发布线命名如MySQL-9.026 起按major.minor如MySQL-26.7bundlepatchnotesmysql-5.75.7.44该线最后一个补丁仅 amd64mysql-8.08.0.46mysql-8.48.4.11长期支持线mysql-99.7.2服务所有 9.x 服务器mysql-2626.7.0日历式命名服务所有 26.x 服务器自带 OpenSSLMySQL 是每条发布线一个专属客户端的形态mysql.go 中版本标识直接等于捆绑目录名后缀。mysql-5.7只有 amd64——上游从未为 aarch64 构建过 5.7 客户端所以arm/mysql/mysql-5.7/是故意不存在的在 arm64 部署上连 5.7 服务器会在连接测试阶段被拒绝。版本解析要注意 5.7 与 8.0 的--version输出形态不同8.0 是mysqldump Ver 8.0.46 for ...而 5.7 用工具自己的版本号并把服务器版本放在Distrib后面mysqldump Ver 10.13 Distrib 5.7.44, for ...所以 mysql.go 维护了两条正则Distrib优先Ver兜底。MariaDB补丁号两个架构相同由 tools/refresh-mariadb-bundle.sh 从厂商官方包仓库解包得到bundlepatchsource repository and suitemariadb-10.610.6.28repo/10.6/ubuntuubu2204mariadb-12.312.3.3repo/12.3/debiandeb12bookwormmariadb-13.013.0.2repo/13.0/ubuntuubu2204MariaDB 与 MySQL 的形态不同它维护服务器版本标识和客户端版本两个值因为一个客户端要服务多条服务器发布线。三层客户端的映射在 mariadb.go 的GetMariadbClientVersionForServer中10.6legacy服务 MariaDB 5.5 和 10.1。存在它的原因是新版客户端会查询generation_expression列而该列是 10.2 才加入information_schema.columns的。10.6 包里的真实程序仍叫mysql和mysqldump刷新脚本会把它们以mariadb/mariadb-dump的名字装进捆绑目录12.3modern按设计服务 10.2 到 12.x 的所有线13.0服务 13 线——12.3 客户端比 13 线更老覆盖不了。刷新脚本的用法是tools/refresh-mariadb-bundle.sh bundle archbundle 为10.6 | 12.3 | 13.0arch 为amd64 | arm64。它的几个实现细节值得注意包版本在脚本内逐捆绑写死如10.6.28maria~ubu2204而不是取该线最新补丁这样相隔一周刷新的两个架构拿到的是同一构建.deb 只解包不安装dpkg-deb -x无 dpkg 时回退artar因此在 amd64 主机上构建 arm64 树无需模拟执行最后用install -m 0755落盘并打印 sha256。MongoDB两个架构统一捆绑 MongoDB Database Tools 100.16.1向后兼容所有受支持服务器版本4.2 – 8.2MongoDB 4.0 不受支持wire version 7需要更老的 mongodump。MongoDB 是唯一不按发布线命名的捆绑——mongodb.go 中它没有版本线可对齐校验只要求二进制能启动。启动校验每个二进制都要亲自跑一遍--version文件存在且带可执行位只说明目录没摆错说明不了缺失共享库——而这恰恰是新捆绑最容易引入的故障。因此 common.go 的runClients会把每个必需命令以--version实际启动10 秒超时超时视同缺失用各引擎自己的解析器读出版本号再断言其属于目录所登记的发布线。三个细节结果按 bin 目录缓存executionVerdicts容器健康探测每 30 秒一次若每次探测都启动全部二进制高负载主机可能误报不健康所以每个进程只跑一次解析器按引擎分开PostgreSQL 匹配(PostgreSQL) 17.10MariaDB 用正则(\d[\d.]*)-MariaDBmariadb-dump --version会打印两个数字-MariaDB前面那个才是服务器线另一个是协议版本MySQL 匹配Distrib/Ver见 mariadb.goCheckAllClientTools同时服务于启动config与健康检查healthcheck纯函数、不记日志不退出由调用方决定致命还是告警。二进制如何进入镜像根目录的 Dockerfile 通过 buildkit bind mount 把assets/tools挂进来按TARGETARCH只拷贝匹配的架构子树到/app/assets/tools/然后对 postgresql/mysql/mariadb/mongodb 四棵子树的bin/*统一chmod x。这也是 AGENTS 清单强调确认可执行位已记录在 git 索引的原因git ls-files -s必须显示100755——以100644提交的二进制不会在构建时失败而是在运行时失败。运行时共享库依赖边界捆绑二进制全部以 glibc 2.28 或更低为目标而运行镜像是debian:bookworm-slimglibc 2.36。它们从运行镜像需要、但不能自带这些共享库libraryneeded bylibc、libm、libgcc_s、libstdc所有二进制libssl.so.3、libcrypto.so.3MySQL 8.0 至 9 及 MariaDB 客户端、libpqlibz.so.1、libzstd.so.1、liblz4.so.1MariaDB 客户端、libpqlibncurses.so.6、libtinfo.so.6MySQL 8.0 与 MariaDB 交互客户端libncurses.so.5、libtinfo.so.5仅 MySQL 5.7 交互客户端libreadline.so.8PostgreSQL 13 的psqllibedit.so.2所有mariadb交互客户端、PostgreSQL 12 的psqllibpq.so.5PostgreSQL 客户端libgssapi_krb5.so.2MongoDB 工具三个特殊案例MySQL 26 自带 OpenSSL。26 客户端调用 OpenSSL 3.2 的符号而 bookworm 只带 3.0其RUNPATH是$ORIGIN/../lib/private所以mysql-26/lib/private/里放着与二进制同源自上游 tarball 的libssl.so.3和libcrypto.so.3OpenSSL 3.5.7加载器会优先于镜像里的副本。校验 OpenSSL 符号版本的方法与 glibc 相同用objdump -T按OPENSSL_3\.[0-9]检查——开发机上更新的 OpenSSL 会掩盖问题所以必须在运行镜像里跑一次。libedit.so.2是搭便车进镜像的。它不是 Dockerfile 显式安装的而是postgresql-common的依赖删掉那个包就会连带带走 MariaDB 交互客户端。它也是非 Debian 开发机唯一缺的 soname——Fedora 提供的是上游libedit.so.0。backend/Makefile 的libedit-shimtarget 用符号链接 LD_LIBRARY_PATH绕过这一点make test-fedora和make run-fedora都依赖它。验证命令模板。新增/刷新二进制后在运行基础镜像里跑一遍是最小验证docker run --rm --platform linux/amd64 -v $PWD/assets/tools:/tools:ro \ debian:bookworm-slim bash -c apt-get update -qq \ apt-get install -y -qq libedit2 libncurses6 libtinfo6 libssl3 /dev/null \ /tools/x64/engine/bundle/bin/command --version刷新补丁与新增版本的检查清单刷新风险低于新增版本但它同时更换了所有使用该捆绑的服务器的客户端不是静默操作。assets/tools/AGENTS.md 给出的流程要点刷新一个补丁同一捆绑内所有二进制必须来自同一上游构建issue #725 的教训在刷新脚本里固定确切的上游包版本不取该线最新补丁两个架构在同一次变更中从同一上游源刷新提交前在debian:bookworm-slim里运行刷新后的二进制用git ls-files -s确认可执行位为100755跑该引擎的完整测试矩阵测试矩阵位于backend/internal/features/databases/databases/engine/model_test.go与backend/internal/features/tests/logical/engine/backup_restore_test.go会拉起每个版本真实的服务器在同一次变更里更新本目录 README 的表格。新增一个引擎版本先确认上游是否仍对该线发补丁短期线大约活一个季度优先捆绑同时代的长期支持线按厂商架构无关 tarball → Debian 仓库 → Ubuntu 仓库 → 老企业发行版 RPM的顺序核查双架构二进制是否存在查完一种来源不要就下结论用objdump -T binary | grep -oE GLIBC_2\.[0-9] | sort -uV | tail -1比对 glibc 要求、用objdump -p binary | grep NEEDED列共享库全部必须已在镜像中捆绑目录与版本身份必须一起落地后端常量和frontend/src/entity/databases/model/engine/里的前端常量同名同值缺失会直接变成编译错误而不是空白字段最后同步更新根 README 与assets/readme/下五份语言副本的支持版本列表。这里不能做的事不要往Dockerfile里装客户端二进制ADR-0005 已否决不要为了迁就一个客户端而往运行镜像里加共享库——如果存在基于镜像既有库构建的版本用那个版本构建捆绑时不要信任目录名用--version实际运行来确认二进制身份启动校验只是最后一道网不是第一道。小结assets/tools/的设计可以浓缩为三条发布线命名把一个补丁与一条版本线解耦由 releaseline.go 的数值比较支撑使升级、回退判断不再依赖查找表CheckAllClientTools用真实执行而非静态检查来守住目录名与字节一致的承诺且对缺失共享库这类最高风险故障直接暴露刷新流程以 refresh-mariadb-bundle.sh 为代表通过版本钉死、解包不安装、双架构同源、运行镜像内验证保证两个架构永远不会悄悄分叉。这套机制让 Databasus 的多引擎备份能力建立在仓库里的字节即发版的字节之上。赞分享数据库灾备【免费下载链接】databasusPostgreSQL backup tool with Point-In-Time-Recovery and restore verification项目地址https://gitcode.com/gh_mirrors/po/databasus点击查看免费下载相关推荐Databasus 深度解析 assets/tools18 套数据库客户端二进制 bundle 的 vendoring、校验与刷新全链路Databasus 深度解析 assets/tools18 套数据库客户端二进制 bundle 的 vendoring、校验与刷新全链路 Databasus数据库灾备Weex 在 iOS 客户端上的运行机制解析Weex 在 iOS 客户端上的运行机制解析 前言 近年来跨平台移动开发技术如 React Native 和 Weex 对原生开发产生了重大影响。这些技术解决文档技术博客教程知识库Goose 桌面端 Windows 运行时文件机制解析Node.js 引导脚本与固定版本 uv 二进制的构建链路Goose 桌面端 Windows 运行时文件机制解析Node.js 引导脚本与固定版本 uv 二进制的构建链路 ui/desktop 是 Goose 桌面应人工智能大模型AI AgentAI 应用本地部署MCP ClientsMCP 服务工具调用桌面应用CLI上一篇Clean Code PHP提升PHP代码质量的终极指南下一篇MoneyPrinterPlus终极指南一键AI批量生成短视频轻松实现流量变现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
FastDFS 本地版 Docker 镜像构建与部署实战:从离线源码包到容器化分布式文件系统 分布式文件系统存储后端 【免费下载链接】fastdfs FastDFS is a high performance distributed file system (DFS). Its major functions include: file storing, file syncing and file accessing, and design for high capacity and load balance. Wechat/Weixin public acco… · 2026/9/25 5:07:35
Protractor 端到端测试基础设施架构深度解析:从组件到进程通信的全链路 测试 【免费下载链接】protractor E2E test framework for Angular apps 项目地址: https://gitcode.com/gh_mirrors/pr/protractor 点击查看 免费下载 导读
本篇文章以 Protractor 官方文档《How It Works / Infrastructure》为骨架,结合仓库源码与配… · 2026/9/25 5:54:20
昇腾Atlas 300V部署YOLOv5全流程实战:从模型转换到推理调优 Atlas这个词放在AI部署圈里,通常不是一个地图软件,而是指华为昇腾(Ascend)系列的AI计算平台。很多人第一次接触Atlas,是因为手头拿到了一块Atlas 300V 24G的运算加速卡,想拿它跑YOLO目标检测。问题往往从这… · 2026/9/25 5:54:08
Cocos Creator微信小游戏开发闭环指南 1. 为什么一个真实运行的“一人工作室”需要这套闭环指南我从2019年开始用Cocos Creator做微信小游戏,前三年接外包、做定制、带小团队,踩过所有你能想到的坑——打包失败、真机白屏、内存爆表、审核被拒、上线后卡顿掉帧。直到2023年彻底转型为纯一人工… · 2026/9/25 5:54:01
Atlas 300V部署YOLO实战:昇腾推理卡全流程解析与避坑指南 做AI部署这一行的人,但凡接触过边缘计算和推理加速,基本绕不开“atlas”这个名字。昇腾Atlas系列硬件这几年在安防、工业质检、自动驾驶、智慧零售这些场景里出镜率极高,尤其是配合YOLO系列目标检测模型做边缘端部署,几乎是标配方… · 2026/9/25 5:54:01
词达人自动答题脚本:浏览器自动化与题库匹配实战 1. 词达人自动答题脚本的底层逻辑与设计思路1.1 这个脚本到底解决什么问题词达人这类词汇学习平台,核心机制其实不复杂:给定一个英文单词,从四个中文释义里选正确的;或者反过来,给中文选英文。题目本身不难,… · 2026/9/25 5:54:01
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37