标签云
asm恢复 bbed bootstrap$ dul kcbzib_kcrsds_1 kccpb_sanity_check_2 kcratr_nab_less_than_odr MySQL恢复 obet ORA-00312 ORA-00704 ORA-00742 ORA-01110 ORA-01200 ORA-01555 ORA-01578 ORA-01595 ORA-600 2662 ORA-600 2663 ORA-600 3020 ORA-600 4000 ORA-600 4137 ORA-600 4193 ORA-600 4194 ORA-600 16703 ORA-600 kcbzib_kcrsds_1 ORA-600 KCLCHKBLK_4 ORA-600 kcratr_nab_less_than_odr ORA-15042 ORA-15196 ORACLE 12C oracle dul ORACLE PATCH Oracle Recovery Tools oracle加密恢复 oracle勒索 oracle勒索恢复 oracle异常恢复 ORACLE恢复 Oracle 恢复 ORACLE数据库恢复 oracle碎片 OSD-04016 YOUR FILES ARE ENCRYPTED 比特币加密文章分类
- Others (2)
- 中间件 (2)
- WebLogic (2)
- 操作系统 (112)
- 数据库 (1,877)
- DB2 (22)
- MySQL (82)
- Oracle (1,703)
- Data Guard (53)
- EXADATA (8)
- GoldenGate (24)
- ORA-xxxxx (168)
- ORACLE 12C (72)
- ORACLE 18C (6)
- ORACLE 19C (15)
- ORACLE 21C (3)
- Oracle 23ai (8)
- Oracle ASM (72)
- Oracle Bug (8)
- Oracle RAC (56)
- Oracle 安全 (6)
- Oracle 开发 (28)
- Oracle 监听 (29)
- Oracle备份恢复 (659)
- Oracle安装升级 (107)
- Oracle性能优化 (62)
- 专题索引 (5)
- 勒索恢复 (91)
- PostgreSQL (37)
- pdu工具 (7)
- PostgreSQL恢复 (13)
- SQL Server (34)
- SQL Server恢复 (14)
- TimesTen (7)
- 达梦数据库 (5)
- 达梦恢复 (3)
- 生活娱乐 (2)
- 至理名言 (11)
- 虚拟化 (2)
- VMware (2)
- 软件开发 (51)
- Asp.Net (9)
- JavaScript (12)
- PHP (2)
- 小工具 (34)
-
最近发表
- .bres勒索病毒加密数据库dmp文件可恢复
- ORA-600 krsm_mrp_rebuild_lf_list.lno_mismatch
- 记录一次0丢失的ORA-00354: 损坏重做日志块标头故障恢复
- 不当数据库恢复操作导致一个月数据丢失
- obet快速修复oracle 位图损坏块
- 不太常见的10.2.0.1的oracle redo损坏恢复
- obet forcecopy功能抢救硬件故障中的数据文件
- kcratr_nab_less_than_odr和system坏块故障处理
- 通过obet 恢复system坏块,打开数据库
- obet dbv功能完整说明
- 分享一例运行在aix上的sap系统数据库恢复过程
- OBET-Oracle Block Editor Tool使用说明
- 几乎动用了所有手段的Oracle故障恢复
- Oracle Block Edit Tool (obet) 功能增强–2026.07
- Oracle 19c 202607补丁(RUs+OJVM)-19.32
- Patch_SCN快速修复ORA-01555数据库open故障
- 快速处理 ORA-01210: data file header is media corrupt 故障
- ORA-00314: log 3 of thread 1, expected sequence# N doesn’t match 0
- 记录block 0损坏,数据文件大量坏块,使用不当数据库版本恢复等各种操作之后的故障处理
- 需要注意:dbv 检测controlfile可能不准
标签归档:obet
kcratr_nab_less_than_odr和system坏块故障处理
学校客户由于机房断电,导致数据库异常.现场工程师进行了现场备份,然后尝试强制拉库,结果没有成功,大概报错和操作过程如下:
断电之后启动数据库,数据库报ORA-600 kcratr_nab_less_than_odr故障解决错误,这个是一种非常常见的操作,一般是由于写丢失导致,以前有过很多类似恢复经历:
ORA-600 kcratr_nab_less_than_odr故障解决
差点被误操作的ORA-600 kcratr_nab_less_than_odr故障
ORA-600 kcratr_nab_less_than_odr和ORA-600 2662故障处理
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理
Tue Aug 18 23:59:19 2026 ALTER DATABASE OPEN This instance was first to open Beginning crash recovery of 2 threads parallel recovery started with 19 processes Started redo scan Completed redo scan read 21634 KB redo, 800 data blocks need recovery Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_ora_275950.trc (incident=703037): ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [6916], [3], [4], [], [], [], [] Incident details in: /u01/app/oracle/diag/rdbms/orcl/orcl2/incident/incdir_703037/orcl2_ora_275950_i703037.trc Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. Abort recovery for domain 0 Aborting crash recovery due to error 600 Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_ora_275950.trc: ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [6916], [3], [4], [], [], [], [] Abort recovery for domain 0 Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_ora_275950.trc: ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [6916], [3], [4], [], [], [], [] ORA-600 signalled during: ALTER DATABASE OPEN...
现场恢复人员上来之后,直接尝试做强制resetlogs操作,数据库报ORA-600 ORA-600 krsi_al_hdr_update.15错误,主要是由于redo写丢失导致无法resetlogs成功,具体参考:Alter Database Open Resetlogs returns error ORA-00600: [krsi_al_hdr_update.15], (Doc ID 2026541.1) Oracle断电故障处理
Wed Aug 19 00:28:47 2026 alter database open resetlogs RESETLOGS is being done without consistancy checks. This may result in a corrupted database. The database should be recreated. RESETLOGS after incomplete recovery UNTIL CHANGE 29721342127 Archived Log entry 38935 added for thread 1 sequence 6916 ID 0xceea62af dest 1: ARCH: All Archive destinations made inactive due to error 742 ARCH: Closing local archive destination LOG_ARCHIVE_DEST_1: '+ARCHDG/2_19951_1224781365.arc' (error 742)(orcl2) Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_ora_287355.trc (incident=727038): ORA-00600: internal error code, arguments: [krsi_al_hdr_update.15], [4294967295], [], [], [], [], [], [], [] Incident details in: /u01/app/oracle/diag/rdbms/orcl/orcl2/incident/incdir_727038/orcl2_ora_287355_i727038.trc Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. Master archival failure: 600 Archive all online redo logfiles failed:600 ORA-600 signalled during: alter database open resetlogs...
通过 ALTER DATABASE RECOVER database using backup controlfile until cancel之后,继续尝试强制打开库,报ORA-600 2662错误.
Wed Aug 19 00:40:25 2026 Checker run found 32 new persistent data failures alter database open resetlogs RESETLOGS is being done without consistancy checks. This may result in a corrupted database. The database should be recreated. RESETLOGS after incomplete recovery UNTIL CHANGE 29721342127 Archived Log entry 38936 added for thread 1 sequence 6915 ID 0xceea62af dest 1: Archived Log entry 38937 added for thread 1 sequence 6916 ID 0xceea62af dest 1: Archived Log entry 38938 added for thread 2 sequence 19951 ID 0xceea62af dest 1: Archived Log entry 38939 added for thread 2 sequence 19950 ID 0xceea62af dest 1: Clearing online redo logfile 1 +DATADG/orcl/onlinelog/group_1.319.1224781365 Clearing online log 1 of thread 1 sequence number 6915 Wed Aug 19 00:40:34 2026 Clearing online redo logfile 1 complete Clearing online redo logfile 2 +DATADG/orcl/onlinelog/group_2.320.1224781367 Clearing online log 2 of thread 1 sequence number 6916 Clearing online redo logfile 2 complete Clearing online redo logfile 3 +DATADG/orcl/onlinelog/group_3.323.1224781463 Clearing online log 3 of thread 2 sequence number 19951 Clearing online redo logfile 3 complete Clearing online redo logfile 4 +DATADG/orcl/onlinelog/group_4.324.1224781465 Clearing online log 4 of thread 2 sequence number 19950 Clearing online redo logfile 4 complete Resetting resetlogs activation ID 3471467183 (0xceea62af) Online log +DATADG/orcl/onlinelog/group_1.319.1224781365: Thread 1 Group 1 was previously cleared Online log +ARCHDG/orcl/onlinelog/group_1.4574.1224781367: Thread 1 Group 1 was previously cleared Online log +DATADG/orcl/onlinelog/group_2.320.1224781367: Thread 1 Group 2 was previously cleared Online log +ARCHDG/orcl/onlinelog/group_2.10729.1224781369: Thread 1 Group 2 was previously cleared Online log +DATADG/orcl/onlinelog/group_3.323.1224781463: Thread 2 Group 3 was previously cleared Online log +ARCHDG/orcl/onlinelog/group_3.12866.1224781463: Thread 2 Group 3 was previously cleared Online log +DATADG/orcl/onlinelog/group_4.324.1224781465: Thread 2 Group 4 was previously cleared Online log +ARCHDG/orcl/onlinelog/group_4.7527.1224781465: Thread 2 Group 4 was previously cleared Wed Aug 19 00:40:43 2026 Setting recovery target incarnation to 3 Wed Aug 19 00:40:43 2026 Assigning activation ID 3488382552 (0xcfec7e58) Thread 2 opened at log sequence 1 Current log# 3 seq# 1 mem# 0: +DATADG/orcl/onlinelog/group_3.323.1224781463 Current log# 3 seq# 1 mem# 1: +ARCHDG/orcl/onlinelog/group_3.12866.1224781463 Successful open of redo thread 2 MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set Wed Aug 19 00:40:43 2026 SMON: enabling cache recovery Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_ora_291405.trc (incident=739007): ORA-00600: internal error code, arguments: [2662], [6], [3951555809], [6], [3951556555], [12583040], [], [] Incident details in: /u01/app/oracle/diag/rdbms/orcl/orcl2/incident/incdir_739007/orcl2_ora_291405_i739007.trc Wed Aug 19 00:40:45 2026 Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_ora_291405.trc: ORA-00600: internal error code, arguments: [2662], [6], [3951555809], [6], [3951556555], [12583040], [], [] Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_ora_291405.trc: ORA-00600: internal error code, arguments: [2662], [6], [3951555809], [6], [3951556555], [12583040], [], [] Error 600 happened during db open, shutting down database USER (ospid: 291405): terminating the instance due to error 600 Instance terminated by USER, pid = 291405 ORA-1092 signalled during: alter database open resetlogs...
到这一步,现场停止了继续尝试,我接手故障处理.先dbv检测坏块,发现system有两个坏块
[oracle@db3 ~]$ dbv userid=sys/oracle file=/datapool/cold_backup_20260818/SYSTEM.314.1224781265 DBVERIFY: Release 11.2.0.4.0 - Production on Sat Aug 22 10:39:26 2026 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. DBVERIFY - Verification starting : FILE = /datapool/cold_backup_20260818/SYSTEM.314.1224781265 Page 94587 is marked corrupt Corrupt block relative dba: 0x0041717b (file 1, block 94587) Bad header found during dbv: Data in bad block: type: 11 format: 2 rdba: 0x00400001 last change scn: 0x0000.00000000 seq: 0x1 flg: 0x04 spare1: 0x0 spare2: 0x0 spare3: 0x0 consistency value in tail: 0x00000b01 check value in block header: 0xd49 computed block checksum: 0x0 Page 95021 is marked corrupt Corrupt block relative dba: 0x0041732d (file 1, block 95021) Bad header found during dbv: Data in bad block: type: 11 format: 2 rdba: 0x00400001 last change scn: 0x0000.00000000 seq: 0x1 flg: 0x04 spare1: 0x0 spare2: 0x0 spare3: 0x0 consistency value in tail: 0x00000b01 check value in block header: 0xd49 computed block checksum: 0x0 DBVERIFY - Verification complete Total Pages Examined : 157440 Total Pages Processed (Data) : 72079 Total Pages Failing (Data) : 0 Total Pages Processed (Index): 21854 Total Pages Failing (Index): 0 Total Pages Processed (Other): 49484 Total Pages Processed (Seg) : 1 Total Pages Failing (Seg) : 0 Total Pages Empty : 14021 Total Pages Marked Corrupt : 2 Total Pages Influx : 0 Total Pages Encrypted : 0 Highest block SCN : 0 (0.0)
OBET> dbv file 1 =============================================== DBV (Data Block Verification) Block Size: 8192 bytes Endian: little-endian (x86) Target File: #1(only) =============================================== Verifying file #1: /datapool/cold_backup_20260818/SYSTEM.314.1224781265 (157441 blocks) - Started: 2026-08-22 11:14:48 File #32: rfile=1 (0x00000001) header_block_num=157440 (0x00026700) filesize_status:OK Progress: 100000 / 157441 blocks checked... File #1completed: 0 all zero, 0 soft corrupted, 2 tailchk error, 0 checksum error, 0 rdba error DBV completed at: 2026-08-22 11:14:59 =============================================== DBV Summary: Total blocks checked: 157439 Total all zero blocks found: 0 Total all rdba error blocks found: 0 Total all tailchk error blocks found: 2 Total all soft corrupted blocks found: 0 Total all checksum error blocks found: 0 Total bad blocks found: 2 Execution time: 11.00 seconds Throughput: 111.82 MB/s =============================================== Detailed report saved to: dbv_file_32_20260822111448.log Files processed: 1 OBET> list corrupt file 1(/datapool/cold_backup_20260818/SYSTEM.314.1224781265) total bad blocks: 2 block# bad block type 94587 tailchk 95021 tailchk
使用obet修复坏块
Oracle Block Editor Tool使用手册
OBET> set file 32 filename set to: /datapool/cold_backup_20260818/SYSTEM.314.1224781265 (file#1) OBET> set block 94587 block set to: 94587 OBET> set mode edit mode set to: edit OBET> repair block Warning: Missing value for 'block', using global setting: 94587 Repairing block 94587 in file /datapool/cold_backup_20260818/SYSTEM.314.1224781265... Repair analysis for block 94587: 1. seq_kcbh check: 0x01 -> OK 2. Tailchk check: 0x0106C0E4 -> needs repair (0xE4C00601) 3. Checksum check: 0x5EC5 -> needs repair (0x7DE6) Confirm repair operations: File: /datapool/cold_backup_20260818/SYSTEM.314.1224781265 Block: 94587 Operations needed: fix tailchk, fix checksum Confirm? (Y/YES to proceed): y Verification after repair: 1. seq_kcbh: 0x01 OK 2. Tailchk: 0x0106C0E4 OK 3. Checksum: 0x7DE6 OK Block 94587 repair completed successfully. OBET> set block 95021 block set to: 95021 OBET> repair block Warning: Missing value for 'block', using global setting: 95021 Repairing block 95021 in file /datapool/cold_backup_20260818/SYSTEM.314.1224781265... Repair analysis for block 95021: 1. seq_kcbh check: 0x01 -> OK 2. Tailchk check: 0xF8FA0601 -> needs repair (0xE06C0601) 3. Checksum check: 0x81BA -> OK Confirm repair operations: File: /datapool/cold_backup_20260818/SYSTEM.314.1224781265 Block: 95021 Operations needed: fix tailchk Confirm? (Y/YES to proceed): y Verification after repair: 1. seq_kcbh: 0x01 OK 2. Tailchk: 0x01066CE0 OK 3. Checksum: 0x81BA OK Block 95021 repair completed successfully.
dbv检查确认坏块修复成功
[oracle@db3 ~]$ dbv file=/datapool/cold_backup_20260818/SYSTEM.314.1224781265 DBVERIFY: Release 11.2.0.4.0 - Production on Sat Aug 22 11:17:30 2026 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. DBVERIFY - Verification starting : FILE = /datapool/cold_backup_20260818/SYSTEM.314.1224781265 DBVERIFY - Verification complete Total Pages Examined : 157440 Total Pages Processed (Data) : 72080 Total Pages Failing (Data) : 0 Total Pages Processed (Index): 21855 Total Pages Failing (Index): 0 Total Pages Processed (Other): 49484 Total Pages Processed (Seg) : 1 Total Pages Failing (Seg) : 0 Total Pages Empty : 14021 Total Pages Marked Corrupt : 0 Total Pages Influx : 0 Total Pages Encrypted : 0 Highest block SCN : 3951556890 (6.3951556890)
后面的恢复比较简单,使用客户恢复之前的备份,直接重建ctl,然后打开库成功,并且做rman校验没有异常,直接把恢复之后的库备份还原到asm里面,完成本次恢复任务
通过obet 恢复system坏块,打开数据库
客户由于误操作直接在虚拟化平台点击电源键,强制关闭了正在运行的数据库服务器虚机,导致数据库无法正常启动,检查发现ntfs文件系统损坏

通过obet工具检测数据文件坏块(obet dbv功能完整说明),发现核心的system文件上面有一些坏块
File #1: D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF (225281 blocks) - Started: 2026-08-21 16:40:23 File #1: rfile=1 (0x00000001) header_block_num=225280 (0x00037000) filesize_status:OK file 1, block 212238: tailchk error (expected 0x0106276F, got 0x01065E92), bad block file 1, block 213507: tailchk error (expected 0x0106276F, got 0x01065E92), bad block file 1, block 213515: tailchk error (expected 0x01065E92, got 0x0106276F), bad block file 1, block 213547: tailchk error (expected 0x0106276F, got 0x01065E92), bad block file 1, block 213555: tailchk error (expected 0x01065E92, got 0x0106276F), bad block file 1, block 221387: tailchk error (expected 0x0106276F, got 0x01065E92), bad block file 1, block 221403: tailchk error (expected 0x01065E92, got 0x0106B19C), bad block file 1, block 221419: tailchk error (expected 0x01065E92, got 0x0106C7E3), bad block file 1, block 222117: tailchk error (expected 0x01065E92, got 0x0106276F), bad block file 1, block 222133: tailchk error (expected 0x0106276F, got 0x01065E92), bad block file 1, block 222141: tailchk error (expected 0x01065E92, got 0x0106276F), bad block file 1, block 222173: tailchk error (expected 0x0106C7E3, got 0x01065E92), bad block File #1 completed: 0 all zero, 0 soft corrupted, 12 tailchk error, 0 checksum error, 0 rdba error
这个12个坏块的数量和dbv检测结果一致
DBVERIFY: Release 19.0.0.0.0 - Production on 星期五 8月 21 17:37:02 2026 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. DBVERIFY - 开始验证: FILE = D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF 页 212238 流入 - 很可能是介质损坏 Corrupt block relative dba: 0x00433d0e (file 1, block 212238) Fractured block found during dbv: Data in bad block: type: 6 format: 2 rdba: 0x00433d0e last change scn: 0x0000.0002.d71a6f27 seq: 0x1 flg: 0x06 spare3: 0x0 consistency value in tail: 0x925e0601 check value in block header: 0x93bb computed block checksum: 0xfd79 ………… 页 222173 流入 - 很可能是介质损坏 Corrupt block relative dba: 0x004363dd (file 1, block 222173) Fractured block found during dbv: Data in bad block: type: 6 format: 2 rdba: 0x004363dd last change scn: 0x0000.0002.d708e3c7 seq: 0x1 flg: 0x06 spare3: 0x0 consistency value in tail: 0x925e0601 check value in block header: 0xe089 computed block checksum: 0x7199 DBVERIFY - 验证完成 检查的页总数: 225280 处理的页总数 (数据): 125451 失败的页总数 (数据): 0 处理的页总数 (索引): 29984 失败的页总数 (索引): 0 处理的页总数 (其他): 48214 处理的总页数 (段) : 1 失败的总页数 (段) : 0 空的页总数: 21619 标记为损坏的总页数: 12 流入的页总数: 12 加密的总页数 : 0 最高块 SCN : 12199365950 (2.3609431358)
使用obet的reair block功能进行修复(obet repair block使用说明)
OBET> set file 1 filename set to: D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF (file#1) OBET> set block 212238 block set to: 212238 OBET> d File: D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF Block: 212238 Offsets: 0 to 31 -------------------------------------------------------------------------------- 67A1C000 06A20000 0E3D4300 276F1AD7 02000106 BB930000 02000000 D0020000 E46E1AD7 <32 bytes read> OBET> tailchk Check tailchk for File D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF, Block 212238: current = 0x925E0601, required = 0x6F270601 OBET> backup Backing up file #1, block 212238 Successfully backed up block 212238 from D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF to backup_blk\SYSTEM01.DBF.212238_20260821173825.blk OBET> set mode edit mode set to: edit OBET> repair Usage: repair [subcommand] repair block [file N] [X] - Repair tailchk/checksum (optional: file N, block X) repair blkscn [file N] [X] - Repair block SCN (optional: file N, block X) OBET> repair block Warning: Missing value for 'block', using global setting: 212238 Repairing block 212238 in file D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF... Repair analysis for block 212238: 1. seq_kcbh check: 0x01 -> OK 2. Tailchk check: 0x925E0601 -> needs repair (0x6F270601) 3. Checksum check: 0xBB93 -> OK Confirm repair operations: File: D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF Block: 212238 Operations needed: fix tailchk Confirm? (Y/YES to proceed): y Verification after repair: 1. seq_kcbh: 0x01 OK 2. Tailchk: 0x6F270601 OK 3. Checksum: 0xBB93 OK Block 212238 repair completed successfully.
所有坏块依次进行修复,然后再次使用dbv检测
DBVERIFY: Release 19.0.0.0.0 - Production on 星期五 8月 21 17:42:02 2026 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. DBVERIFY - 开始验证: FILE = D:\APP\ADMINISTRATOR\ORADATA\NHIS\SYSTEM01.DBF Block Checking: DBA = 4407811, Block Type = KTB-managed data block **** actual rows locked by itl 2 = 0 != # in trans. header = 1 **** actual rows locked by itl 3 = 0 != # in trans. header = 1 ---- end index block validation 页 213507 失败, 校验代码为 6401 Block Checking: DBA = 4407819, Block Type = KTB-managed data block **** row 120: key out of order **** actual rows locked by itl 2 = 0 != # in trans. header = 1 **** actual rows marked deleted = 1 != kdxlende = 0 ---- end index block validation 页 213515 失败, 校验代码为 6401 DBVERIFY - 验证完成 检查的页总数: 225280 处理的页总数 (数据): 125451 失败的页总数 (数据): 0 处理的页总数 (索引): 29996 失败的页总数 (索引): 2 处理的页总数 (其他): 48214 处理的总页数 (段) : 1 失败的总页数 (段) : 0 空的页总数: 21619 标记为损坏的总页数: 0 流入的页总数: 0 加密的总页数 : 0 最高块 SCN : 12199365950 (2.3609431358)
有两个block有少量逻辑错误,可以通过数据库级别设置进行跳过,基本上实现了这个12个坏块的自动修复.后续就是数据库的打开过程
SQL> startup mount pfile='d:/pfile.txt'
ORACLE 例程已经启动。
Total System Global Area 1.2885E+10 bytes
Fixed Size 16120656 bytes
Variable Size 7751073792 bytes
Database Buffers 5100273664 bytes
Redo Buffers 17432576 bytes
数据库装载完毕。
SQL> recover database;
ORA-00283: 恢复会话因错误而取消
ORA-00742: 日志读取在线程 1 序列 19828 块 11511 中检测到写入丢失情况
ORA-00312: 联机日志 2 线程 1: 'D:\APP\ADMINISTRATOR\ORADATA\NHIS\REDO02.LOG'
SQL> RECOVER DATABASE UNTIL TIME '2026-08-21:13:28:56' USING BACKUP CONTROLFILE;
ORA-00279: change 12198905983 generated at 08/21/2026 12:43:18 needed for
thread 1
ORA-00289: suggestion :
D:\APP\ADMINISTRATOR\PRODUCT\19.0.0\DBHOME_1\RDBMS\ARC0000019827_1199133733.0001
ORA-00280: change 12198905983 for thread 1 is in sequence #19827
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
D:\APP\ADMINISTRATOR\ORADATA\NHIS\REDO01.LOG
ORA-00279: change 12199301614 generated at 08/21/2026 13:27:06 needed for
thread 1
ORA-00289: suggestion :
D:\APP\ADMINISTRATOR\PRODUCT\19.0.0\DBHOME_1\RDBMS\ARC0000019828_1199133733.0001
ORA-00280: change 12199301614 for thread 1 is in sequence #19828
ORA-00278: log file 'D:\APP\ADMINISTRATOR\ORADATA\NHIS\REDO01.LOG' no longer
needed for this recovery
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
D:\APP\ADMINISTRATOR\ORADATA\NHIS\REDO02.LOG
ORA-00756: 鎭㈠鎿嶄綔妫€娴嬪埌鏁版嵁鍧楀啓鍏ヤ涪澶?ORA-10567:
Redo is inconsistent with data block (file# 4, block# 31663, file offset is 259383296 bytes)
ORA-10564: tablespace UNDOTBS1
ORA-01110: 鏁版嵁鏂囦欢 4: 'D:\APP\ADMINISTRATOR\ORADATA\NHIS\UNDOTBS01.DBF'
ORA-10560: block type 'KTU UNDO BLOCK'
ORA-01112: media recovery not started
SQL> alter database open resetlogs;
Database altered.
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 进入编辑模式,并在出现确认提示时输入 Y 或 YES 才会执行写入。 backup 仅复制块到本地目录,不需授权。未授权时仅允许只读命令。2. 开发者信息
| 姓名 | XiFenFei |
|---|---|
| 电话 | +86-17813235971 |
| 邮箱 | dba@xifenfei |
| 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 上下文。所有读写命令都依赖当前的 filename、blocksize、block、offset、count、endian 等参数。
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
显示当前上下文所有参数,包括 Mode(browse / edit)、Filename、File#、Block#、Blocksize、Offset、Count、Endian 等。
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.txtlistfile remove:删除当前目录的listfile.txtlistfile edit [path]:调用系统编辑器(Windows 记事本 / Linuxvi)打开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 校验。扫描结果自动保存到日志文件:
dbv→dbv_yyyymmddhhmmss.logdbv file N→dbv_file_N_yyyymmddhhmmss.logdbv file N block M→dbv_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] 需授权
写入十六进制字节。写入后自动重新计算 tailchk 与 checksum。需先 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_kcbh、tailchk、checksumrepair 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进入编辑模式
开始写入前需输入 Y 或 YES 二次确认(忽略大小写)。
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 列由三级回退得到:
- 操作系统上读取到的 redo 文件大小减去 512 字节(Oracle redo 文件尾部的 512 字节 footer);
- 若 OS 文件无法访问(文件丢失 / 不可读),从控制文件第 21 / 22 块中 redo 记录(72 字节 / 条)的块数 × 512 字节取得;
- 上述两者都不可用时显示
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) 元组写法)、DATAFILE、CHARACTER 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 记录的 name 和 status$。默认 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 block 和 repair block 区别?
build block N,M 是从无到有构造一个 Oracle 空块(填 0×00 + 初始化 kcbh/rdba),写入目标文件时需人工确认覆盖;适合块数据完全丢失的场景。
repair block 是读取目标块后原地修复 seq_kcbh、tailchk、checksum 三项,不改变块内容本身;适合块内容完好但校验值损坏的场景。


加我微信(17813235971)
加我QQ(107644445)

