假設沒有數據庫訪問權限,如何從作業系統判斷 Oracle 實例是否是備用實例?
可以輕鬆地檢查
SELECT database_role FROM v$database;
您的 Oracle 數據庫是主數據庫還是備用數據庫。是否可以在沒有數據庫訪問但只有(Unix)主機訪問的情況下做出相同的決定?Oracle DBA 非常習慣於執行諸如
ps -ef | grep pmon
或ps -ef | grep tnslsnr
快速檢查事情是否正在執行之類的事情,而這些命令不需要數據庫訪問。它們甚至可以從不擁有 Oracle 的非特權(非 root)Unix 使用者執行。所以按照這些構想思考,我有 90% 的問題都用 . 之類的東西解決了ps -eo args | grep mrp0
,但這還不夠。它僅在掛載備用數據庫並進行託管恢復時才有效。如果 (i) 在沒有啟動 MRP 的情況下簡單地掛載備用數據庫,或者 (ii) 如果備用數據庫以只讀方式打開,則它不起作用。回顧一下,這裡是參數:
- 目標是確定正在執行的數據庫實例是主數據庫實例還是備用數據庫實例。
- 無法訪問數據庫(例如:通過 SQL*Plus、JDBC 等),但您可以訪問伺服器。
- 因此只能使用 Unix 工具 (
ps
,lsof
, /proc,awk
, …)- 如果可以從非特權(非 root)Unix 使用者完成,那就太好了。
- 如果可以從任何非特權 Unix 使用者(即不是 Oracle 所有者)那裡完成,那麼三倍不錯。
注意,我在 AIX 上執行 Oracle 11gR2 和 12c,但我很樂意採用任何 *nix 解決方案。
注意 2,我不關心以 root
su
身份對 Oracle 所有者和sqlplus / as sysdba
. 我想在沒有數據庫連接的情況下執行此操作。無V $ views allowed, no X $ 允許的表。
您可以嘗試使用:
ps -ef | grep -v grep | grep ora_pr
或者,如果正在使用數據保護:
ps -ef | grep -v grep | grep ora_rsm
好的,所以我有一些時間可以浪費,這只是為了“有趣”或“有趣”的因素。我在實際場景中使用它還很遙遠,我在 x86-64 Linux 平台上的實驗室環境中使用過它,有幾個 10g、11g 和 12c 數據庫。即使數據庫關閉,至少您也可以這樣做。
當您使用以下命令執行控製文件轉儲時:
alter session set events 'immediate trace name controlf level 3';
有一個部分,看起來像這樣(它是一個備用數據庫):
*************************************************************************** DATABASE ENTRY *************************************************************************** (size = 316, compat size = 316, section max = 1, section in-use = 1, last-recid= 0, old-recno = 0, last-recno = 0) (extent = 1, blkno = 1, numrecs = 1) 11/08/2014 19:59:46 DB Name "DQX" Database flags = 0x004054c7 0x00001200
在數據庫標誌處,我們有 0x004054c7。如果設置了標誌 0x0000400,則控製文件是備用控製文件,因此它是備用數據庫。這在舊的 Oracle DSI 課程 403e(恢復架構組件)的文件轉儲分析章節,控製文件頭部分中進行了解釋。
另一個更容易獲得的來源(搜尋“kcc3.h”):https ://allovesly.files.wordpress.com/2013/03/oracle-recovery-internal2.pdf
我在控製文件的十六進制轉儲中搜尋了上述值,發現在我嘗試過的所有版本和數據庫(10.2.0.5、11.2.0.4、12.1.0.2)中,可以在位置 44030(十進制 278576)找到此特定資訊. 所以我們可以通過將控製文件轉儲為:
$ xxd -s 278576 -l 4 /oracle/base/oradata/DQX/control01.ctl 0044030: c754 4000 .T@.
字節順序顛倒,交換字節和八位字節:0x004054c7。
在非備用數據庫上執行此操作,啟用最少的補充日誌記錄 (0x4000000) 和強制日誌記錄 (0x1000000)(用於 GoldenGate 複製):
$ xxd -s 278576 -l 4 /oracle/base/oradata/GOLD/control01.ctl 0044030: 0140 4050 .@@P
標誌:0x50404001
跟踪中的相關部分:
*************************************************************************** DATABASE ENTRY *************************************************************************** (size = 316, compat size = 316, section max = 1, section in-use = 1, last-recid= 0, old-recno = 0, last-recno = 0) (extent = 1, blkno = 1, numrecs = 1) 12/01/2014 23:24:49 DB Name "GOLD" Database flags = 0x50404001 0x00001200