DBRescue
达梦 DBF 表数据提取
本文使用 DBRescue 读取达梦数据目录,解析字典并提取指定表记录。数据文件、字典和控制信息应来自同一套副本,结果另外保存。
恢复原理与模式
工具读取目录中的字典和数据页,根据目标用户、表名解析物理记录。导出中保留源文件、页号、槽号、事务状态和行尾信息,不把物理候选记录直接当作已提交数据。
本文只走数据文件提取,当前不提供达梦日志回滚。结果 SQL 为注释,页面校验未证明、事务可见性未知都要保留,不应删掉标记后直接导入。
恢复准备
保留同一套 data 目录及其中的 MAIN.DBF、SYSTEM.DBF、dm.ctl、dm.ini 等材料,另建独立空输出目录。确认目标用户和表名。不得用不同数据库的文件拼接。
完整目录可以走字典识别;只有孤立 DBF、缺少字典或目标信息时,先确认工具是否支持。真实用户、表名应来自原库资料,不能套用本次 SYSDBA.RECOVERY_SAMPLE。
自己的文件,参数从哪里找
下面是只读查询,在数据库客户端执行,不是在 DBRescue 中执行。原库还能正常查询时,请 DBA 导出这些资料;原库已经故障,就使用匹配、可启动的副本,不要为了查参数强行启动故障原库。
本次在达梦 8 的 SYSDBA 会话执行。把 SYSDBA、RECOVERY_SAMPLE 换成实际模式和表名。这套测试实例没有 ALL_TABLES 兼容视图,因此使用原生 SYSOBJECTS、SYSCOLUMNS。
1SELECT SF_GET_UNICODE_FLAG() AS UNICODE_FLAG;2SELECT SCH.NAME AS OWNER_NAME,TAB.NAME AS TABLE_NAME,C.COLID,C.NAME AS COLUMN_NAME,C.TYPE$,C.LENGTH$ FROM SYSOBJECTS TAB JOIN SYSOBJECTS SCH ON SCH.ID=TAB.SCHID JOIN SYSCOLUMNS C ON C.ID=TAB.ID WHERE SCH.NAME='SYSDBA' AND TAB.NAME='RECOVERY_SAMPLE' ORDER BY C.COLID;SF_GET_UNICODE_FLAG 本例返回 1,对应 UTF-8;本轮没有验证其他字符集。字典清单用于确认模式、表、列顺序和类型,COLID 按原始顺序排序。 目录路线仍要保留同库 MAIN.DBF、SYSTEM.DBF、dm.ctl、dm.ini。不要将字典查询结果改名为结构文件,也不要用别的库补齐目录。
下载参数核对 SQL仅有一个 DBF、没有对应字典或字符集不明时先停止。本例只能证明 UTF-8 样本,不应按行数一致就认定乱码也恢复正确。
本次测试结果
本轮重新在达梦 8(8-20260707-335949-20228)建立 UTF-8 中文样本,SYSDBA.RECOVERY_SAMPLE 共 4096 行、4 列。原库查询、DBF 提取和另一套实例导入后的查询逐值一致,源副本未变;事务状态仍未知,页校验仍未证明。
使用正常关闭后的真实数据库文件和虚构测试数据,桌面为开发构建、测试授权。未制造文件损坏;隔离导入是否通过,见下方各库的实测记录,不据此推算故障库恢复率。
恢复操作实战
下面是本次桌面工具的实际操作。点击标题展开,按顺序选择文件、填写参数,再检查结果。
达梦 8 数据目录表记录提取实战
本例使用两套独立达梦 8 UTF-8 临时实例。源表 4096 行,ID、NAME、QTY、NOTE 四列,NOTE 含中文。桌面工具为开发构建、测试授权;输入为源实例正常关闭后复制的数据目录。
1. 安装工具并激活
- 安装工具,激活达梦或全库授权,确认引擎就绪。
- 数据库类型选择达梦,模式选择“数据文件提取”。
- 当前不走日志模式。
2. 选择输入和输出
- 在源文件区域点击“目录”,选择包含配套 MAIN.DBF、SYSTEM.DBF、dm.ctl、dm.ini 的 data 目录。
- 不要只点选 MAIN.DBF,也不要把输出建在 data 里面。
- 选择独立空输出目录,保留原副本。
3. 填写参数
- 展开高级参数,用户填写 SYSDBA,表名填写 RECOVERY_SAMPLE。这是本次样本,自己的文件改为真实用户和表。
- 本次使用目录中的字典识别,元数据栏无需选择样本以外的结构文件。
- 并发数保持 1,确认输入目录和表名正确。

4. 执行提取
- 点击“开始恢复”,观察任务状态和日志。
- 原生测试提取 4096 行并逐值比对通过。本次桌面端校验通过后显示 review-required;若仍出现 DM_RESULT_UNVERIFIED,停止并保留日志,不能按成功处理。
- 不要因为原生日志有 rows 就跳过桌面结果验证。
5. 查看导出记录
- 校验通过后,选择“查看表数据”中的 result.tsv。
- 本次业务列为 ID、NAME、QTY、NOTE;另外保留 source_file、page、slot、transaction_status、page_checksum_status、row_trailer_hex。
- 打开结果目录保存 result.tsv、result.sql 和 process.txt,SQL 不直接执行。

6. 恢复后检查
- 本次原生导出的 4096 行、4 列与 SQL 基准一致,检查了记录位置和 ID 重复,源文件哈希未变。
- 输出明确标记 TRANSACTION_STATE_UNKNOWN 和 PAGE_CHECKSUM_UNVERIFIED,不能写成校验或事务已确认。
- 自己的表还要核对字段、缺失、重复和业务关联。本次桌面复验已通过,仍不能省略这些业务检查。
导入测试库,再核对一次
重新用 UTF-8 字符集制作了 4096 行中文样本,先在原库查询核对,再从正常关闭的 DBF 副本提取。把提取结果按 4 列类型导入另一套新建的达梦实例后,逐字段一致,包含 240 个 NULL,没有重复 ID 或替换字符。两套临时实例均已停止。
- 先准备另一套空的达梦 8 测试实例,字符集使用 UTF-8。确认当前连接、端口和字符集,不能连接原业务库。本例的源、目标分别是两套新实例。
- 下载下方本例 SQL,在客户端打开,检查建表语句和 SYSDBA.RECOVERY_SAMPLE 目标表。目标表已存在时先停止,不要覆盖或删表。
- 执行完整脚本,再查询下方两个计数。还要逐字段核对 ID、NAME、QTY、NOTE,中文用原库查询作为基准;这次同时核对了 UTF-8 字节,不能把乱码前后一致算作成功。
1SELECT COUNT(*) AS rows_total, COUNT(DISTINCT ID) AS distinct_ids2FROM SYSDBA.RECOVERY_SAMPLE;在数据库客户端里,具体怎么执行
下面使用数据库自带的命令行客户端,不是在 DBRescue 任务窗口输入命令。先安装对应客户端,让管理员准备空的隔离测试环境和账号。把练习 SQL 放到 C:/recovery-practice;路径不同就替换下面的路径。
以下是连接模板:TEST_HOST 是测试服务器地址,TEST_PORT 是实际端口,TEST_USER 是测试账号,TEST_DATABASE 是管理员给出的空测试库,Oracle 的 TEST_SERVICE 是服务名。必须替换这些字样;密码在客户端提示时输入,不写进脚本。命令找不到时,进入客户端 bin 目录再执行。
1. 先确认连接位置
1disql /nolog2LOGINLOGIN 会按顺序询问地址、用户名、密码、端口等信息,按管理员给出的测试环境填写。核对连接输出中的地址和端口,再查询字符集;本文是 UTF-8,标志为 1。
2. 再执行练习脚本
在 DIsql 提示符下用 @ 读取文件。目标应为另一套空的 UTF-8 实例,SYSDBA.RECOVERY_SAMPLE 不应预先存在。不要删掉原表来迁就样本脚本。
1@C:/recovery-practice/import-sample.sql执行中出现报错就停止,保留第一条错误和完整输出,不要反复重跑 INSERT。成功后在同一目标库执行上面的计数查询,再按 ID 对齐逐字段核对。只有两个计数都为 4096 还不能作为完整验收。
文件执行方式已在 ESXi 的原生客户端验证:MySQL SOURCE、psql 的 \i、sqlcmd -i、SQL*Plus 与 DIsql 的 @。连接地址、账号和 Windows 路径是需要替换的模板;本节没有把命令行记录当成图形客户端截图。
达梦官方:登录及脚本执行说明本例的总行数和去重后的 ID 数均为 4096。行数相同还不够,本次另外逐字段比对了全部记录;中文、NULL、数字和日期也要一起核对。
下方 SQL 是本例已核对的提取记录转换成的练习脚本;工具 result.sql 本身仍为注释。此次验证 UTF-8,不扩大为其他字符集已通过。事务状态未知、页校验未证明,自己的数据还需核对业务关系后再决定回补。
遇到问题时
缺少结构或元数据
确认目录中数据文件、字典、控制和配置来自同一套数据库。缺少或混用资料时先停止,不拿其他库的 SYSTEM.DBF 来补。
没有提取出记录
核对用户、表名和数据目录。查看 process.txt 及任务日志,确认字典是否识别、目标表是否存在及类型是否支持。
显示部分完成或需要复核
DM_RESULT_UNVERIFIED 表示桌面结果没有通过验证。不要改成成功或直接导入。保留输出、日志和工具版本,先排除结果格式或完整性问题。
本轮已重新验证 UTF-8 中文样本的文件提取和另一套实例中的类型导入,4096 行逐字段一致。没有执行生产回补,也没有确认物理候选记录的事务可见性或页面校验。
解析细节和导出文件
读取 SYSTEM 与用户表空间
从 SYSTEM.DBF 获取字典信息,并结合用户表空间 DBF 定位目标表,支持用户与表筛选。
字段解码有具体测试
行解码测试覆盖整数、浮点、NUMBER、字符串、NULL、日期及微秒时间;畸形行长度会被拒绝。
输出过程有事务式发布测试
测试包含输出发布与多文件处理;文件遍历会排除 Windows 重解析点,避免意外读取链接目录。
桌面与原生引擎一起验证
隔离测试授权完成离线激活后执行真实原生提取,同时验证未授权数据库会被主进程拒绝。
- result.sql
- 数据提取模式的 SQL;日志模式可能只提供审查脚手架
- result.tsv
- 提取的行或日志事件清单
- process.txt
- 本次任务摘要与处理结果
查看命令行示例
1dbrescue extract --db dm --path /recovery/DAMENG --user APP --table ORDERS --out-dir /recovery/output