天天看點

Sql*Plus網絡通路基本原理及相關名詞解析

sql*plus 網絡通路運作基本機理: 

listener.ora檔案

sid_list_listener =                                                            #命名規則 sid_list_+上面定義的監聽器名稱 

  (sid_list =

    (sid_desc =

      (global_dbname = orcl)

      (sid_name = orcl)

    )

  )

listener =                                                                              #監聽器名稱 

  (description =

    (address = (protocol = tcp)(host = dg1)(port = 1521))

    (address = (protocol = ipc)(key = extproc))

  ) 

sqlnet.ora 檔案: 

names.directory_path = (tnsnames, ….)

names.default_domain = server.com

tnsnames.ora 檔案 : 

test =

(description=

(address_list=(address=(protocol=tcp)(host=dg1)(port=1521))

)

(connect_data=(service_name=orcl.testserver.com)

另外原則上tnsnames.ora 中的配置不區分大小寫,但是我的确遇到區分大小寫的情況,是以最好将使用的網絡服務與tnsnames.ora 中配置的完全一樣。

ora-12514: tns:listener could not resolve service_name given in connect descriptor.

該錯誤表示能在tnsnames.ora 中找到網絡服務名,但是在tnsnames.ora 中指定的service_name 與伺服器端的service_name 不一緻。解決的辦法是修改tnsnames.ora 中的service_name 。 

易混淆術語介紹:

db_name : 對一個資料庫(oracle database )的唯一辨別,該資料庫為oracle database 。這種表示對于單個資料庫是足夠的,但是随着由多個資料庫構成的分布式資料庫的普及,這種指令資料庫的方法給資料庫的管理造成一定的負擔,因為各個資料庫的名字可能一樣,造成管理上的混亂。為了解決這種情況,引入了db_domain 參數,這樣在資料庫的辨別是由db_name 和 db_domain 兩個參數共同決定的,避免了因為資料庫重名而造成管理上的混亂。這類似于互連網上的機器名的管理。我們将db_name 和 db_domain 兩個參數用’.’ 連接配接起來,表示一個資料庫,并将該資料庫的名稱稱為global_name ,即它擴充了db_name 。 db_name 參數隻能由字母、數字、’_’ 、’#’ 、’$’ 組成,而且最多8 個字元。

db_domain : 定義一個資料庫所在的域,該域的命名同網際網路的’ 域’ 沒有任何關系,隻是資料庫管理者為了更好的管理分布式資料庫而根據實際情況決定的。當然為了管理友善,可以将其等于網際網路的域。

global_name : 對一個資料庫(oracle database )的唯一辨別,oracle 建議用此種方法指令資料庫。該值是在建立資料庫是決定的,預設值為db_name. db_domain 。在以後對參數檔案中db_name 與db_domain 參數的任何修改不影響global_name 的值,可通過select * from global_name指令檢視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 一樣。可通過show parameter service 檢視service_name.在10g r2版本中,當采用預設端口時,系統每隔60秒會自動向預設監聽重新進行注冊服務。當然也可以采用alter system register 進行手動注冊。

ora-12514: tns: 監聽程式目前無法識别連接配接描述符中請求的服務

上面的話很容易誤解,讓人認為資料庫服務名(service name)有問題,其實他指的是tnsnames.ora中配置的别名alias所對應的service_name,與在listener中的注冊的一堆服務名找不到(也可能一個也沒有,比如隻配置了動态監聽)。

global_dbname 是指listener.ora檔案中注冊靜态監聽時的服務名。另在parameter(spfile)中也可用service_name參數指定注冊動态監聽時的服務名。

而tnsnames.ora中的服務名service_name的可選值為靜态和動态注冊的服務名(service_name),也即listener.ora中的global_dbname和parameter中的service_name,可以是任意支援的字元,但兩者必須與保持一緻。而sqlplus中的連結字元串,并不是service_name,而是一個service_name的alias(在tnsname.ora中配置) 。

靜态監聽的目的,除了簡化配置外,還可以提供在資料庫未啟動前仍能連接配接的功能。

參考至:http://lzysystem.iteye.com/blog/424569

http://tianyadgt.blog.163.com/blog/static/3708909320103855054808/

如有錯誤,歡迎指正

郵箱:[email protected]

作者:czmmiao 原文位址:http://czmmiao.iteye.com/blog/911082