ORACLE資料庫中ORACLE_SID與INSTANCE_NAME在概念和意義上有什麼異同呢?下麵簡單來總結概況一下,很多時候,不少人都搞不清楚兩者的異同,甚至認為兩者是等價的。 ORACLE_SID與INSTANCE_NAME的異同 ORACLE_SID參數是操作系統的環境變數,用於和操作系統進 ...
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;