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;

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/549367.html
標籤:Oracle