您好,登錄后才能下訂單哦!
同事項目用到 Oracle,向我問起這些內容,雖本人忝列 OCP,但那是6年前的事了,這幾年工作繁重,基本做了清零,受同事之托重新梳理了一遍。
涉及到的名字包括如:DB_NAME,DB_DOMAIN,ORACLE_SID,INSTANCE_NAME, SERVICE_NAME 等。
提起這些名字,首先要理解 ORACLE 的邏輯架構,我們通常說的可以訪問的ORACLE DB。其實兩部分組成:實例(包括一組進程,和SGA內存等) + 物理介質。介質包括控制文件,數據文件,日志文件,參數文件等。實例進程就是一堆操作物理介質的進程。再者實例進程可以不掛載(mount)任何物理介質,這時的實例叫 idle instance.
上面的名字先找簡單的說:DB_NAME。這兩個東西創建數據庫時指定,而且最具穩定性,DB_NAME遍布在數據文件,日志文件,參數文件中,99.9%情況下不會也不需要去變他。(雖然現在版本也可以修改了)。
可以把他理解成物理介質的標記,這些物理介質都屬這個DB。至于DB_DOMAIN只是為好分布式管理加的一個標識而已,意義不大,知道有這個東西即可。
ORACLE_SID:一般ORACLE_SID作環境變量用,他是個操作系統層面的東西, 最常見的兩個用處:
決定Oracle實例 進程的名字,在linux下看,Oracle相應的進程,會發現都綴有ORACLE_SID。
定位Oracle的啟動參數文件,Oracle在啟動時要尋找其配置文件(目前以這個順序查找spfile<ORACLE_SID>.ora -> spfile.ora -> init<ORACLE_SID>.ora)。
Oracle啟動之后,這個參數也沒多大用處了。
注: 相同Oracle_HOME下,ORACLE_SID要不同,不同Oracle_HOME下,可相同。
INSTANCE_NAME:DB_NAME是物理介質的標識,INSTANCE_NAME就是實例進程的標識。
對ORACLE數據庫,非RAC情況下,物理介質可以被任意實例進程掛載(mount)和打開(open)
但同一時間,只能有一個實例進程打開他。 RAC情況下,則允許多個實例進程打開相同的物理介質。
1+1變成了n+1,也就是說RAC情況下,多個實例對應著同一個物理介質。
JAVAEE同學都記得JDBC的連接串為:jdbc:oracle:thin:@<host>:<port>:<SID>
這個SID就是INSTANCE_NAME。數據庫連接,其實是連接到實例進程。大多數時候我們都當成了ORACLE_SID, 只是因為那個時候他們相同了。(關于各個參數的default值問題,這里不說子,碼字累)。
似乎有INSTANCE_NAME+DB_NAME已經完美的解決的實體的定位問題。直到RAC的出現,打破了這一寧靜。出了多個實例同時打開同一個DB_NAME的情況。那個上面的JDBC的連接串就不好用了,這時SERVICE_NAME橫空出世。
簡單的說,SERVICE_NAME代表整個數據庫(進程+DB),一個SERVICE_NAME下面可以有多個實例,所以無論是RAC,還是單例數據庫, jdbc:oracle:thin:@<host>:<port>:<SERVICE_NAME>都可以正常連接。
SERVICE_NAME怎么發揮做的呢,我們知道Oracle監聽在1521端口,因為存在一個監聽器。在ORACLE實例啟動時,PMON進程會將該實例注冊到這個監聽器上,當前也所括其所屬性的服務名,這種叫動態注冊,可能不易理解SERVICE_NAME(可以用lsnrctl status命令查看存在的service及instance),看一個靜態注冊的listener.ora:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = ORCL) ---這里為INSTANCE_NAME (ORACLE_HOME = /mydatafile2/app/oracle/oracle/product/11.2.0/db_1) (GLOBAL_DBNAME=WOO.COM) ---這里為SERVICE_NAME。 ) )
連接到這個SERVICE,監聽器就會按一定算法將連接負載到相應的實例上。
綜上看:訪問數據庫關注的大多為Instance_name和service_name.
而管理數據庫用到ORACLE_SID和DB_NAME
先寫這么多吧,后面再補。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。