问题描述
oracle 在NOMOUNT 状态下如何查询DBID
专家解答
如果你有旧的控制文件备份,可以先恢复出来,启动到mount,然后alter session set events 'immediate trace name controlf level 3';从trace里面也能找到dbid。
先安个bbed,然后查看1号文件(system表空间的数据文件)的1号块的@28字节偏移量处:
举个例子:
SQL> select dbid from v$database;
DBID
----------
4281133257
SQL> select name from v$datafile where file#=1;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/YX/datafile/o1_mf_system_fx29crln_.dbf
这是我这个数据库的dbid和1号文件的绝对路径:
打开bbed:
BBED> set filename '/u01/app/oracle/oradata/YX/datafile/o1_mf_system_fx29crln_.dbf'
FILENAME /u01/app/oracle/oradata/YX/datafile/o1_mf_system_fx29crln_.dbf
BBED> set block 1
BLOCK# 1
BBED> map /v
File: /u01/app/oracle/oradata/YX/datafile/o1_mf_system_fx29crln_.dbf (0)
Block: 1 Dba:0x00000000
------------------------------------------------------------
Data File Header
struct kcvfh, 1248 bytes @0
struct kcvfhbfh, 20 bytes @0
struct kcvfhhdr, 76 bytes @20
...
BBED> p kcvfhhdr
struct kcvfhhdr, 76 bytes @20
ub4 kccfhswv @20 0x00000000
ub4 kccfhcvn @24 0x0c200000
ub4 kccfhdbi @28 0xff2ce8c9
text kccfhdbn[0] @32 Y
text kccfhdbn[1] @33 X
ub4 kccfhdbi对应的哪个就是dbid,随便找个计算器什么的,转化成10进制就行:
SQL> select to_number('ff2ce8c9','xxxxxxxxxxxx') from dual;
TO_NUMBER('FF2CE8C9','XXXXXXXXXXXX')
------------------------------------
4281133257
直接查是不行的,dbid有记录在控制文件,可以借助bbed工具来查看