- 概述
在oracle安裝目錄$HOME/network/admin下,,經常看到sqlnet.ora tnsnames.ora listener.ora這三個檔案,除了tnsnames.ora,其他兩個檔案詳細的用途很多人都不太瞭解。sqlnet.ora 用在oracle client端,用於配置串連服務端oracle的相關參數.
tnsnames.ora 用在oracle client端,使用者配置串連資料庫的別名參數,就像系統中的hosts檔案一樣。listener.ora 用在oracle server端,配置oracle服務端程式的監聽辦法,比如限制某些ip等參數。
在安裝目錄$HOME/network/admin/samples下,會看到如上上個檔案的樣本檔案,裡面會有相關參數的說明和用法,如果遇到什麼問題,大家可以對照這些樣本檔案中相關參數的說明進行解決。
如果串連資料庫出了什麼問題,在保證網路出正常,沒有防火牆幹擾的情況下,尋找問題的步驟是:
1)在用戶端順序檢查sqlnet.ora,tnsnames.ora是有問題。
2)在伺服器端檢查listener.ora配置,並且保證監聽程式啟動,資料庫服務載入。
- 認識sqlnet.ora
下面只講述幾個常用參數配置,詳細的資料,大家可以查看樣本sqlnet.ora得到。
sqlnet.ora可以刪除,這樣在oracle用戶端串連資料庫的時候,預設採用tnsnames.ora中的配置。1).NAMES.DEFAULT_DOMAIN
網域名稱domain定義,在你用sqlplus訪問資料庫的時候,會在tns別名後面加上".domain"
樣本:
sqlnet.ora中:
NAMES.DEFAULT_DOMAIN=com
tnsnames.ora中的tns定義如下:
local_dev =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
在用戶端執行命令:sqlplus username/password@local_dev的時候,會出現如下錯誤資訊:
"ORA-12154: TNS: 無法處理服務名"或者"ORA-12154: TNS:could not resolve service name"這樣的錯誤資訊。
因為sqlplus username/password@local_dev的時候,將tns別名“local_dev”轉換成了“local_dev.com”,所以local_dev.com在tnsnames.ora中找不到,就報錯了。
修改tnsnames.ora中的定義如下:
local_dev.com =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
再執行sqlplus username/password@local_dev,串連成功。
2)NAMES.DIRECTORY_PATH
定義了在用戶端串連資料庫時,採用什麼樣的匹配方式。
樣本
sqlnet.ora內容如下:
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
那麼在用戶端執行sqlplus username/password@local_dev串連資料庫的時
首先採用tnsnames.ora的別名配置串連資料庫;如果串連上;
再採用ONAMES進行解析,最後採用主機名稱進行解析;
ONAMES表示Oracle使用自己的名稱伺服器(Oracle Name Server)來解析,目前Oracle建議使用輕量目錄訪問協議LDAP來取代ONAMES;
HOSTNAME表示使用host檔案,DNS,NIS等來解析;
3)SQLNET.AUTHENTICATION_SERVICES
定義登入資料庫的認證方式。
NONE表示Oracle資料庫身分識別驗證,NTS表示作業系統身分識別驗證,兩種方式可以並用。
可以設定成SQLNET.AUTHENTICATION_SERVICES=(NONE,NTS)先後順序表明驗證的優先方式。
樣本
sqlnet.ora內容如下:
SQLNET.AUTHENTICATION_SERVICES=(NONE)
在命令列上執行如下命令:
sqlplus "/ as sysdba"時,執行失敗。
提示錯誤資訊ORA-01031: insufficient privileges
這個參數預設沒有設定。
- 認識tnsnames.ora
提供了用戶端串連某個資料庫的詳細資料,主機地址,連接埠,資料庫執行個體名等。下面給出一個樣本來說明問題:
local_dev =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
PROTOCOL參數一般是TCP,可以根據伺服器情況選擇一種配置方式。
HOST 一般是ip地址,也可以是主機名稱,這個主機名稱字只要能用ping hostname通就行,一般在用戶端系統的host檔案上配好主機名稱和ip地址的映射關係。
ORT 標準是1521,根據伺服器端的監聽連接埠而定。S
ERVICE_NAME 就是資料庫的服務名,用system使用者登陸後,sqlplus> show parameter service_name命令查看。
這個設定檔平時大家都用得比較多,一般人都會,相信不會有太大問題。
- 認識listener.ora
tnslsnr進程是監聽、並接受遠端連線資料庫請求的監聽進程,listener.ora是tnslsnr進程的設定檔,監聽的參數都是從該設定檔中讀取。
該檔案位於服務端,如果只安裝oracle用戶端,一般不存在這個檔案。
如果你只需要在本地串連資料庫,不接受遠端連線,那麼也不需要啟動tnslsnr進程,也不需要去維護listener.ora檔案。
啟動監聽進程的命令,在命令模式下,執行lsnrctl start命令就啟動了監聽進程tnslsnr。
監聽可以有多個,也就是說,可以同時監聽多個oracle執行個體,可以在listener.ora中定義多個監聽器進行監聽。下面給出一個簡單的樣本
listener.ora中的內容:
LISTENER_CSB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.70.9.14)(PORT = 1621))
)
)
)
SID_LIST_LISTENER_CSB =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u02/oracle/app/oracle/product/10.2.0/db)
(SID_NAME = zjdevcsb)
)
)
#############################################
LISTENER_CSA =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.70.9.14)(PORT = 1521))
)
)
)
SID_LIST_LISTENER_CSA =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u02/oracle/app/oracle/product/10.2.0/db)
(SID_NAME = zjdevcsa)
)
)
在上面:
1). LISTENER_CSB,LISTENER_CSA定義了監聽器的兩個監聽名字,和這兩個監聽器監聽的參數:ip,port等。
2). SID_LIST_LISTENER_CSB,SID_LIST_LISTENER_CSA定義了兩個監聽服務,服務名字格式SID_LIST_<lsnrname>,lsnrname就是上面兩個監聽器的名字,指定了這個服務將會接受的服務將提交給那個監聽器;監聽的執行個體名zjdevcsb,zjdevcsa是在tnsnames.ora中需要指定的SERVICE_NAME參數對應。
詳細的參數說明可以查看樣本的listener.ora檔案。
- 啟動資料庫
先說一下資料庫的相關定義術語
資料庫 是指在物理磁碟上的檔案資料,就是資料表空間檔案的集合,只能有一個,並唯一;就像類的定義。
執行個體 是載入資料庫檔案的一個服務,或者進程。對同一個資料庫,可以有多個執行個體,比如rac模式,多個執行個體都是載入同一份物理資料。oracle使用者登入主機:
1) 啟動資料庫執行個體
首先執行命令sqlplus "/ as sysdba"用資料庫系統管理員角色登入,然後執行startup啟動資料庫執行個體,關閉資料庫執行個體執行用shutdown命令。如果不需要從遠端連線資料庫,那麼你就可以在本機登入資料庫了。執行sqlplus username/password就可以正確登入資料庫。
2) 監聽
啟動監聽,執行命令lsnrctl start,可以用lsnrctl status查看監聽狀態,如果監聽成功啟動,那麼就可以在遠端連線資料庫了,執行命令sqlplus username/password@tnsname;
關閉監聽,執行命令lsnrctl stop。
- 遠端連線資料庫
當你執行命令sqlplus username/password@tnsname的時,一般處理過程如下:
1) 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME,或者hostname。
2) 則查詢tnsnames.ora檔案,從裡邊找tnsname的記錄,並且找到主機名稱,連接埠和service_name。
3) 如果listener進程沒有問題的話,建立與listener進程的串連。
4) 根據不同的伺服器模式如專用伺服器模式或者共用伺服器模式,listener採取接下去的動作。預設是專用伺服器模式,沒有問題的話用戶端就串連上了資料庫的server process。
5) 這時候網路連接已經建立,listener進程的曆史使命也就完成了。
如果在串連資料庫的時候,出現什麼錯誤,可以按照上面的順序尋找相應的配置,解決問題。幾種串連資料庫用到的命令形式
sqlplus "/ as sysdba" 這是典型的作業系統認證,不需要listener進程,資料庫即使不可用也可以登入。
sqlplus username/password 不需要listener進程,登入本機資料庫,資料庫執行個體啟動即可。
sqlplus username/password@tnsname需要listener進程,最常見的遠程登入模式,需要啟動資料庫執行個體和listener進程。
- 本文涉及的相關術語
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一樣。
- 總結
學會了使用上面三個檔案,就可以啟動資料庫,並在遠端連線,根據自己的需要進行系統開發了。