轉載:ORACLE中極易混淆的幾個NAME

來源:互聯網
上載者:User

標籤:

前言

    我們知道,Oracle中的各種NAME會在我們的各個設定檔中經常出現,大致有以下這些:

在init.ora中有DB_NAME,INSTANCE_NAME,SERVICE_NAME
配置DG的時候,為了區分主備庫,還要使用DB_UNIQUE_NAME
在作業系統中需要配置環境變數,ORACLE_SID
在listener.ora中有SID_NAME,GLOBAL_DBNAME
在tnsname.ora中有SERVICE_NAME,SID,NET SERVICE NAME
    那麼這麼多名字到底有哪些區別呢?我們在使用過程中,又要注意些什麼問題呢?下面我來總結一下:
這麼多名字中,有些是初始化參數,如DB_NAME,DB_QUNIQUE_NAME,DB_DOMAIN,GLOBAL_NAME。有些則只是一種叫法或者說是概念(並沒有一個地方可以去設定它),如NET SERVICE NAME 有些則是某些表/視圖中的欄位名,如V$INSTANCE視圖的INSTANCE_NAME。有些則是環境變數中的叫法,如ORACLE_SID 亦或是監聽或用戶端設定檔中設定的參數,如SID,SID_NAME,SERVICE_NAME,GLOBAL_DBNAME。

    執行個體(對應INSTANCE_NAME),就是管理相關庫的記憶體結構的名字(由SGA、PGA、伺服器處理序、使用者進程、後台進程等組成)。
    資料庫(對應DB_NAME或GLOBAL_NAME),就是實際的磁碟上的檔案(資料檔案、記錄檔、控制檔案等),負責儲存資料,但由對應的執行個體來操作它的資料。
    服務名(對應SERVICE_NAME),就是對外公布的名稱,為網路監聽服務。
    一個Oracle資料庫系統中可以同時安裝多個資料庫,每一個資料庫對應一個唯一的執行個體(1:1),但是OPS系統除外,可以多個執行個體同時對一個資料庫操作,稱為並行伺服器(1:N),還有RAC架構,也是多個執行個體為一個資料庫執行個體服務(1:N),另外還有ASM磁碟組執行個體,用於管理ASM這種OMF儲存結構而誕生的執行個體,這些都是很容易混淆的概念。

詳細ORACLE_SID:(ORACLE SYSTEM IDENTIFIER)

    以環境變數的形式出現的。
    Oracle執行個體是由SGA和一組後台進程組成的,執行個體的建立和啟動需要一個參數檔案,而參數檔案的名稱就是由ORACLE_SID決定的。對於init檔案,預設的檔案名稱是init<ORACLE_SID>.ora,對於spfile檔案,預設的檔案名稱是spfile<ORACLE_SID>.ora。
    設定不同的ORACLE_SID值,就可以預設使用不同的參數檔案啟動不同的資料庫執行個體。另外,ORACLE_SID的作用遠遠不是作為一個執行個體入口這麼簡單的,在執行個體啟動後,執行個體名稱INSTANCE_NAME也是從ORACLE_SID得到的。

INSTANCE_NAME:

    執行個體名稱,這是Oracle執行個體的名字,用來區分不通的執行個體。在Oracle9i之前,該名字儲存在兩個地方:參數檔案和資料庫的內部試圖(V$INSTANCE).
    而在Oracle10g之後的版本中,該名字不再出現在參數檔案中,而是動態從系統中獲得,預設是取自ORACLE_SID。
    INSTANCE_NAME的作用除了區別不同執行個體之外,在監聽器動態註冊時,還會用於向監聽器註冊。比如instance_name=kanon,監聽中將動態註冊Instance "kanon",status READY資訊。

DB_NAME:    

             對一個資料庫(Oracle database)的唯一標識。這種表示對於單個資料庫是足夠的,但是隨著由多個資料庫構成的分散式資料庫的普及,這種命令資料庫的方法給資料庫的管理造成一定的負擔,因為各個資料庫的名字可能一樣,造成管理上的混亂。為瞭解決這種情況,引入了Db_domain參數,這樣在資料庫的標識是由Db_name和Db_domain兩個參數共同決定的,避免了因為資料庫重名而造成管理上的混亂。這類似於互連網上的機器名的管理。我們將Db_name和Db_domain兩個參數用’.’串連起來,表示一個資料庫,並將該資料庫的名稱稱為Global_name,即它擴充了Db_name。Db_name參數只能由字母、數字、’_’、’#’、’$’組成,而且最多8個字元。特別要注意這個限制,有的時候會掉坑裡,我就掉過一次T_T。

DB_DOMAIN:

    定義一個資料庫所在的域,該域的命名同互連網的’域’沒有任何關係,只是資料庫管理員為了更好的管理分散式資料庫而根據實際情況決定的。當然為了管理方便,可以將其等於互連網的域。

GLOBAL_NAME:

    對一個資料庫(Oracle database)的唯一標識,oracle建議用此種方法命令資料庫。該值是在建立資料庫是決定的,預設值為Db_name.Db_domain。在以後對參數檔案中Db_name與Db_domain參數的任何修改不影響Global_name的值,如果要修改Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO <db_name.db_domain>命令進行修改,然後修改相應參數。

SERVICE_NAME:

    該參數是oracle8i新引進的。在8i以前,我們用SID來表示標識資料庫的一個執行個體,但是在Oracle的並行環境中,一個資料庫對應多個執行個體,這樣就需要多個網路服務名,設定繁瑣。為了方便並行環境中的設定,引進了Service_name參數,該參數對應一個資料庫,而不是一個執行個體,而且該參數有許多其它的好處。該參數的預設值為Db_name. Db_domain,即等於Global_name。一個資料庫可以對應多個Service_name,以便實現更靈活的配置。該參數與SID沒有直接關係,即Service name不必與SID一樣。
    比方說我可以在設定環境變數的時候,設定ORACLE_SID=zlm,那麼這個時候SID就是zlm,而在tnsnames.ora中,我可以把SERVICE_NAME改成zlm_SN。

##tnsnames.oraZLM10G = ##ZLM10G為NET SERVICE NAME(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.91)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = zlm_SN) ##SERVICE_NAME為zlm_SN,與SID為zlm不同)
    可以看到,SERVICE_NAME用了剛才在netca中配置的zlm_SN,SID用了ORACLE_SID設定的zlm,並且把tnsnames.ora裡系統自動添加的NET SERVICE NAME相關的內容刪除了(即由pmon進程自動註冊的2個動態監聽),只留下自己配置的部分。
    注意,這裡我還使用了netmgr配置了靜態監聽(從status UNKNOWN其實便可知),靜態監聽的目的,除了簡化配置外,還可以提供在資料庫未啟動前仍能串連的功能,而不再是等資料庫執行個體啟動後,由pmon進程負責動態向監聽註冊服務,動態監聽會通常比較滯後,啟動監聽後,要等若干分鐘,才能看到服務被監聽。
##listener.oraSID_LIST_LISTENER =(SID_LIST =(SID_DESC =(SID_NAME = PLSExtProc)(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)(PROGRAM = extproc))(SID_DESC =(GLOBAL_DBNAME = zlm_SN)(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)(SID_NAME = zlm)))
    經過上面的tnsnames.ora和linstener.ora的配置,當我們查看監聽狀態的時候,就會發現不同:
$lsnrctl status ...... Services Summary...Service "PLSExtProc" has 1 instance(s).Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...Service "zlm_SN" has 1 instance(s).## 表示對應的SERVICE_NAME為zlm_SNInstance "zlm", status UNKNOWN, has 1 handler(s) for this service... ##表示對應的INSTANCE_NAME為zlm,也即SID和ORACLE_SIDThe command completed successfully
    而通常情況下,我們會設定SERVICE_NAME和INSTANCE_NAME一致。這裡還要注意的是,SERVICE_NAME雖然可以脫離INSTANCE_NAME搞別名,但是必須對應listener.ora裡配置的GLOBAL_DBNAME,否則就算配好了靜態監聽,也是註冊不了服務的。注意,資料庫資料檔案存放的路徑,是根據DB_NAME來確定的,而對於單一實例資料庫而言,預設與SID和INSTANCE_NAME是一致的,當然,也可以不一致(有DB_DOMAIN的情況下),DBCA的時候可以選擇,通常這3個參數在DBCA的時候確認下來後,就基本不再去修改了,那麼資料檔案路徑也就確定下來了,如我的環境中:資料檔案就放在/u01/app/oracle/oradata/zlm下面而追蹤記錄檔就放在/u01/app/oracle/admin/zlm/bdump下面
過了片刻以後,再查看監聽狀態,發現自動還是會去動態註冊一個和INSTANCE_NAME(SID)一致的SERVICE_NAME
Listening Endpoints Summary...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.91)(PORT=1521)))(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))Services Summary...Service "PLSExtProc" has 1 instance(s).Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...Service "zlm" has 1 instance(s).Instance "zlm", status READY, has 1 handler(s) for this service...Service "zlmXDB" has 1 instance(s).Instance "zlm", status READY, has 1 handler(s) for this service...Service "zlm_SN" has 1 instance(s).Instance "zlm", status UNKNOWN, has 1 handler(s) for this service...Service "zlm_XPT" has 1 instance(s).Instance "zlm", status READY, has 1 handler(s) for this service...The command completed successfully
    這樣的話,我個人判斷,如果不配置靜態監聽的話,pmon進程始終會去監聽那裡註冊一個名字和INSTANCE_NAME(SID)一致的SERVICE_NAME,即便是已經在tnsnames.ora中修改了SERVICE_NAME=zlm_SN,而只有通過靜態監聽強制註冊一個與INSTANCE_NAME(SID)不一致的SERVICE_NAME,才會被監聽到

 

NET SERVICE NAME:

    網路服務名,又可以稱為資料庫別名(database alias)。是用戶端程式訪問資料庫時所需,屏蔽了用戶端如何串連到伺服器端的細節,實現了資料庫的位置透明的特性。通常當我們用DBLINK串連資料庫時,使用的就是這個名字,由USING關鍵字指定,USING ‘connect_string‘這裡connect_string其實就是NET SERVICE NAME。說到DBLINK還要提一點,就是當來源資料庫GLOBAL_NAME=TRUE時,link_name必須與遠端資料庫的全域資料庫名global_name)相同;否則,可以任意命名。同樣地,當我們用sqlplus system/[email protected]來串連DB SERVER時,這個xxx就是NET SERVICE NAME,我的環境中是ZLM10G,如:

ZLM10G =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.91)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = zlm_SN)))
    那麼根據tnsnames.ora的配置,這裡ZLM10G就是zlm_SN這個SERVICE_NAME所對應的NET SERVICE NAME 如果用sqlplus system/[email protected]是連不上DB SERVER的,只有用sqlplus system/[email protected]才行。總結

    一條startup命令,究竟是如何啟動龐大的oracle資料庫的呢?下面我們來貫穿起來整個啟動流程,一探究竟:
    首先,系統接收到startup命令,立刻採取行動,取得環境變數ORACLE_SID的值,啟動第一階段--執行個體建立。系統根據找到的參數檔案啟動ORACLE資料庫執行個體,執行個體啟動後,一切由執行個體接管:註冊INSTANCE_NAME,往往INSTANCE_NAME就是來自ORACLE_SID,接著向監聽器動態註冊執行個體自己,並將INSTANCE_NAME寫入系統資料字典表,
    接下來,執行個體進一步讀取參數檔案,取得DB_NAME、控制檔案、檢查點等資訊,進入第二階段--掛載資料庫。執行個體從控制檔案中取得DB_NAME,並取得資料檔案、記錄檔等資訊,進行DB_NAME的一致性檢驗、檔案的存在性判斷等工作之後,執行個體將掛載資料庫,掛載的資料庫就是DB_NAME指定的資料庫。
    最後,執行個體進入第三階段--啟動資料庫。這一階段,執行個體進行了兩項檢查:檢查點和更改點檢查,之後啟動資料庫。

轉載:ORACLE中極易混淆的幾個NAME

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.