Oracle 中極易混淆的幾個 NAME 的分析和總結

來源:互聯網
上載者:User

Oracle 中極易混淆的幾個 NAME 的分析和總結

我們知道,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

--------------------------------------------------------------------------------

Linux-6-64下安裝Oracle 12C筆記

在CentOS 6.4下安裝Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虛擬機器中安裝步驟

Debian 下 安裝 Oracle 11g XE R2

--------------------------------------------------------------------------------

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.ora

ZLM10G =  ##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.ora

SID_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_SN
  Instance "zlm", status UNKNOWN, has 1 handler(s) for this service...  ##表示對應的INSTANCE_NAME為zlm,也即SID和ORACLE_SID
 The 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,才會被監聽到

更多詳情見請繼續閱讀下一頁的精彩內容:

  • 1
  • 2
  • 下一頁

相關文章

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.