Oracle 数据库结构快照与差异同步工具:采集 Schema 结构、离线对比差异、生成可审计的升级 SQL。
ERP 实施 / 客户现场支持 / 多环境发布时,经常需要回答:
- 客户库比标准版缺了哪些表、字段、索引、约束?
- 函数、存储过程、包、视图和标准版有哪些不同?
- 如何生成一份敢在生产库执行的升级脚本?
本工具的运行方式:
Oracle 库 A ──采集──▶ 快照 A ─┐
├──对比──▶ 差异报告 ──▶ upgrade_YYYYMMDD.sql / Excel
Oracle 库 B ──采集──▶ 快照 B ─┘
不需要同时连接两个数据库:现场采集快照带回公司,与标准版离线对比即可。
- 结构采集:表(含注释/表空间)、字段、索引、约束、序列、视图、Function / Procedure / Package / Trigger 源码;自动过滤回收站(
BIN$)与系统内部对象(SYS_ILLOB 索引等) - 两种对比模式:快照 VS 快照、快照 VS 在线数据库
- 安全的升级脚本:
- 默认只生成 ADD / MODIFY;DROP 类需显式开启并独立成警告段
- 破坏性修改(缩短长度 / 类型变更 / 收紧非空)自动附风险提示注释
- 约束按逻辑签名匹配(主键两侧名字不同但定义相同不会误报)
- 新建表按 Toad 风格成套输出:建表 + 注释 + 唯一索引 +
USING INDEX主键约束 - 两侧 Schema 同名时对象自动带属主前缀(
ERP.TEST_TABLE) - 分节清晰:
-- [TABLE] 表(n 项)粗分隔线标题,TABLE / 字段 / 索引 / 约束 / 序列 / 视图 / 函数 / 存储过程 / 包 / 触发器 各自成节
- 桌面 GUI(PyQt6):三页签工作流(生成快照 → 差异对比 → 升级 SQL),SQL 语法高亮、差异语义着色、Excel 导出
- CLI:全部能力可脚本化,适合 CI / 巡检
- OTA 更新:检查 GitHub Releases 新版本,下载后退出自动替换重启
- Oracle 兼容:实测支持 11g(Thin 模式直连 11.2.0.4)/ 12c / 19c;11g 亦可勾选 Thick 模式
- 到 Releases 下载
OracleSchemaTool-vX.Y.Z-win64.zip - 解压后运行
OracleSchemaTool\OracleSchemaTool.exe - 「生成快照」页签填写连接信息 → 生成快照;两侧各采一次
- 「差异对比」页签选择两个快照(或快照 VS 数据库)→ 开始对比
- 「升级 SQL」页签预览 / 导出
upgrade_日期.sql,或回到对比页导出 Excel
需要 uv 与 Python 3.11+:
uv sync # 安装依赖
uv run pytest -q # 跑测试
uv run ruff check src tests
uv run dbsnapshot --help # CLI
uv run dbsnapshot gui # 启动 GUI
uv run pyinstaller --noconfirm --windowed --name OracleSchemaTool --collect-all oracledb exe_main.py
# 产物在 dist/OracleSchemaTool/# 采集快照(--pack 打包为单文件 .snapshot)
uv run dbsnapshot collect --host 10.0.0.10 --user erp --password xxx --schema ERP \
--output ./snapshots --pack
# 对比两个快照,生成差异报告 JSON
uv run dbsnapshot compare 标准版.snapshot 客户库.snapshot -o diff.json
# 由报告生成升级脚本(DROP 类默认不生成)
uv run dbsnapshot generate diff.json -o ./output
uv run dbsnapshot generate diff.json --include-drop --include-tablespace
# 检查 OTA 更新
uv run dbsnapshot update| 规则 | 说明 |
|---|---|
| 默认无 DROP | DROP / 重建类语句默认只以注释展示,加 --include-drop 才真正输出 |
| 风险注释 | 缩短长度、类型变更、收紧非空等操作前附 -- !! 风险: 注释 |
| 约束逻辑匹配 | 按 (类型, 列组, 条件) 匹配约束,仅名称不同只提示不生成破坏性 SQL |
| NOT NULL 归一 | "COL" IS NOT NULL 型 CHECK 归入列属性,不重复生成约束 |
| 属主前缀 | 仅两侧 Schema 同名时加前缀,避免异名环境生成错误 SQL |
| TABLESPACE 可选 | 默认不带,避免目标库无同名表空间报 ORA-00959 |
- GUI:菜单「帮助 → 检查更新」;CLI:
dbsnapshot update - 流程:查询 GitHub 最新 Release → 版本比较 → 下载 zip → 生成替换脚本 → 退出程序后自动覆盖并重启
- 仅打包版 exe 支持 OTA;源码运行请用
git pull
src/dbsnapshot/
├── collector/ # Oracle 连接与元数据采集(表/字段/索引/约束/序列/视图/PL-SQL)
├── snapshot/ # 快照读写与 .snapshot 打包(加密可选)
├── diff/ # 差异引擎、差异模型、Excel 导出
├── sqlgen/ # DDL / PL-SQL 生成与升级脚本组装
├── gui/ # PyQt6 界面(主题、三页签、后台线程、SQL 高亮)
├── cli.py # Typer 命令行
└── updater.py # OTA 更新
测试不依赖真实数据库:tests/conftest.py 内置标准版 / 客户版两套 Schema 夹具,覆盖约束逻辑匹配、系统索引过滤、Toad 风格建表、属主前缀、Excel 导出等场景。
CI(push / PR)跑 ruff + pytest;CD(推送 v* tag)在 Windows 上 PyInstaller 打包并发布 Release 附件。