OBET-Oracle Block Editor Tool使用说明

联系:手机/微信(+86 17813235971) QQ(107644445)QQ咨询惜分飞

标题:OBET-Oracle Block Editor Tool使用说明

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1. 概述

OBET 以 REPL 交互模式工作:启动后进入 OBET> 提示符,逐条执行命令。文件以 文件号 + 块号 的方式定位,可同时维护一份文件列表(来自 listfile.txt),方便在不同数据文件之间交叉读写。

功能概览

  • 十六进制查看 / 编辑数据块(自动维护 tailchk 和 checksum)
  • 打印 Oracle 内部结构(kcbh / kcvfh* / tailchk
  • 跨数据文件拷贝块 / 字节范围 / 文件头 SCN 信息
  • 整文件强制拷贝(forcecopy,绕过坏块)
  • 扩展数据文件(extend file N,按文件头记录大小补齐零块)
  • 坏块修复:corrupt / repair block / repair blkscn / merge
  • dbv 数据块物理一致性扫描(可指定文件/起始块/块数)
  • 导出 / 解析数据库元数据:get_dhr / parse_ctl / dump_undo
  • 解析 RDBA 编码(rdba / getrdba
  • 构造 Oracle 数据块(build block N,M
  • Linux 下 Patch Oracle 进程 SCN(patch_scn
授权说明写操作(modify / corrupt / repair / copy / merge / forcecopy / extend / patch_scn 等需要修改磁盘内容的命令)需要先 set mode edit 进入编辑模式,并在出现确认提示时输入 YYES 才会执行写入。 backup 仅复制块到本地目录,不需授权。未授权时仅允许只读命令。

2. 开发者信息

姓名 XiFenFei
电话 +86-17813235971
邮箱 dba@xifenfei
QQ 107644445
微信 17813235971
网站 https://www.xifenfei.com

反馈授权 / Bug / 功能建议可通过上述任一渠道联系。

3. 启动与会话

3.1 help

显示完整命令清单(与本手册对应的内嵌帮助)。

OBET> help

  [File / Block Setup]
  open          - Load file list (format:  )
  info                    - Show loaded file list
  set       - Configure: filename|file |blocksize|block|offset|count|mode|endian
  show                    - Display current settings
  listfile <path|remove|edit>  - Scan dir (path), remove, or edit listfile.txt (notepad/vi)

  [View Data]
  d/dump [file N] [block X] [offset Y] [count Z] - Display block data (default: current file/block)
  p/print <kcvfh[.field]|tailchk>  - Print Oracle structure (use 'p' alone for full list)

  [Verify / Calculate]
  sum [apply] [file N] [block X]       - Verify (or apply) block checksum
  tailchk [apply] [file N] [block X]   - Verify (or apply) block tailchk
  dbv [file N [block M [blocks X]]]    - Verify data blocks for corruption

  [Modify Data]
  m/modify  [file N] [block X] [offset Y]  - Modify bytes (with auto-checksum/tailchk)
  corrupt [file N] [block X]          - Mark block as corrupted
  backup [file N] [block X]           - Backup block to backup_blk/
  undo                                - Undo last modification

  [Repair]
  repair block [file N] [block X]         - Fix seq_kcbh / tailchk / checksum
  repair blkscn [file N] [block X]        - Fix block SCN lower than block CSC
  copy data  to               - Copy byte range between files
    / format: file[,block][,offset[,count]]
    Example: copy data 1,1,16,32 to 2,5,16
  copy block <file,block> to <file,block>  - Copy entire block between files
  copy chkscn file N to file M            - Copy datafile header checkpoint SCN info
  copy resetlogscn file N to file M       - Copy datafile header resetlogs info
  forcecopy file N to               - Force copy file ignoring bad blocks (damaged disks)
  extend file N                          - Check and extend datafile to match header record
  merge file N from M                    - Repair N's bad blocks using M's blocks at same RDBA
  build block N,M [to file X]           - Build block (N=file#, M=block#); write build_N_M.blk; 'to file X' patch after validation

  [Database Info / Diagnostics]
  get_dhr                - Extract DB info from file headers to dhr_*.txt
  parse_ctl        - Parse Oracle control file (DB name / datafiles / tablespaces)
  rdba              - Parse RDBA value to File# and Block# (e.g., rdba 0xFEDCBA12)
  getrdba <rfile#> <block#> - Calculate RDBA from rfile# and block# (e.g., getrdba 1 500)
  dump_undo [file N] [block M] - Dump UNDO$ segment: name + status$ (default: file 1 block 224)

  [Session]
  license              - Show / manage license
  version              - Show version and developer info
  spool |off    - Start/stop logging to file
  help                 - Show this help message
  quit/exit            - Exit OBET

3.2 version

显示 OBET 版本、构建时间、开发者信息。

OBET> version
=============================================
Welcome to Oracle Block Editor Tool (OBET)
=============================================
***** !!! For Oracle Internal Use only !!! *****

[Software Function Description]
- View and edit data block in hexadecimal format
- Print Oracle internal structures (kcbh / kcvfh* / tailchk)
- Modify data block bytes (with auto tailchk/checksum)
- Copy block / data between different datafiles
- Copy / repair datafile header SCN info (copy chkscn/resetlogscn)
- Force copy entire file ignoring bad blocks (forcecopy)
- Extend datafile to expected size from file header (extend)
- Mark data block as corrupted block
- Verify data blocks for corruption (dbv)
- Repair corrupted block / Repair block SCN
- Calculate and verify tailchk / checksum
- Backup data block to backup_blk/ directory
- Repair bad blocks using healthy donor file (merge)
- Extract undo$ segment contents (dump_undo)
- Extract database info from file headers (get_dhr)
- Parse Oracle control file (parse_ctl)
- Parse RDBA value to Oracle File# and Block#
- Patch Oracle process SCN in memory (patch_scn, Linux only)
- Scan directory to listfile.txt (listfile)

[Developer Information]
- Name: XiFenFei
- Phone: +86-17813235971
- Email: dba@xifenfei
- Q Q: 107644445
- WeChat: 17813235971
- Website: https://www.xifenfei.com

[Version Details]
- Software Version: 2026.08
- Build Date: 2026.08.12 17:49:27

3.3 quit / exit

退出 OBET。

4. 文件 / 块设置

这一组命令负责把磁盘上的数据文件加载到 OBET 上下文。所有读写命令都依赖当前的 filenameblocksizeblockoffsetcountendian 等参数。

4.1 open <listfile>

从指定文件加载文件列表。文件每行格式:<num> <path>num 是 OBET 内部文件号,供后续 set file N / file N 使用。

OBET> open listfile.txt
OBET> open test_listfile.txt
Loaded 1 files from datafile list 'test_listfile.txt'.

4.2 info

显示当前已加载的文件列表(编号 / 路径)。

OBET> info
----------------------------------------
No   Path
----------------------------------------
1    E:/CC/obet/dbf/SYSTEM01.DBF
----------------------------------------

4.3 set <param> <value>

设置上下文参数。可用参数:

参数 取值 说明
filename 文件路径 当前操作的目标文件
file 整数 N 切换到已加载列表中第 N 个文件
blocksize 2048 / 4096 / 8192 / 16384 / 32768 Oracle 块大小
block 整数 当前块号
offset 整数(块内偏移) 块内起始偏移
count 整数 dump/modify 的字节数
mode browse / edit 交互模式(默认 browse)
endian big / little 多字节字段字节序
OBET> set filename /u01/oradata/users01.dbf
OBET> set blocksize 8192
OBET> set block 100
OBET> set endian big

4.4 show

显示当前上下文所有参数,包括 Modebrowse / edit)、FilenameFile#Block#BlocksizeOffsetCountEndian 等。

OBET> show
Current settings:
File: (not set)
Blocksize: 8192 bytes
Block: 1
Offset in block: 0 (file offset: 0x00002000)
Count: 32 bytes
Mode: browse
Endian: little (x86)
Loaded files: 1 (use 'info' to list)

4.5 listfile <path | remove | edit>

扫描目录生成 listfile.txt、清空或编辑。

OBET> listfile /u01/oradata
OBET> listfile edit
OBET> listfile remove
  • listfile <path>:递归扫描目录,支持通配符 *,结果追加写入当前目录的 listfile.txt
  • listfile remove:删除当前目录的 listfile.txt
  • listfile edit [path]:调用系统编辑器(Windows 记事本 / Linux vi)打开 listfile.txt,可指定路径

通配符示例:

OBET> listfile E:/oradata           # 扫描整个目录
OBET> listfile E:/dbf/system*.dbf  # 仅扫描名称以 system 开头且 .dbf 结尾的数据文件

已存在 listfile.txt 时,新扫描结果以递增编号追加写入。

写操作保护写盘时会校验输入,避免路径穿越(../..\)。

5. 查看数据

5.1 dump / d [file N] [block X] [offset Y] [count Z]

以十六进制 + ASCII 形式显示块数据。默认使用当前文件 / 块 / 偏移,也可直接通过参数指定。

OBET> d
OBET> dump file 1 block 100
OBET> dump offset 16 count 64
OBET> dump file 2 block 5 offset 0 count 128
OBET> dump file 1 block 128 offset 32 count 48
File: e:/cc/obet/dbf/system01.dbf (#1 in listfile)
Block: 128                Offsets:    32 to    79
--------------------------------------------------------------------------------
00100020 00000000 01000200 00000000 04001200 43000000 B02C8000 2F001000 01200000
00100040 22120200 00015800 FFFFC200 2A046803

5.2 print / p <kcvfh[.field] | tailchk>

解析并打印 Oracle 内部结构。仅支持一级字段。

OBET> p kcvfh
OBET> p kcvfh.kcvfhhdr
OBET> p kcvfh.kcvfhckp
OBET> p tailchk
ub4 tailchk                                      @8188    0x00000B01

支持的全部结构字段(p 不带参数可打印完整清单):

字段 含义
kcvfhhdr 文件头描述符
kcvfhrfn 相对文件号
kcvfhrdb DBID
kcvfhcrs 创建 SCN
kcvfhcrt 创建时间
kcvfhrls Resetlogs SCN
kcvfhcrs Creation SCN
kcvfhbsc Backup SCN
kcvfhbti Backup table info
kcvfhbth Backup table header
kcvfhbcp Backup Checkpoint
kcvfhbhz Backup status
kcvfhccc Change count
kcvfhckp 完整 Checkpoint
kcvfhcpc Checkpoint count
kcvfhprs / kcvfhprc / kcvfhprfs / kcvfhrfs 恢复相关字段
kcvfhtsn / kcvfhtln / kcvfhtnm 表空间号 / 名长度 / 名
kcvfhrlc / kcvfhrts / kcvfhtrt Resetlogs 计数 / 时间戳 / 总复位次数
kcvfhxcd 扩展 Checkpoint
kcvfhsta Fuzzy 状态
kcvfhofb / kcvfhnfb Offset bytes / Next offset bytes
kcvfhbfh Backup file header block
kcvfhafs Auxiliary recovery
tailchk 块尾校验
仅支持一级结构访问,如 p kcvfh.kcvfhhdr,不支持 p kcvfh.kcvfhhdr.kccfhtyp

6. 校验 / 计算

6.1 sum [apply] [file N] [block X]

校验或修复 checksum(块头 kcbh 中的 kcbh.flags/kcbh.checksum 字段)。

OBET> sum
OBET> sum apply
OBET> sum file 2
OBET> sum apply file 2 block 100
OBET> sum
Check value for File e:\cc\obet\dbf\system01.dbf, Block 2:
  current = 0xB71C, required = 0xB71C

6.2 tailchk [apply] [file N] [block X]

校验或修复 tailchk(块末 4 字节与起始 SCN 比对)。

OBET> tailchk
OBET> tailchk apply
OBET> tailchk apply file 1 block 224
OBET> tailchk apply file 1 block 224
Confirm applying tailchk:
File: e:\cc\obet\dbf\system01.dbf
Block: 224
Offset in block: 8188 (file offset: 0x00071FFC)
Original value: 0x00E03F03
New value:      0x00E03F03
Confirm? (Y/YES to proceed): Y
tailchk applied successfully.

6.3 dbv [file N [block M [blocks X]]]

对全部已加载文件或指定文件做物理一致性扫描(类似 Oracle dbv 工具)。字节序由 set endian 控制。可检测五类问题:全零块、软损坏(seq_kcbh=0xFF)、tailchk 错误、checksum 错误、rdba 错误。

  • dbv:扫描全部已加载文件(从块 0 到文件末尾)
  • dbv file N:仅扫描文件 N(从块 0 到文件末尾)
  • dbv file N block M:扫描文件 N 从块 M 到文件末尾
  • dbv file N block M blocks X:扫描文件 N 从块 M 起共 X 块;若 M+X 超出文件总块数,则扫描到文件末尾

块号从 0 开始。自动识别 bigfile / smallfile 数据文件,bigfile 时跳过文件头(block 0)的 rdba 校验。扫描结果自动保存到日志文件:

  • dbvdbv_yyyymmddhhmmss.log
  • dbv file Ndbv_file_N_yyyymmddhhmmss.log
  • dbv file N block Mdbv_file_N_block_M_yyyymmddhhmmss.log
OBET> dbv
OBET> dbv file 1
OBET> dbv file 1 block 100
OBET> dbv file 1 block 100 blocks 500
OBET> dbv file 1 block 100 blocks 500
===============================================
DBV (Data Block Verification)
Block Size: 8192 bytes
Endian:     little-endian (x86)
Target:     file #1 (e:\cc\obet\dbf\system01.dbf)
Range:      block 100 to block 599 (500 blocks)
===============================================
Verifying file #1: e:\cc\obet\dbf\system01.dbf ...
DBV completed at: 2026-08-12 15:04:25
===============================================
DBV Summary:
Total blocks checked: 500
Total all zero blocks found: 0
Total all tailchk error blocks found: 0
Total all checksum error blocks found: 0
Total bad blocks found: 0
Execution time: 0.20 seconds
Throughput: 19.53 MB/s
===============================================
Detailed report saved to: dbv_file_1_block_100_20260812150425.log

7. 修改数据

7.1 modify / m <hex> [file N] [block X] [offset Y] 需授权

写入十六进制字节。写入后自动重新计算 tailchkchecksum。需先 set mode edit,执行时输入 Y 确认。

OBET> set mode edit
OBET> m 41424344
OBET> modify 41424344 file 1 block 100 offset 32
OBET> set mode edit
OBET> modify 41424344 file 1 block 128 offset 32
Confirm modification:
File: e:\cc\obet\dbf\system01.dbf
Block: 128
Offset: 32 (file offset: 0x00040020)
Original value: 01000200
New value:      41424344
Confirm? (Y/YES to proceed): Y
Data written successfully.

7.2 corrupt [file N] [block X] 需授权

将指定块标记为 Oracle 意义上的损坏块(破坏 tailchk)。需先 set mode edit,执行时输入 Y 确认。

OBET> corrupt file 1 block 128
Confirm marking block 128 as corrupted:
Block 128 current tailchk: 0x00200000
Successfully marked block 128 as corrupted.

7.3 backup [file N] [block X]

把指定块完整备份到当前目录的 backup_blk/ 子目录。备份文件名格式:backup_<filename>.<file#>_<block#>_<timestamp>.blk

OBET> backup file 1 block 128
Backing up file #1, block 128
e:\cc\obet\dbf\system01.dbf
Successfully backed up block 128 to backup_blk\system01.dbf.1_128_20260812150500.blk

7.4 undo 需授权

回滚最近一次 modify / repair / copy / corrupt 等写操作。OBET 在每次写操作前保留原块内容,回滚基于这份快照。

OBET> undo
Undid 1 operation(s). Block data restored from backup.

8. 修复

8.1 repair block / blkscn [file N] [block X] 需授权

  • repair block:修复 seq_kcbhtailchkchecksum
  • repair blkscn:把块的 scn 抬到不低于 csc(解决 ORA-600 [kdddgb] 之类 block SCN < block CSC 类报错)

均需先 set mode edit,执行时输入 Y 确认。

OBET> set mode edit
OBET> repair block
OBET> repair block file 2 block 100
OBET> repair blkscn file 1 block 224
OBET> repair block file 1 block 128
Repairing block 1, 128...
Current block SCN information:
  blkscn: 0x000000000278D9A3 (41663267)
  blkcsc: 0x0000000002790128 (41670952)
blkscn < blkcsc, SCN repair required.
New SCN values to write:
  base:  0x02790128 (41670952)
  wrap:  0x0000
  seq:   0x00
Confirm SCN repair operations: Operation cancelled.

8.2 copy 需授权

多种拷贝语义,全部写盘需授权。

子命令 语法 说明
copy data copy data <src> to <dest> 跨文件字节范围拷贝
copy block copy block <file,block> to <file,block> 整块拷贝
copy chkscn copy chkscn file N to file M 拷贝数据文件头 Checkpoint SCN 信息
copy resetlogscn copy resetlogscn file N to file M 拷贝 Resetlogs 信息

<src> / <dest> 格式:file[,block][,offset[,count]]。缺省 block 沿用当前块,缺省 offset = 0,缺省 count = blocksize。

OBET> copy data 1,1,16,32 to 2,5,16
OBET> copy block 1,100 to 2,100
OBET> copy chkscn file 1 to file 2
OBET> copy resetlogscn file 1 to file 2
OBET> copy block 1,128 to 1,129
Copying block 1,128 to 1,129...
  src: file#=1 block#=128 (rdba=0x00400080)
  dest: file#=1 block#=129 (rdba=0x00400081)
Block copied successfully.

8.3 merge file N from M 需授权

M 文件中 RDBA 一致的健康块替换 N 文件中的坏块。执行前 OBET 会要求输入 YES 二次确认。

OBET> merge file 2 from 3
OBET> merge file 2 from 3
Merging bad blocks from file 2 using healthy blocks from file 3...
File 2: scanning for bad blocks...
  Block 100: bad, searching donor...
  Block 100: rdba=0x00400064 matched, scanning file 3 for donor block...
  Block 100: donor found at file 3 block 100
  Replacing bad block 100 in file 2 with healthy block from file 3...
Merge completed. Total blocks repaired: 1
不可逆操作覆盖原文件块,请先 backup

8.4 forcecopy file N to <path> 需授权

整文件级别强制拷贝,忽略坏块(按 blocksize 步长逐块读取;坏块读到 0 字节时填充全 0×00 写入目标)。用于磁盘扇区部分损坏但仍能部分读取的应急场景。

OBET> forcecopy file 2 to D:\rescue\users01.dbf
OBET> forcecopy file 2 to D:\rescue\users01.dbf
forcecopy: source file 2, dest D:\rescue\users01.dbf
Reading source file...
  4096 bytes read OK (block 0)
  4096 bytes read OK (block 1)
  ... (progress every 1000 blocks)
  4182831104 bytes copied (510600 blocks)
forcecopy completed. 0 bad blocks filled with zeros.

8.5 extend file N 需授权

比较 Oracle 数据文件实际大小与文件头记录的预期大小,在不一致时将文件扩展至正确大小(尾部构造 Oracle block 填充)。

判定规则:读取 block 1 内部偏移 44 处的块计数字段,计算出预期大小:

预期大小 = (块计数 + 1) × blocksize

三种结果:

  • 相等——文件大小与预期一致,无需操作;
  • 预期 > 实际(文件偏小)——从当前块号起,逐块用构造的 Oracle 空块填充至预期大小(不足一块的尾部按字节填零);
  • 预期 < 实际(文件偏大)——输出提示,要求人工介入,不自动截断。

前提条件

  • 需先 set blocksize 设置正确的 Oracle 块大小(4096 / 8192 / 16384 / 32768)
  • 需先 set endian big|little 设置正确的字节序
  • 需先 set mode edit 进入编辑模式

开始写入前需输入 YYES 二次确认(忽略大小写)。

OBET> set blocksize 8192
OBET> set mode edit
OBET> extend file 1
File #1: E:\dbf\system.dbf
  BlockSize:       8192 bytes
  Header Blocks:   510600 (offset 44)
  Expected Size:   4182835200 bytes ((510600+1)*8192)
  Actual Size:     4182831104 bytes
  Status: File is smaller than header record.
  Extending file by 4096 bytes (Build Oracle block padding)...
  Confirm? (Y/yes to proceed): Y
  Done. File extended to 4182835200 bytes.
注意扩展操作不可逆,请在执行前做好文件备份。若文件实际大小大于预期,Oracle 内部可能已扩展但文件头未更新,请人工核实后处理。

8.6 build block N,M [to file X] 需授权

构造 Oracle 数据块(N=file# 1-1024,M=block#)并按需 patch 到 listfile 中的目标文件。

用法

  • build block N,M——仅在 OBET 当前工作目录生成 build_N_M.blk(始终生成,无论是否带 to file X)。
  • build block N,M to file X——生成 blk 之后,校验通过后将构造好的块覆盖到 listfile X 的 block M。
OBET> set endian big
OBET> build block 1,500
Created: build_1_500.blk (file#=1, block#=500, rdba=0x004001F4, tailchk=0x01000000, checksum=0x0113)

OBET> set mode edit
OBET> build block 1,500 to file 1
Created: build_1_500.blk (file#=1, block#=500, rdba=0x004001F4, tailchk=0x01000000, checksum=0x0113)
Confirm patch: File 1 Block 500 (E:\dbf\system.aix-11202)? [Y/YES]: Y
Patched: File 1 Block 500 (E:\dbf\system.aix-11202)

9. 数据库诊断

9.1 get_dhr

读取当前加载的每个数据文件的 block 1(数据文件头),解析数据库元数据并生成 数据文件头报告(Get Datafile Header Report)。报告同时输出到屏幕,并写入 dhr_<YYYYMMDD_HHMMSS>.txt

OBET> get_dhr
===============================================
get_dhr Get Datafile Header Report
Started: 2026-08-12 15:10:00
Block Size: 8192 bytes
Endian:     little-endian (x86)
===============================================
No  Path                                         DBName/DBID    Version  Ts#/TsName     File#/Rfile#  Size(DB/OS)  Create_Info           CheckPoint_Info        Fuzzy  Thread#/Seq#  Rlogs_SCN
--  ----                                         -------------  -------- -------------  -------------  -------------  -------------  --------------------  -------------------  -----  -------------  ----------
1   e:/cc/obet/dbf/system01.dbf                  ORCL/1248591446  0A200100  0/SYSTEM         1/1           590MB/OK      2005-08-30 13:50:22   2011-04-18 14:56:29  OK     1/351          534907

9.2 parse_ctl <path>

解析 Oracle 控制文件(control01.ctl / control02.ctl 等),输出 DB 名称、字符集、所有数据文件(type=04)、临时文件(type=07)、日志文件(type=03)、表空间清单。日志文件 SIZE 列由三级回退得到:

  1. 操作系统上读取到的 redo 文件大小减去 512 字节(Oracle redo 文件尾部的 512 字节 footer);
  2. 若 OS 文件无法访问(文件丢失 / 不可读),从控制文件第 21 / 22 块中 redo 记录(72 字节 / 条)的块数 × 512 字节取得;
  3. 上述两者都不可用时显示 0(对应记录仍会显示,便于人工干预)。

PATH 列宽按当前解析结果中最长路径动态收紧;SIZE 数值右对齐。

OBET> parse_ctl E:\ORADATA\ORCL\CONTROL01.CTL
OBET> parse_ctl E:\ORADATA\ORCL\CONTROL01.CTL
Oracle Control File Parser
==============================================
File: E:\ORADATA\ORCL\CONTROL01.CTL
Size: 9781248 bytes (597 x 16KB blocks)
==============================================
        PARSE RESULTS
==============================================
--- Database Info ---
  DB_NAME    : ORCL
  CHARSET_ID : 852 (ZHS16GBK)
--- Data Files (type=04) - 9 found ---
---------------------------------------------
  FILE#  PATH
  -----  ----
  4     E:\ORADATA\ORCL\USERS01.DBF
  3     E:\ORADATA\ORCL\UNDOTBS01.DBF
  2     E:\ORADATA\ORCL\SYSAUX01.DBF
  1     E:\ORADATA\ORCL\SYSTEM01.DBF
--- Log Files (type=03) - 3 found ---
---------------------------------------
  GROUP  PATH                                  SIZE
  -----  ----                                  ----
  1      E:\ORADATA\ORCL\REDO01.LOG         524288000
  2      E:\ORADATA\ORCL\REDO02.LOG         524288000
  3      E:\ORADATA\ORCL\REDO03.LOG         524288000
--- Tablespaces - 8 found ---

9.2.1 自动生成的重建控制文件脚本

完成屏幕输出后,OBET 会在当前工作目录生成 rectl_<DB_NAME>_<YYYYMMDDHHMMSS>.sql,可作为 CREATE CONTROLFILE 重建命令的参考模板。

文件包含 CREATE CONTROLFILE 头、LOGFILE(同 group 多成员合并为 GROUP N (m1, m2) 元组写法)、DATAFILECHARACTER SET 与结尾分号 ;

无法自动获取 SIZE 的 redo 文件仍写入记录,并在文件尾部追加英文提示,便于人工干预。

生成成功时屏幕输出形如:

Control file rebuild SQL generated: rectl_ORCL_20260727151150.sql

9.3 rdba <hex>

把 RDBA 值拆解为 Oracle File# 和 Block#(高 10 位 = File#,低 22 位 = Block#)。

OBET> rdba 0x00400000
rdba 0x00400000 (4194304)
File#: 1
Block#: 0

9.4 getrdba <rfile#> <block#>

根据 rfile# 和 block# 计算 RDBA 值(rdba 的逆运算)。

OBET> getrdba 1 1
getrdba:
  rfile#: 1
  block#: 1
  RDBA:   0x00400001 (4194305)

9.5 dump_undo [file N] [block M]

undo$ 段读取每条 UNDO 记录的 namestatus$。默认 file 1 block 224(Oracle 某些版本 undo$ segment header 位置)。

OBET> dump_undo
OBET> dump_undo file 1 block 224
OBET> dump_undo file 1 block 224
==================================================
  DUMP UNDO$ - File#=1 (E:/CC/obet/dbf/SYSTEM01.DBF), Block=224
==================================================
Segment header kcbh.rdba=0x004000E0 => Oracle file#=1, block#=224 (listfile idx=1)
Reading undo$ segment header from file #1, block 224...
Segment header first 16 bytes (kcbh): 10 A2 00 00 E0 00 40 00 1A 02 00 00 00 00 01 04 
Found extent 0: rdba_block=225, size=7 blocks (covers blocks 225-231)
Data blocks to scan (7 total): 225 226 227 228 229 230 231 
US#=0    NAME=SYSTEM                          STATUS$=3  TS#=0   (system rollback segment)
US#=1    NAME=_SYSSMU1_3450900144$            STATUS$=2  TS#=2
US#=2    NAME=_SYSSMU2_2386332601$            STATUS$=2  TS#=2
...
Summary: scanned 7 blocks, extracted 21 rows from undo$.

9.6 patch_scn Linux 需授权

直接修改 Oracle 进程内存中的 SCN 字段。仅在 Linux 构建中可用。

用法 作用
patch_scn spid 列出本机 Oracle LOCAL=YES 进程
patch_scn addr 通过 sqlplus 辅助获取 SCN 在进程内存中的地址
patch_scn [<spid>] [<addr>] <newval> 把目标进程 SCN 改写为 newval

10. 会话 / 杂项

10.1 license

显示当前许可证状态、硬件ID、到期时间。

OBET> license
========================================
         OBET License Information
========================================
Your Hardware ID: F443C4B31A04E56FDC6D9310C1648AC700946AC5269DF2F6DBE8507FDC704812
License Status: AUTHORIZED
Expiry Time:    2030-01-01 23:00:00

10.2 spool <file> | off

把后续输出同时写入指定文件;spool off 停止。

OBET> spool dbv_session.log
OBET> dbv
OBET> spool off

11. 常见问题

Q1:Oracle 正在使用时能不能直接读取数据文件?

可以。Windows 下 OBET 以 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE 共享模式打开文件,Oracle 进程独占持有时 OBET 仍能读取。

Q2:如何切换数据文件?

open listfile.txt 加载列表,再用 set file N(或任意命令中的 file N 子句)切换。

Q3:写命令报 “license invalid / expired / hwid mismatch”?

授权与当前主机 HWID 绑定、存在有效期。用 license 命令查看当前授权状态,联系维护者重新签发 license.dat

Q4:forcecopy 与普通拷贝区别?

普通跨文件操作要求源块能正常读取;forcecopy 跳过 IO 失败的位置并填 0,专为磁盘部分损坏的应急场景设计,目标文件保持原始 blocksize 和块数。

Q5:p kcvfh.kcvfhhdr.kccfhtyp 为什么报错?

print 仅支持一级字段访问(如 p kcvfh.kcvfhhdr),不支持二级(如 p kcvfh.kcvfhhdr.kccfhtyp)。

Q6:build blockrepair block 区别?

build block N,M 是从无到有构造一个 Oracle 空块(填 0×00 + 初始化 kcbh/rdba),写入目标文件时需人工确认覆盖;适合块数据完全丢失的场景。

repair block 是读取目标块后原地修复 seq_kcbh、tailchk、checksum 三项,不改变块内容本身;适合块内容完好但校验值损坏的场景。