Skip to content

About

Oracle database DDL and table data backup tool

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Oracle_backup_tool

Windows 上的 Oracle 数据库备份工具,使用 Python、PyQt6 和 python-oracledb。

支持多份连接配置、数据库对象按需加载与筛选、DDL 导出、表数据 SQL 导出、按 yyyy-mm-dd 建立备份子目录,以及备份完成后提交并推送到 Git。

对象列表与导出范围限定为当前连接用户自有的 schema(使用 USER_* 字典视图)。以 LXD 登录时不显示 APEX、CWBS 等其他 schema 的对象;旧配置保存的跨 schema 勾选也会被过滤。数据库链接名称自身包含的域名点号保留。

PACKAGE 使用 DBMS_METADATA.GET_DDL('PACKAGE', ...) 导出包声明和包体,统一保存在 PACKAGE/包名.sql。对象选择中不再提供 PACKAGE BODY;旧配置中的包体勾选自动合并到 PACKAGE。历史 PACKAGE_BODY 文件保留,但不参与上传和差异对比,避免同一包体重复出现在报告中。

打开“表数据”页、筛选或直接导出时会自动连接并加载当前用户的表清单,无需先展开对象树。切换配置后重新加载对应数据库,保留该配置保存的表勾选和 WHERE 条件。筛选忽略大小写、按表名包含文本匹配;界面显示表总数和匹配数,“刷新表清单”用于读取数据库中的最新表名。自动加载清单不会自动勾选全部表数据。

对象较多时勾选“仅显示已勾选对象”,未勾选的对象会立即隐藏,只保留类型行、加载提示和已勾选项,方便确认和调整选择。该复选框位于“3. 导出对象选择”标题右侧,DDL 与表数据两页同时生效。DDL 页的“已勾选 N 个”实时统计已展开并加载的勾选数量,整类勾选但尚未展开的类型显示为“另有 M 类整类勾选”,因为具体个数需要查询数据库才知道;表数据页沿用“共 N 张表,显示 M 张”,一项都没勾选时提示“无勾选表”。每页的“名称筛选”与它是“与”的关系,两个条件都满足才可见。该复选框只影响显示,不改变导出内容:隐藏项不导出,勾选类型行仍然选中该类型全部对象,隐藏的子对象也会一并勾上;表数据页的隐藏行同样照常导出。它不写入配置,切换配置后保持当前勾选状态。

Git 备份

每份配置可独立设置 Git 上传开关、HTTP/HTTPS 仓库地址、分支、仓库子目录、用户名和密码/Token。GitHub 使用 Token,自建 Git 服务可使用其支持的密码或 Token。Git 功能使用 Dulwich,分发的 EXE 无需目标机器安装 Git、Python 或 SSH 客户端。

Git 上传和 Git 历史对比会读取 Windows 系统或环境变量中的 HTTP/HTTPS 代理设置,并遵守代理绕过列表;没有配置代理时直接连接。若浏览器可访问 GitHub 而旧版工具频繁连接超时,请使用支持系统代理的新版。

启用 Git 后,点击“导出当前配置”或“上传现有备份”会询问此次更新说明,支持多行中文;“导出所有配置”仅询问一次,供本批次的 Git 提交使用。留空沿用带时间的默认提交说明,取消则不启动本次任务。更新说明不保存到连接配置,内容未变化时仍不创建提交。

“按日建目录”仅影响本地归档:SQL 保存到 备份目录/yyyy-mm-dd/对象类型/。“上传 Git”独立生成或同步 备份目录/对象类型/ 下的 SQL,并从根目录提交上传。两项同时开启时,本次导出的 SQL 在日期目录和根目录各保留一份,两份内容完全相同,使用同一次数据库导出生成的数据。

各配置应使用不同的仓库子目录,例如 backups/学校A。Git 路径始终为 backups/学校A/TABLE/表名.sql,不受本地日期选项影响。同一对象类型下已删除的 SQL 会在新提交中移除;历史日期目录不上传,也不会因上传而删除。

内容未变化时不提交;远端分支在上传过程中发生变化时拒绝覆盖。上传失败不删除本地 SQL,可点击“上传现有备份”重试,该按钮始终上传备份根目录中的 SQL,与日期选项无关。取消备份、导出失败或 SQL 含错误时不会自动上传。新分支基于远端默认分支创建,空仓库直接创建首个提交。

Git 密码/Token 通过 Windows DPAPI 加密保存,绑定当前 Windows 用户;把配置复制到其他用户或机器后,需要重新输入 Git 凭据。数据库连接密码仍沿用原有配置格式。上传范围仅为对象类型目录和 DATA 目录的 SQL,不上传 config.json、凭据或其他文件。

修改说明对比

备份完成后点击“生成修改说明”,生成成功后自动用系统默认应用打开报告;无法打开时提示文件路径,可手动打开。比较只读取备份 SQL 和 Git 历史,不连接数据库,不提交或推送 Git。

  • 勾选“按日建目录”:最新 yyyy-mm-dd 目录与前一个日期目录比较,报告保存为最新目录下的 此次修改说明.md;两项都勾选时优先使用日期目录。
  • 仅勾选 Git:当前备份根目录与配置分支、仓库子目录的远端版本比较。若当前 SQL 与远端最新版本一致,沿第一父提交寻找该子目录上一个不同的版本,跳过其他配置的提交。历史 SQL 下载到 git_compare/提交号_随机标识/,报告保存为根目录下的 GIT差异描述yyyymmdd-hh-mm-ss.md。
  • 两项都未勾选、没有上一个日期/Git 备份版本、备份目录为空或 SQL 包含导出错误时,提示无法对比。

报告一级标题为对象目录,二级标题为对象名称,只列出新增、修改和当前目录缺失的对象。修改内容按差异位置给出原、新行号及修改前后的 SQL;忽略 UTF-8 BOM 和换行格式差异。完全一致时只写“未发现差异”。当前目录缺失不代表数据库删除对象,也可能是导出范围改变。每个日期只有一份备份,同日多次导出的历史无法通过日期模式恢复。

从备份恢复对象

点击“恢复备份”,选择具体的按日目录(例如 备份目录/2026-10-30,其中直接包含 PACKAGE、FUNCTION 等子目录),勾选对象类型后确认目标数据库。恢复使用界面当前填写的用户名、密码和连接串,与导出页的对象勾选、筛选条件无关。类型列表显示 SQL 文件数,默认不勾选。

支持 PACKAGE、FUNCTION、PROCEDURE、TYPE、TYPE BODY、TRIGGER、TABLE、INDEX、VIEW、MATERIALIZED VIEW、SEQUENCE、SYNONYM、LIBRARY、CLUSTER;PACKAGE 包含声明和包体,先创建所有包声明再创建包体。兼容历史独立 PACKAGE_BODY 目录,同名 PACKAGE 已存在时跳过重复包体文件。暂不恢复 DATA 表数据及 JOB、数据库链接、Java 等特殊对象。

可 CREATE OR REPLACE 的对象覆盖当前定义;表、索引、序列、物化视图、簇只尝试创建,已存在时停止并报告,不自动删除或清空。TABLE 备份附带的注释和索引会执行;跳过本次建表约束已自动生成的索引,以及同时勾选 INDEX 时的重复索引。

DDL 中显式的源对象所属 schema 限定名映射到目标用户;字符串、注释和其他 schema 引用保持原文,因此动态 SQL 内写死的源 schema、表空间、外部依赖仍需自行核对。恢复前先读取和检查全部选中文件,导出错误、空文件、未闭合字符串及不支持的脚本会阻止启动数据库操作。

Oracle DDL 自动提交,不能回滚。 确认窗口会显示目标连接、源目录、类型和文件数。执行发生错误时停止,日志记录已完成的数量与失败文件,之前成功的修改保留。恢复期间不可切换连接或关闭程序。执行后仅尝试重新编译本次恢复的对象并查询 USER_OBJECTS / USER_ERRORS;仍为 INVALID 的对象报告恢复未完成。编译通过不代表业务回归通过。实际恢复前请保留当前数据库的独立备份。

运行

cd db_backup_tool
python -m venv venv
.\venv\Scripts\python.exe -m pip install -r requirements.txt
.\venv\Scripts\python.exe main.py

连接配置保存在程序旁的 config.json。配置文件可能包含数据库密码,不提交到仓库。

测试

cd db_backup_tool
.\venv\Scripts\python.exe -m unittest discover -p "test_*.py" -v

测试使用模拟数据库、临时目录及本地 HTTP Git 服务,不连接实际 Oracle。HTTP 测试包含用户名/密码认证、无外部进程、远端冲突、历史目录保留、自动上传和上传失败后本地文件保留。

打包

在项目根目录运行 run_build.ps1,或在安装依赖后运行 db_backup_tool/build_exe.py。EXE 输出到 db_backup_tool/dist。

当前分发版本内置 Windows x64 Oracle Instant Client 19.32 Basic,兼顾 Oracle 11.2 和高版本数据库,完整 Basic 包支持中文字符集。客户端来自 Oracle 官方下载页,原始包 instantclient-basic-windows.x64-19.32.0.0.0dbru.zip 的 SHA-256 为 e95a66eb4e69e2fb28880cbd252e8eab9807b877c4248c0d50a28f7b75cfe878。

重新打包时,将同一版本完整客户端(包括 oci.dll)放入 db_backup_tool/oracle_client,不要混放不同版本 DLL。打包脚本只嵌入 OCI 运行所需的 oci.dll、oraociei19.dll、orannzsbb19.dll、oraons.dll 及许可、版本说明文件,保留完整字符集,不打包备用库、调试符号或 Java/C++ 工具组件。原始客户端目录保留完整下载内容;客户端文件和生成文件不提交到仓库。

About

Oracle database DDL and table data backup tool

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages