在資料庫各種狀態下查詢DBID的五大類十種方法彙總

xypincle發表於2017-03-26

  1. 關於DBID:
  2. DBID是DataBase IDentifier的縮寫,意思就是資料庫的唯一識別符號。
  3. 這個DBID在資料檔案頭和控制檔案都是存在的,可以用於標示資料檔案的歸屬。
  4. 對於不同資料庫來說,DBID應當不同,而db_name則可能是相同的。
  5. 但是DBID是可變的,在進行資料庫Clone等操作時,DBID可以被重置。
  6. dbid是一個根據db_name \ db create time等hash出來的值

  7. NOMOUNT/MOUNT/OPEN及未開啟資料庫等狀態時,查詢或獲取資料庫DBID的方法彙總:五大種類合計10種方法
  8. 一、資料庫MOUNT/OPEN時,從v$database查詢獲得
  9. 1.由於DBID在控制檔案和資料檔案中都存在記錄,所以如果能夠mount資料庫就可以查詢v$database檢視獲得.
  10. BYS@ bys3>select dbid,open_mode from v$database;
  11.       DBID OPEN_MODE
  12. ---------- --------------------
  13. 3358363031 READ WRITE
  14. SYS@ bys3>select dbid,open_mode from v$database;
  15.       DBID OPEN_MODE
  16. ---------- --------------------
  17. 3358363031 MOUNTED

  18. 二、使用RMAN的自動備份或日誌來獲取:
  19. 2.從自動備份控制檔案集的名字查詢DBID,詳見:http://blog.csdn.net/q947817003/article/details/16370735
  20. 3.從RMAN備份時產生的日誌檔案查詢DBID,與上一步在同一篇部落格。詳見:http://blog.csdn.net/q947817003/article/details/16370735

  21. 三、透過oracle event來dump資料檔案頭、日誌檔案頭、控制檔案頭資訊來獲取DBID
  22. 下面三種方法都要求資料庫在MOUNT或OPEN狀態,且只能DUMP自己資料庫的檔案。
  23. 4.透過oracle event來dump資料檔案頭來獲取DBID,詳見:http://blog.csdn.net/q947817003/article/details/16369041
  24. 5.透過oracle event來dump控制檔案頭來獲取DBID,詳見:http://blog.csdn.net/q947817003/article/details/16370273
  25. 6.透過oracle event來dump REDO日誌檔案頭來獲取DBID,詳見:http://blog.csdn.net/q947817003/article/details/16370539

  26. 四、透過alter system dump logfile命令來DUMP REDO及歸檔日誌
  27. 這種方法資料庫可以在NOMOUNT/MOUNT/OPEN階段,只用指定檔名,就可以DUMP自己資料庫或其它資料庫的檔案(傳到當前庫)。
  28. 個人見解:
  29. 在需要DBID才能進行資料恢復時,alter system dump logfile 'filename';明顯適應更多更復雜的場景,因為REDO日誌或歸檔日誌總會剩一個兩個的,憑此就可以找到DBID了,哈哈。
  30. 7.透過alter system dump logfile命令來DUMP REDO日誌檔案頭來獲取DBID,詳見:http://blog.csdn.net/q947817003/article/details/16370203
  31. 8.透過alter system dump logfile命令來DUMP 歸檔日誌檔案頭來獲取DBID,方法了上一步完全一樣。詳見:http://blog.csdn.net/q947817003/article/details/16370203

  32. .用BBED--詳見:http://blog.csdn.net/q947817003/article/details/16996475   這裡只貼一小部分:
  33. BBED> map
  34.  File: /u01/oradata/bys3/system01.dbf (1)
  35.  Block: 1                                     Dba:0x00400001
  36. ------------------------------------------------------------
  37.  Data File Header

  38.  struct kcvfh, 860 bytes                    @0       

  39.  ub4 tailchk                                @8188   
  40. BBED> print kcvfhhdr
  41. struct kcvfhhdr, 76 bytes                   @20      
  42.    ub4 kccfhswv                             @20       0x00000000
  43.    ub4 kccfhcvn                             @24       0x0b200000
  44.    ub4 kccfhdbi                             @28       0xc82c8d97
  45.    text kccfhdbn[0]                         @32      B
  46.    text kccfhdbn[1]                         @33      Y
  47.    text kccfhdbn[2]                         @34      S
  48.    text kccfhdbn[3]                         @35      3
  49.    text kccfhdbn[4]                         @36       
  50.    text kccfhdbn[5]                         @37      
  51. DBID是對應的:ub4 kccfhdbi           @28       0xc82c8d97   kccfhdbi--這個名字最後三位也能聯想下DBID
  52. 可以計算出DBID:16進位制c82c8d97,轉換為10進位制數字:
  53. BYS@ bys3>select name,dbid from v$database;
  54. NAME            DBID
  55. --------- ----------
  56. BYS3      3358363031
  57. BYS@ bys3>select to_number('c82c8d97','xxxxxxxxxxxxx') from dual;
  58. TO_NUMBER('C82C8D97','XXXXXXXXXXXXX')
  59. -------------------------------------
  60.                            3358363031
  61. DB_NAME從上面text kccfhdbn幾個位元組可以看出--不需要計算了:--也可以看出,DB_NAME不能超過8個字元的原因了
  62. 六、不是技術的技術
  63. 透過包獲取:
    select dbms_swrf_internal.get_awr_dbid from dual ;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28878983/viewspace-2136096/,如需轉載,請註明出處,否則將追究法律責任。

相關文章