
一:通过10046跟踪open过程,需要读取file#=1 block#=1,即SYSTEM文件头;二:通过dump查看SYSTEM文件头信息;三:模拟SYSTEM文件头损坏;四:SYSTEM文件头损坏影响;五:SYSTEM文件头损坏详细修复过程;包括如下13步骤:1. rdba_kcbh(offset 4) 文件头block的rdba地址2. kccfhfsz (offset 44) 文件大小3. kccfhfno (offset 52) datafile文件号4. kcvfhrdb (offset 96) root dba5. kscnbas (offset 100) v$datafile.creation_change#6. kcvfhcrt (offset 108) v$datafile.creation_time7. kcvfhsta (offset 138) 文件状态8. kcvfhtsn (offset 332) 表空间号v$datafile.ts#9. kcvfhtln (offset 336) 表空间名称字符长度10.kcvfhtnm (offset 338) 表空间名称v$tablespace.name11.kcvfhrfn (offset 368) 相对文件号v$datafile.rfile#12.kscnbas (offset 484) checkpoint scn13.kcvcptim (offset 492) last checkpoint time---14.kcvfhcpc (offset 144) Datafile checkpoint count(不需要)

一:通过10046跟踪open过程,需要读取file#=1 block#=1,即SYSTEM文件头。
[oracle@cjc-db-01 ~]$ sqlplus as sysdbastartup mount;alter session set events '10046 trace name context forever,level 8';alter database open;alter session set events '10046 trace name context off';select value from v$diag_info where name='Default Trace File';VALUE--------------------------------------------------------------------------------/oracle/app/oracle/diag/rdbms/cjc/cjc/trace/cjc_ora_5163.trccp /oracle/app/oracle/diag/rdbms/cjc/cjc/trace/cjc_ora_5163.trc /home/oracle/tmp/
查看文件
[oracle@cjc-db-01 tmp]$ vi cjc_ora_5163.trcWAIT #140737299719984: nam='db file sequential read' ela= 7 file#=1 block#=1 blocks=1 obj#=-1 tim=1728793861760782WAIT #140737299719984: nam='db file sequential read' ela= 4 file#=2 block#=1 blocks=1 obj#=-1 tim=1728793861760827WAIT #140737299719984: nam='db file sequential read' ela= 3 file#=3 block#=1 blocks=1 obj#=-1 tim=1728793861760858WAIT #140737299719984: nam='db file sequential read' ela= 4 file#=4 block#=1 blocks=1 obj#=-1 tim=1728793861760875WAIT #140737299719984: nam='db file sequential read' ela= 4 file#=5 block#=1 blocks=1 obj#=-1 tim=1728793861760891
数据库open时会扫描所有数据文件头,当然也包括system01.dbf文件的block 1。
SQL> set line 100SQL> col name for a50SQL> select * from v$dbfile order by file#;FILE# NAME---------- --------------------------------------------------1 oracle/app/oracle/oradata/cjc/system01.dbf2 oracle/app/oracle/oradata/cjc/sysaux01.dbf3 oracle/app/oracle/oradata/cjc/undotbs01.dbf4 oracle/app/oracle/oradata/cjc/users01.dbf5 oracle/app/oracle/oradata/cjc/cjc01.dbf

二:通过dump查看SYSTEM文件头信息
select spid from v$process where addr in (select paddr from v$session where sid = (select sid from v$mystat where rownum=1));SPID------------------------6264alter system set events 'immediate trace name file_hdrs level 3';[oracle@cjc-db-01 trace]$ cp cjc_ora_6264.trc home/oracle/tmp/[oracle@cjc-db-01 tmp]$ vi cjc_ora_6264.trcDATA FILE #1:name #7: oracle/app/oracle/oradata/cjc/system01.dbfcreation size=0 block size=8192 status=0xe head=7 tail=7 dup=1tablespace 0, index=1 krfil=1 prev_file=0unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00Checkpoint cnt:122 scn: 0x0000.0010e5b2 10/13/2024 12:31:02Stop scn: 0xffff.ffffffff 10/13/2024 12:30:15Creation Checkpointed at scn: 0x0000.00000007 08/24/2013 11:37:33thread:0 rba:(0x0.0.0)......Offline scn: 0x0000.000e2005 prev_range: 0Online Checkpointed at scn: 0x0000.000e2006 08/17/2024 12:43:52thread:1 rba:(0x1.2.0)......Online move state: 0V10 STYLE FILE HEADER:Compatibility Vsn = 186647552=0xb200400Db ID=3819394245=0xe3a754c5, Db Name='CJC'Activation ID=0=0x0Control Seq=1015=0x3f7, File size=96000=0x17700File Number=1, Blksiz=8192, File Type=3 DATATablespace #0 - SYSTEM rel_fn:1Creation at scn: 0x0000.00000007 08/24/2013 11:37:33Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0reset logs count:0x462b5888 scn: 0x0000.000e2006prev reset logs count:0x3121c97a scn: 0x0000.00000001recovered at 09/06/2024 21:15:45status:0x2004 root dba:0x00400208 chkpt cnt: 122 ctl cnt:121begin-hot-backup file size: 0

三:模拟system文件头损坏
测试之前,先停库冷备。
登陆BBED工具:
已在环境变量配置了bbed别名
[oracle@cjc-db-01 ~]$ cat .bash_profile |grep bbedalias bbed='bbed parfile=/home/oracle/bbed/bbed.par password=blockedit'
直接登陆
[oracle@cjc-db-01 ~]$ bbedBBED: Release 2.0.0.0.0 - Limited Production on Sun Oct 13 12:52:16 2024Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.************* !!! For Oracle Internal Use only !!! ***************BBED> infoFile# Name Size(blks)----- ---- ----------1 oracle/app/oracle/oradata/cjc/system01.dbf 960002 oracle/app/oracle/oradata/cjc/sysaux01.dbf 665603 oracle/app/oracle/oradata/cjc/undotbs01.dbf 89604 oracle/app/oracle/oradata/cjc/users01.dbf 6405 oracle/app/oracle/oradata/cjc/cjc01.dbf 1280
查看 file 1 block 1 信息
BBED> set file 1 block 1FILE# 1BLOCK# 1BBED> map vFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Dba:0x00400001------------------------------------------------------------Data File Headerstruct kcvfh, 860 bytes @0struct kcvfhbfh, 20 bytes @0struct kcvfhhdr, 76 bytes @20ub4 kcvfhrdb @96struct kcvfhcrs, 8 bytes @100ub4 kcvfhcrt @108ub4 kcvfhrlc @112struct kcvfhrls, 8 bytes @116ub4 kcvfhbti @124struct kcvfhbsc, 8 bytes @128ub2 kcvfhbth @136ub2 kcvfhsta @138struct kcvfhckp, 36 bytes @484ub4 kcvfhcpc @140ub4 kcvfhrts @144ub4 kcvfhccc @148struct kcvfhbcp, 36 bytes @152ub4 kcvfhbhz @312struct kcvfhxcd, 16 bytes @316sword kcvfhtsn @332ub2 kcvfhtln @336text kcvfhtnm[30] @338ub4 kcvfhrfn @368struct kcvfhrfs, 8 bytes @372ub4 kcvfhrft @380struct kcvfhafs, 8 bytes @384ub4 kcvfhbbc @392ub4 kcvfhncb @396ub4 kcvfhmcb @400ub4 kcvfhlcb @404ub4 kcvfhbcs @408ub2 kcvfhofb @412ub2 kcvfhnfb @414ub4 kcvfhprc @416struct kcvfhprs, 8 bytes @420struct kcvfhprfs, 8 bytes @428ub4 kcvfhtrt @444ub4 tailchk @8188BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 0 to 511 Dba:0x00400001------------------------------------------------------------------------0ba20000 01004000 00000000 00000104 b4610000 00000000 0004200b c554a7e3434a4300 00000000 f7030000 00770100 00200000 01000300 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000008024000 07000000 00000000 7dc92131 88582b46 06200e00 00000000 0000000000000000 00000000 00000420 7a000000 812e4646 79000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 06005359 5354454d 00000000 0000000000000000 00000000 00000000 00000000 01000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0a000a007ac92131 01000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 b2e51000 00000000 86cc7746 01000000 0d000000 994f0100 10000000<32 bytes per line>
模拟file 1 block 1损坏,用file 5 block 10覆盖file 1 block 10
BBED> copy file 5 block 10 to file 1 block 1Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) YFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 0 to 511 Dba:0x00400001------------------------------------------------------------------------1ea20000 0a004001 61bb0e00 00000104 e9010000 05000000 80403600 0000000000000000 00f80000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x01e9, required = 0x01e9

四:SYSTEM文件头损坏影响
数据库无法正常关闭,报错如下:
SQL> shutdown immediateORA-01122: database file 1 failed verification checkORA-01110: data file 1: '/oracle/app/oracle/oradata/cjc/system01.dbf'ORA-01210: data file header is media corrupt
告警日志如下:
Sun Oct 13 12:57:27 2024Shutting down instance (immediate)Stopping background process SMCOShutting down instance: further logons disabledRead of datafile '/oracle/app/oracle/oradata/cjc/system01.dbf' (fno 1) header failed with ORA-01210Hex dump of (file 1, block 1) in trace file oracle/app/oracle/diag/rdbms/cjc/cjc/trace/cjc_ora_5163.trcCorrupt block relative dba: 0x00400001 (file 1, block 1)Bad header found during datafile header readData in bad block:type: 30 format: 2 rdba: 0x0140000alast change scn: 0x0000.000ebb61 seq: 0x1 flg: 0x04spare1: 0x0 spare2: 0x0 spare3: 0x0consistency value in tail: 0xbb611e01check value in block header: 0x1e9computed block checksum: 0x0Rereading datafile 1 header failed with ORA-01210Sun Oct 13 12:57:28 2024Checker run found 1 new persistent data failures
查看对应trace日志
vi oracle/app/oracle/diag/rdbms/cjc/cjc/trace/cjc_ora_5163.trc......*** 2024-10-13 12:57:27.534Stopping background process SMCORead of datafile '/oracle/app/oracle/oradata/cjc/system01.dbf' (fno 1) header failed with ORA-01210Hex dump of (file 1, block 1)Dump of memory from 0x00007FFFF4AC0C00 to 0x00007FFFF4AC2C007FFFF4AC0C00 0000A21E 0140000A 000EBB61 04010000 [......@.a.......]7FFFF4AC0C10 000001E9 00000005 00364080 00000000 [.........@6.....]7FFFF4AC0C20 00000000 0000F800 00000000 00000000 [................]7FFFF4AC0C30 00000000 00000000 00000000 00000000 [................]Repeat 507 times7FFFF4AC2BF0 00000000 00000000 00000000 BB611E01 [..............a.]Corrupt block relative dba: 0x00400001 (file 1, block 1)Bad header found during datafile header readData in bad block:type: 30 format: 2 rdba: 0x0140000alast change scn: 0x0000.000ebb61 seq: 0x1 flg: 0x04......
强制关闭数据库
SQL> shutdown abort
启动数据库,报错
SQL> startupORACLE instance started.Total System Global Area 563691520 bytesFixed Size 2255232 bytesVariable Size 222299776 bytesDatabase Buffers 335544320 bytesRedo Buffers 3592192 bytesDatabase mounted.ORA-01122: database file 1 failed verification checkORA-01110: data file 1: '/oracle/app/oracle/oradata/cjc/system01.dbf'ORA-01210: data file header is media corrupt
ORA-01210 错误说明:
[oracle@cjc-db-01 ~]$ oerr ora 0121001210, 00000, "data file header is media corrupt"// *Cause: The file header block is internally inconsistent. The beginning// of the block has a header with a checksum and other data for// insuring the consistancy of the block. It is possible that// the last disk write did not operate correctly. The most likely// problem is that this is not a datafile for any database.// *Action: Have operating system make correct file available to database.// If the trace file dump indicates that only the checksum is wrong,// restore from a backup and do media recovery.
通过 dbv 工具进行查看:
oracle@cjc-db-01 ~]$ dbv file=/oracle/app/oracle/oradata/cjc/system01.dbf start=1 end=2DBVERIFY: Release 11.2.0.4.0 - Production on Sun Oct 13 13:02:49 2024Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.DBVERIFY - Verification starting : FILE = oracle/app/oracle/oradata/cjc/system01.dbfPage 1 is marked corruptCorrupt block relative dba: 0x00000001 (file 0, block 1)Bad header found during dbv:Data in bad block:type: 30 format: 2 rdba: 0x0140000alast change scn: 0x0000.000ebb61 seq: 0x1 flg: 0x04spare1: 0x0 spare2: 0x0 spare3: 0x0consistency value in tail: 0xbb611e01check value in block header: 0x1e9computed block checksum: 0x0Page 2 is marked corruptCorrupt block relative dba: 0x00000002 (file 0, block 2)Bad header found during dbv:Data in bad block:type: 29 format: 2 rdba: 0x00400002last change scn: 0x0000.0010a41d seq: 0x2 flg: 0x04spare1: 0x0 spare2: 0x0 spare3: 0x0consistency value in tail: 0xa41d1d02check value in block header: 0xac8ccomputed block checksum: 0x0DBVERIFY - Verification completeTotal Pages Examined : 2Total Pages Processed (Data) : 0Total Pages Failing (Data) : 0Total Pages Processed (Index): 0Total Pages Failing (Index): 0Total Pages Processed (Other): 0Total Pages Processed (Seg) : 0Total Pages Failing (Seg) : 0Total Pages Empty : 0Total Pages Marked Corrupt : 2Total Pages Influx : 0Total Pages Encrypted : 0Highest block SCN : 0 (0.0)
文件头:无效的块类型
BBED> set file 1 block 1FILE# 1BLOCK# 1BBED> map vFile: oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Dba:0x00400001------------------------------------------------------------BBED-00400: invalid blocktype (30)
用file 2 block 1 构造file 1 block 1 结构
BBED> set file 2 block 1FILE# 2BLOCK# 1BBED> map vFile: oracle/app/oracle/oradata/cjc/sysaux01.dbf (2)Block: 1 Dba:0x00800001------------------------------------------------------------Data File Headerstruct kcvfh, 860 bytes @0struct kcvfhbfh, 20 bytes @0struct kcvfhhdr, 76 bytes @20ub4 kcvfhrdb @96struct kcvfhcrs, 8 bytes @100ub4 kcvfhcrt @108ub4 kcvfhrlc @112struct kcvfhrls, 8 bytes @116ub4 kcvfhbti @124struct kcvfhbsc, 8 bytes @128ub2 kcvfhbth @136ub2 kcvfhsta @138struct kcvfhckp, 36 bytes @484ub4 kcvfhcpc @140ub4 kcvfhrts @144ub4 kcvfhccc @148struct kcvfhbcp, 36 bytes @152ub4 kcvfhbhz @312struct kcvfhxcd, 16 bytes @316sword kcvfhtsn @332ub2 kcvfhtln @336text kcvfhtnm[30] @338ub4 kcvfhrfn @368struct kcvfhrfs, 8 bytes @372ub4 kcvfhrft @380struct kcvfhafs, 8 bytes @384ub4 kcvfhbbc @392ub4 kcvfhncb @396ub4 kcvfhmcb @400ub4 kcvfhlcb @404ub4 kcvfhbcs @408ub2 kcvfhofb @412ub2 kcvfhnfb @414ub4 kcvfhprc @416struct kcvfhprs, 8 bytes @420struct kcvfhprfs, 8 bytes @428ub4 kcvfhtrt @444ub4 tailchk @8188BBED> copy file 2 block 1 to file 1 block 1File: oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 0 to 511 Dba:0x00400001------------------------------------------------------------------------0ba20000 01008000 00000000 00000104 73570000 00000000 0004200b c554a7e3434a4300 00000000 f7030000 00040100 00200000 02000300 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 2a070000 00000000 81c92131 88582b46 06200e00 00000000 0000000000000000 00000000 00000400 7a000000 812e4646 79000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 01000000 06005359 53415558 00000000 0000000000000000 00000000 00000000 00000000 02000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 000000007ac92131 01000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000000 b2e51000 00000000 86cc7746 01000000 0d000000 994f0100 10000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x5773, required = 0x5773
查看文件头的结构
BBED> set file 1 block 1FILE# 1BLOCK# 1BBED> map vFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Dba:0x00400001------------------------------------------------------------Data File Headerstruct kcvfh, 860 bytes @0struct kcvfhbfh, 20 bytes @0struct kcvfhhdr, 76 bytes @20ub4 kcvfhrdb @96struct kcvfhcrs, 8 bytes @100ub4 kcvfhcrt @108ub4 kcvfhrlc @112struct kcvfhrls, 8 bytes @116ub4 kcvfhbti @124struct kcvfhbsc, 8 bytes @128ub2 kcvfhbth @136ub2 kcvfhsta @138struct kcvfhckp, 36 bytes @484ub4 kcvfhcpc @140ub4 kcvfhrts @144ub4 kcvfhccc @148struct kcvfhbcp, 36 bytes @152ub4 kcvfhbhz @312struct kcvfhxcd, 16 bytes @316sword kcvfhtsn @332ub2 kcvfhtln @336text kcvfhtnm[30] @338ub4 kcvfhrfn @368struct kcvfhrfs, 8 bytes @372ub4 kcvfhrft @380struct kcvfhafs, 8 bytes @384ub4 kcvfhbbc @392ub4 kcvfhncb @396ub4 kcvfhmcb @400ub4 kcvfhlcb @404ub4 kcvfhbcs @408ub2 kcvfhofb @412ub2 kcvfhnfb @414ub4 kcvfhprc @416struct kcvfhprs, 8 bytes @420struct kcvfhprfs, 8 bytes @428ub4 kcvfhtrt @444ub4 tailchk @8188
五:SYSTEM文件头损坏详细修复过程
1. rdba_kcbh(offset 4) 文件头block的rdba地址2. kccfhfsz (offset 44) 文件大小3. kccfhfno (offset 52) datafile文件号4. kcvfhrdb (offset 96) root dba5. kscnbas (offset 100) v$datafile.creation_change#6. kcvfhcrt (offset 108) v$datafile.creation_time7. kcvfhsta (offset 138) 文件状态8. kcvfhtsn (offset 332) 表空间号v$datafile.ts#9. kcvfhtln (offset 336) 表空间名称字符长度10.kcvfhtnm (offset 338) 表空间名称v$tablespace.name11.kcvfhrfn (offset 368) 相对文件号v$datafile.rfile#12.kscnbas (offset 484) checkpoint scn13.kcvcptim (offset 492) last checkpoint time---14.kcvfhcpc (offset 144) Datafile checkpoint count(不需要)
1.BBED修复文件头block的rdba地址
BBED> p kcvfhbfh.rdba_kcbhub4 rdba_kcbh @4 0x00800001
rdba地址转换
selectdbms_utility.data_block_address_file(TO_NUMBER('800001','XXXXXXXX')) file_id,dbms_utility.data_block_address_block(TO_NUMBER('800001','XXXXXXXX')) block_idfrom dual;
注意:
此查询需要在open状态下执行,可以找一个相同版本数据库下执行,结果如下:
FILE_ID BLOCK_ID---------- ----------2 1
在mount下执行,报如下错误:
ERROR at line 3:ORA-00904: "DBMS_UTILITY"."DATA_BLOCK_ADDRESS_BLOCK": invalid identifier
最终需要将上面查询的FILE_ID=2 改成 FILE_ID=1;32个字节,前10个bit文件号,后22个bit块号
0000 0000 1000 >>0000 0000 10 得出是2号文件,现在要修改为1号文件0000 0000 0100>>0x00400001 转换成十六进制
BBED修复文件头block的rdba地址 ( Cont … )
BBED> set file 1 block 1 offset 4 count 32FILE# 1BLOCK# 1OFFSET 4COUNT 32BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 4 to 35 Dba:0x00400001------------------------------------------------------------------------01008000 00000000 00000104 73570000 00000000 0004200b c554a7e3 434a4300
顺序是反的,所以要修改的值 00400001 应该是 01004000
BBED> modify x 01004000 offset 4File: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 4 to 35 Dba:0x00400001------------------------------------------------------------------------01004000 00000000 00000104 73570000 00000000 0004200b c554a7e3 434a4300<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x57b3, required = 0x57b3BBED> p kcvfhbfh.rdba_kcbhub4 rdba_kcbh @4 0x00400001
验证:
selectdbms_utility.data_block_address_file(TO_NUMBER('400001','XXXXXXXX')) file_id,dbms_utility.data_block_address_block(TO_NUMBER('400001','XXXXXXXX')) block_idfrom dual;FILE_ID BLOCK_ID---------- ----------1 1
2.BBED修复文件头的文件大小
BBED> p kcvfhhdr.kccfhfszub4 kccfhfsz @44 0x00010400[oracle@cjc-db-01 cjc]$ ls -l system01.dbf-rw-r----- 1 oracle oinstall 786440192 Oct 13 13:46 system01.dbf
##减去os层面的0号块8192
select (786440192-8192)/8192 from dual;(786440192-8192)/8192---------------------96000select to_char(96000,'xxxxxxxxxxxxxxx') from dual;TO_CHAR(96000,'X----------------17700BBED> set file 1 block 1 offset 44 count 32FILE# 1BLOCK# 1OFFSET 44COUNT 32BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 44 to 75 Dba:0x00400001------------------------------------------------------------------------00040100 00200000 02000300 00000000 00000000 00000000 00000000 00000000
其中p kcvfhhdr.kccfhfsz查询 00010400,在dump查询的是反序的00040100,所以需要将17700反序,先补全 00017700,在反序:00770100
BBED> modify x 00770100File: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 44 to 75 Dba:0x00400001------------------------------------------------------------------------00770100 00200000 02000300 00000000 00000000 00000000 00000000 00000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x24b3, required = 0x24b3BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 44 to 75 Dba:0x00400001------------------------------------------------------------------------00770100 00200000 02000300 00000000 00000000 00000000 00000000 00000000
3.BBED修复文件头的文件号
BBED> p kcvfhhdr.kccfhfnoub2 kccfhfno @52 0x0002BBED> set file 1 block 1 offset 52 count 32FILE# 1BLOCK# 1OFFSET 52COUNT 32BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 52 to 83 Dba:0x00400001------------------------------------------------------------------------02000300 00000000 00000000 00000000 00000000 00000000 00000000 00000000
2号文件,改成1号文件
BBED> modify x 01 offset 52File: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 52 to 83 Dba:0x00400001------------------------------------------------------------------------01000300 00000000 00000000 00000000 00000000 00000000 00000000 00000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x24b0, required = 0x24b0BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 52 to 83 Dba:0x00400001------------------------------------------------------------------------01000300 00000000 00000000 00000000 00000000 00000000 00000000 00000000
4.BBED修复文件头的root数据块号
SQL> select fhrdb,FHFNO from x$kcvfh order by 2;FHRDB FHFNO---------- ----------4194824 10 20 30 40 5
注意:查询 x$kcvfh 需要在open状态,如果是mount状态,FHRDB 结果都是0。
SQL> select to_char(4194824,'xxxxxxxxxx') from dual;TO_CHAR(419-----------400208SQL> selectdbms_utility.data_block_address_file(TO_NUMBER('400208', 'XXXXXXXX')) file_id,dbms_utility.data_block_address_block(TO_NUMBER('400208', 'XXXXXXXX')) block_idfrom dual;FILE_ID BLOCK_ID---------- ----------1 520SQL> select to_char(520,'xxxxxxxxxxxxxxxxxxx') from dual;TO_CHAR(520,'XXXXXXX--------------------208SQL> select to_char(520,'xxxxxxxxxxxxxxxxxxx') from dual;TO_CHAR(520,'XXXXXXX--------------------208 =>00400208BBED> p kcvfhrdb.kcvfhrdbub4 kcvfhrdb @96 0x00000000BBED> set file 1 block 1 offset 96 count 32BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 96 to 127 Dba:0x00400001------------------------------------------------------------------------00000000 2a070000 00000000 81c92131 88582b46 06200e00 00000000 00000000
将 00400208 取反 08024000
BBED> modify x 08024000File: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 96 to 127 Dba:0x00400001------------------------------------------------------------------------08024000 2a070000 00000000 81c92131 88582b46 06200e00 00000000 00000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x26f8, required = 0x26f8
5.BBED修复文件头的文件创建SCN
BBED> p kcvfhcrsstruct kcvfhcrs, 8 bytes @100ub4 kscnbas @100 0x0000072aub2 kscnwrp @104 0x0000SQL> select file#,creation_change# from v$datafile;FILE# CREATION_CHANGE#---------- ----------------1 72 18343 9233284 161435 965449SQL> select to_char(1834,'xxxxxxxxxx') from dual;TO_CHAR(183-----------72a
1号文件的CREATION_CHANGE#由1834改成7:
BBED> set file 1 block 1 offset 100 count 32FILE# 1BLOCK# 1OFFSET 100COUNT 32BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 100 to 131 Dba:0x00400001------------------------------------------------------------------------2a070000 00000000 81c92131 88582b46 06200e00 00000000 00000000 00000000<32 bytes per line>BBED> modify x 07000000 offset 100File: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 100 to 131 Dba:0x00400001------------------------------------------------------------------------07000000 00000000 81c92131 88582b46 06200e00 00000000 00000000 00000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x21d5, required = 0x21d5
6.BBED修复文件头的文件创建时间
BBED> p kcvfhcrtub4 kcvfhcrt @108 0x3121c981BBED> set file 1 block 1 offset 108 count 32FILE# 1BLOCK# 1OFFSET 108COUNT 32BBED> dumpFile: oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 108 to 139 Dba:0x00400001------------------------------------------------------------------------81c92131 88582b46 06200e00 00000000 00000000 00000000 00000000 00000400select file#,to_char(creation_time,'yyyy-mm-dd hh24:mi:ss') creation_time_file,(to_char(creation_time,'yyyy')-1988)*12*31*24*3600+(to_char(creation_time,'mm')-1)*31*24*3600+(to_char(creation_time,'dd')-1)*24*3600+to_char(creation_time,'hh24')*3600+to_char(creation_time,'mi')*60+to_char(creation_time,'ss') creation_name_scnfrom v$datafile order by 1;FILE# CREATION_TIME_FILE CREATION_NAME_SCN---------- ------------------- -----------------1 2013-08-24 11:37:33 8242978532 2013-08-24 11:37:37 8242978573 2013-08-24 12:07:19 8242996394 2013-08-24 11:37:49 8242978695 2024-08-17 13:10:02 1177247402SQL> select to_char(824297853,'xxxxxxxxxxxx') from dual;TO_CHAR(82429-------------3121c97d
将 3121c97d 取反:7dc92131
BBED> modify x 7dc92131 offset 108File: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 108 to 139 Dba:0x00400001------------------------------------------------------------------------7dc92131 88582b46 06200e00 00000000 00000000 00000000 00000000 00000400<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x2129, required = 0x2129
如果这里报错无效的number,则分开修改 108,109,110,111
例如 如果想改成d042be39
modify x d042be39 offset 108
分开修改:
modify /x d0 offset 108modify /x 42 offset 109modify /x be offset 110modify /x 39 offset 111
7.BBED修复文件头的文件状态
BBED> p offset 138kcvfh.kcvfhsta--------------ub2 kcvfhsta @138 0x0004 (KCVFHOFZ)BBED> set file 1 block 1 offset 138 count 32FILE# 1BLOCK# 1OFFSET 138COUNT 32BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 138 to 169 Dba:0x00400001------------------------------------------------------------------------04007a00 0000812e 46467900 00000000 00000000 00000000 00000000 00000000
状态说明:
Status Definition (from kcv3.h)#define KCVFHHBP 0x01 /*hotbackup-in-process on file(fuzzy file)*/#define KCVFHOFZ 0x04 /*Online FuZzy because it was online and db open*/#define KCVFHMFZ 0x10 /*Media recovery FuZzy - file in media recovery */#define KCVFHAFZ 0x40 /*Absolutely FuZzy - fuzzyness from file scan*/
当一个datafile处于fuzzy状态的时候,其kcvfhsta为0x04,这里是abort关闭,状态时04,不修改,如果是正常关闭,则是0x2000。
8.BBED修复文件头的表空间号
BBED> p kcvfhtsnsword kcvfhtsn @332 1BBED> set file 1 block 1 offset 332 count 32FILE# 1BLOCK# 1OFFSET 332COUNT 32BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 332 to 363 Dba:0x00400001------------------------------------------------------------------------01000000 06005359 53415558 00000000 00000000 00000000 00000000 00000000SQL> select file#,ts# from v$datafile;FILE# TS#---------- ----------1 02 13 24 45 6
system01.dbf对应的TS#=0,这块需要改成0。
BBED> modify x 00 offset 332File: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 332 to 363 Dba:0x00400001------------------------------------------------------------------------00000000 06005359 53415558 00000000 00000000 00000000 00000000 00000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x2128, required = 0x2128
9.BBED修复文件头的表空间长度
BBED> p kcvfhtlnub2 kcvfhtln @336 0x0006BBED> p kcvfhtnmtext kcvfhtnm[0] @338 Stext kcvfhtnm[1] @339 Ytext kcvfhtnm[2] @340 Stext kcvfhtnm[3] @341 Atext kcvfhtnm[4] @342 Utext kcvfhtnm[5] @343 X......
SYSAUX 和 SYSTEM 表空间长度相同,不需要修改。
10.BBED修复文件头的表空间名称
BBED> p kcvfhtnmtext kcvfhtnm[0] @338 Stext kcvfhtnm[1] @339 Ytext kcvfhtnm[2] @340 Stext kcvfhtnm[3] @341 Atext kcvfhtnm[4] @342 Utext kcvfhtnm[5] @343 X......BBED> set file 1 block 1 offset 338 count 32FILE# 1BLOCK# 1OFFSET 338COUNT 32BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 338 to 369 Dba:0x00400001------------------------------------------------------------------------53595341 55580000 00000000 00000000 00000000 00000000 00000000 00000200SQL> select dump('SYSAUX',16) from dual;DUMP('SYSAUX',16)-------------------------------Typ=96 Len=6: 53,59,53,41,55,58SQL> select dump('SYSTEM',16) from dual;DUMP('SYSTEM',16)-------------------------------Typ=96 Len=6: 53,59,53,54,45,4d
从341偏移量开始修改,前面SYS相同
BBED> set file 1 block 1 offset 341FILE# 1BLOCK# 1OFFSET 341BBED> modify x 54454dFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 341 to 372 Dba:0x00400001------------------------------------------------------------------------54454d00 00000000 00000000 00000000 00000000 00000000 00000002 00000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 1:current = 0x2138, required = 0x2138
查看:
BBED> p kcvfhtnmtext kcvfhtnm[0] @338 Stext kcvfhtnm[1] @339 Ytext kcvfhtnm[2] @340 Stext kcvfhtnm[3] @341 Ttext kcvfhtnm[4] @342 Etext kcvfhtnm[5] @343 M......
11.BBED修复文件头的相对文件号
BBED> p kcvfhrfnub4 kcvfhrfn @368 0x00000002BBED> set file 1 block 1 offset 368FILE# 1BLOCK# 1OFFSET 368BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 368 to 399 Dba:0x00400001------------------------------------------------------------------------02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000SQL> select file#,rfile# from v$datafile;FILE# RFILE#---------- ----------1 12 23 34 45 5BBED> modify /x 01 offset 368File: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 368 to 399 Dba:0x00400001------------------------------------------------------------------------01000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000BBED> sum applyCheck value for File 1, Block 1:current = 0x213b, required = 0x213b
12.BBED修复文件头的检查点SCN
BBED> p kcvfhckpstruct kcvfhckp, 36 bytes @484struct kcvcpscn, 8 bytes @484ub4 kscnbas @484 0x0010e5b2ub2 kscnwrp @488 0x0000ub4 kcvcptim @492 0x4677cc86ub2 kcvcpthr @496 0x0001......set line 300select file#,CREATION_CHANGE#,CHECKPOINT_CHANGE# ,UNRECOVERABLE_CHANGE#,LAST_CHANGE#,OFFLINE_CHANGE# from v$datafile order by 1;FILE# CREATION_CHANGE# CHECKPOINT_CHANGE# UNRECOVERABLE_CHANGE# LAST_CHANGE# OFFLINE_CHANGE#---------- ---------------- ------------------ --------------------- ------------ ---------------1 7 1107378 0 9257012 1834 1107378 0 9257013 923328 1107378 0 9257014 16143 1107378 0 9257015 965449 1107378 0 0SQL> select to_char(1107378,'xxxxxxxxxxxxxxxx') from dual;TO_CHAR(1107378,'-----------------10e5b2
和 ub4 kscnbas @484 0x0010e5b2 值相等,不需要修改。
13.BBED修复文件头的检查点时间
BBED> set file 1 block 1 offset 492FILE# 1BLOCK# 1OFFSET 492BBED> dumpFile: /oracle/app/oracle/oradata/cjc/system01.dbf (1)Block: 1 Offsets: 492 to 523 Dba:0x00400001------------------------------------------------------------------------86cc7746 01000000 0d000000 994f0100 10000000 02000000 00000000 00000000select file#,to_char(CHECKPOINT_TIME,'yyyy-mm-dd hh24:mi:ss')CHECKPOINT_TIME_file,(to_char(CHECKPOINT_TIME,'yyyy')-1988)*12*31*24*3600+(to_char(CHECKPOINT_TIME,'mm')-1)*31*24*3600+(to_char(CHECKPOINT_TIME,'dd')-1)*24*3600+to_char(CHECKPOINT_TIME,'hh24')*3600+to_char(CHECKPOINT_TIME,'mi')*60+to_char(CHECKPOINT_TIME,'ss') CHECKPOINT_TIME_scnfrom v$datafile order by 1;FILE# CHECKPOINT_TIME_FIL CHECKPOINT_TIME_SCN---------- ------------------- -------------------1 2024-10-13 12:31:02 11822562622 2024-10-13 12:31:02 11822562623 2024-10-13 12:31:02 11822562624 2024-10-13 12:31:02 11822562625 2024-10-13 12:31:02 1182256262select to_char(1182256262,'xxxxxxxxxxxxxxxxxxxxxxx') from dual;TO_CHAR(1182256262,'XXXX------------------------4677cc86
和 kcvcptim 0x4677cc86 值相同,不需要修改。
通过dbv检查下文件头修改是否都正确
[oracle@cjc-db-01 cjc]$ dbv file=/oracle/app/oracle/oradata/cjc/system01.dbf start=1 end=2DBVERIFY: Release 11.2.0.4.0 - Production on Sun Oct 13 15:51:32 2024Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.DBVERIFY - Verification starting : FILE = /oracle/app/oracle/oradata/cjc/system01.dbfDBVERIFY - Verification completeTotal Pages Examined : 2Total Pages Processed (Data) : 0Total Pages Failing (Data) : 0Total Pages Processed (Index): 0Total Pages Failing (Index): 0Total Pages Processed (Other): 2Total Pages Processed (Seg) : 0Total Pages Failing (Seg) : 0Total Pages Empty : 0Total Pages Marked Corrupt : 0Total Pages Influx : 0Total Pages Encrypted : 0Highest block SCN : 1090589 (0.1090589)
启动数据库:
SQL> select instance_name,status from v$instance;INSTANCE_NAME STATUS---------------- ------------cjc MOUNTED
成功启动数据库
SQL> alter database open;Database altered.
参考文章:《04 bbed修复system文件头损坏》,链接如下:
https://www.cnblogs.com/yhq1314/p/10870998.html
###chenjuchao 20241013###
欢迎关注我的公众号《IT小Chen》





