ORACLE數據庫中ORACLE_SID與INSTANCE_NAME的差異
2023-04-06 22:07 瀟湘隱者 閱讀(509) 評論(0) 收藏 舉報ORACLE數據庫中ORACLE_SID與INSTANCE_NAME在概念和意義上有什么異同呢?下面簡單來總結概況一下,很多時候,不少人都搞不清楚兩者的異同,甚至認為兩者是等價的。
ORACLE_SID與INSTANCE_NAME的異同
ORACLE_SID參數是操作系統的環境變量,用于和操作系統進行交互。也用于定義一些數據庫參數文件的名稱。
例如 init<ORACLE_SID>.ora ,spfile<ORACLE_SID>.ora等。
有些目錄名稱也跟ORACLE_SID有關。例如參數core_dump_dest對應的目錄中會包含ORACLE_SID名稱的文件夾(mydb)。
SQL> show parameter core_dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
core_dump_dest string /opt/oracle19c/diag/rdbms/mydb
/mydb/cdump
SQL>
另外,ORACLE_SID其實主要用于本地連接,例如,一臺服務器上有多個Oracle實例,我們必須使用ORACLE_SID來識別區分。它的值一般位于/etc/oratab,~/.bash_profile中,不同操作系統可能有所不同。后面我們會詳細講述。
INSTNACE_NAME是參數文件(pfile&spfile)中的一個初始化參數,它用來標識數據庫實例的名稱,其缺省值就是ORACLE_SID,所以很多時候我們認為實例名就是ORACLE_SID, 不同的實例可以擁有相同的INSTANCE_NAME。官方文檔的解釋如下:
Note: The SID identifies the instance's shared memory on a host, but may not uniquely distinguish this instance from other instances.
實例的SID
注:數據庫實例的SID標識主機上實例的共享內存,但不能將此實例與其他實例區分開來。
總統來說,INSTANCE_NAME是Oracle數據庫參數。而ORACLE_SID是操作系統的環境變量。 默認情況下,INSTANCE_NAME和在環境變量里面配置的ORACLE_SID是同樣的名稱。(注:正是由于這個原因,網上有些資料說SID就是INSTANCE_NAME,但是需要注意的是,實際上INSTANCE_NAME不等于ORACLE_SID。前者是數據庫層面的概念,后者是操作系統中環境變量的設置。)
ORACLE_SID is used to distinguish this instance from other Oracle Database instances that you may create later and run concurrently on the same host computer. The maximum number of characters for ORACLE_SID is 12, and only letters and numeric digits are permitted. On some platforms, the SID is case-sensitive.
INSTANCE_NAME與ORACLE_SID默認情況下是相同的。其實ORACLE_SID與INSTANCE_NAME本來沒有什么關系。當操作系統與數據庫交互時,用的是ORACLE_SID,而當外部連接于數據庫進行交互時用的是INSTANCE_NAME。當同一臺服務器安裝了多個數據庫時,操作系統利用ORACLE_SID來區分不同實例的進程,而當我們與這臺服務器的不同的數據庫進行連接時,用INSTANCE_NAME來決定具體連接哪個數據庫:在監聽器動態注冊時還會用于向監聽器注冊
另外,需要注意的是v$instance下instance_name與參數instance_name的區別,v$thread中instance與instance_name的區別,下面我們來演示一下:
$ echo $ORACLE_SID
mydb
$ env |grep ORACLE_SID
ORACLE_SID=mydb
SQL> set linesize 640;
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
mydb
1 row selected.
SQL> select instance from v$thread;
INSTANCE
------------------------------------------------------------------
mydb
1 row selected.
SQL> show parameter instance_name;
NAME TYPE VALUE
------------------------------------ ----------- -----------------
instance_name string mydb
SQL>
然后我們修改一下參數instance_name的值:
SQL> alter system set instance_name=kerry_test scope=spfile;
重啟數據庫實例后,我們再驗證確認一下啊。如下所示:
SQL> set linesize 640;
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
mydb
1 row selected.
SQL> select instance from v$thread;
INSTANCE
--------------------------------------------------------------------
mydb
1 row selected.
SQL> show parameter instance_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string KERRY_TEST
SQL>
SQL> col value for a30;
SQL> select value from v$parameter where name='instance_name';
VALUE
------------------------------
KERRY_TEST
1 row selected.
SQL>
如上所示,v$instance中的instance_name的值其實是ORACLE_SID的值,v$thread中的instance值也是ORACLE_SID的值,而不是參數instance_name的值。
查看ORACLE_SID的值
Window平臺
方法1:注冊表查看
HKEY_LOCAL_MACHINE > SOFTWARE > ORACLE> KEY_xxxxx
例子:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDB19Home1 下查看ORACLE_SID
方法2:
echo %ORACLE_SID%
如果沒有設置環境變量的話,這個方法是無效的。一般我們需要通過注冊表來查看。如果沒有設置環境變量,我們可以使用命令設置當前窗口的ORACLE_SID值
set ORACLE_SID=gsp
方法3:
select instance from v$thread;
方法4:
select instance_name from v$instance;
Linux/Unix平臺
方法1: echo $ORACLE_SID
例子:
$ echo $ORACLE_SID
gsp
方法2:
ps -ef | grep ora_pmon_ | grep -v grep
例子:
如下所示,這個HP-UX上有兩個實例,你如果用方法1,只能看到當前的ORACLE_SID
$ ps -ef | grep ora_pmon_ | grep -v grep
oracle 5732 1 0 Sep06 ? 00:05:14 ora_pmon_hsfa
oracle 14458 1 0 Aug18 ? 00:05:55 ora_pmon_ctest
在多實例中切換,可以使用下面命令:
export $ORACLE_SID=ctest
例子:當前環境的ORACLE_SID為mydb
$ ps -ef | grep ora_pmon_ | grep -v grep
oracle 32272 1 0 17:07 ? 00:00:01 ora_pmon_mydb
方法3:
/etc/oratab
注意,從配置文件/etc/oratab查詢ORACLE_SID,只能說可以,并不一定就能準確找出,例如,多實例的環境。這個只是僅供參考的方法。
方法4:
select instance from v$thread;
方法5:
select instance_name from v$instance;
浙公網安備 33010602011771號