listener.ora--sqlnet.ora--tnsnames.ora的關系以及手工配置舉例
====================
最近看到好多人說到tns或者資料庫不能登入等問題,就索性總結了下面的文檔。
首先來說oracle的網絡結構,往複雜處說能加上加密、ldap等等。。這裡不做讨論,重點放在基本的網絡結構也就是我們最常用的這種情況
三個配置檔案
listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$oracle_home\network\admin目錄下。
重點:三個檔案的作用和使用
#-----------------------
sqlnet.ora-----作用類似于linux或者其他unix的nsswitch.conf檔案,通過這個檔案來決定怎麼樣找一個連接配接中出現的連接配接字元串,
例如我們用戶端輸入
假如我的sqlnet.ora是下面這個樣子
sqlnet.authentication_services= (nts)
names.directory_path= (tnsnames,hostname)
那麼,用戶端就會首先在tnsnames.ora檔案中找orcl的記錄.如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網絡的途徑去解析它的ip位址然後去連接配接這個ip上global_dbname=orcl這個執行個體,當然我這裡orcl并不是一個主機名
如果我是這個樣子
names.directory_path= (tnsnames)
那麼用戶端就隻會從tnsnames.ora查找orcl的記錄
括号中還有其他選項,如ldap等并不常用。
#------------------------
tnsnames.ora------這個檔案類似于unix 的hosts檔案,提供的tnsname到主機名或者ip的對應,隻有當sqlnet.ora中類似
names.directory_path= (tnsnames) 這樣,也就是用戶端解析連接配接字元串的順序中有tnsnames是,才會嘗試使用這個檔案。
例子中有兩個,orcl 對應的本機,sales對應的另外一個ip位址,裡邊還定義了使用主用伺服器還是共享伺服器模式進行連接配接,一句一句說
#你所要連接配接的時候輸入得tnsname
orcl =
(description =
(address_list =
#下面是這個tnsname對應的主機,端口,協定
(address = (protocol = tcp)(host = 127.0.0.1)(port = 1521))
)
(connect_data =
#使用專用伺服器模式去連接配接需要跟伺服器的模式比對,如果沒有就根據伺服器的模式
#自動調節
(server = dedicated)
#對應service_name,sqlplus>show parameter service_name;
#進行檢視
(service_name = orcl)
#下面這個類似
sales =
(address = (protocol = tcp)(host = 192.168.188.219)(port = 1521))
(service_name = sales)
#----------------------
用戶端完了我們來看伺服器端
listener.ora------listener監聽器程序的配置檔案
關于listener程序就不多說了,接受遠端對資料庫的接入申請并轉交給oracle的伺服器程序。是以如果不是使用的遠端的連接配接,listener程序就不是必需的,同樣的如果關閉listener程序并不會影響已經存在的資料庫連接配接。
listener.ora檔案的例子
#listener.ora network configuration file: #e:\oracle\product\10.1.0\db_2\network\admin\listener.ora
# generated by oracle configuration tools.
#下面定義listener程序為哪個執行個體提供服務
#這裡是orcl,并且它對應的oracle_home和global_dbname
#其中global_dbname不是必需的除非使用hostname做資料庫連接配接
sid_list_listener =
(sid_list =
(sid_desc =
(global_dbname = boway)
(oracle_home = e:\oracle\product\10.1.0\db_2)
(sid_name = orcl)
#監聽器的名字,一台資料庫可以有不止一個監聽器
#再向下面是監聽器監聽的協定,ip,端口等,這裡使用的tcp1521端口,并且使#用的是主機名
listener =
(address = (protocol = tcp)(host = boway)(port = 1521))
上面的例子是一個最簡單的例子,但也是最普遍的。一個listener程序為一個instance(sid)提供服務。
監聽器的操作指令
$oracle_home/bin/lsnrctl start,其他諸如stop,status等。具體敲完一個lsnrctl後看幫助。
上面說到的三個檔案都可以通過圖形的配置工具來完成配置
$oracle_home/netca 向導形式的
$oracle_home/netmgr
本人比較習慣netmgr,
profile 配置的是sqlnet.ora也就是名稱解析的方式
service name 配置的是tnsnames.ora檔案
listeners配置的是listener.ora檔案,即監聽器程序
具體的配置可以嘗試一下然後來看一下配置檔案。
1. 查詢sqlnet.ora看看名稱的解析方式,發現是tnsname
2. 則查詢tnsnames.ora檔案,從裡邊找orcl的記錄,并且找到主機名,端口和service_name
3. 如果listener程序沒有問題的話,建立與listener程序的連接配接。
4. 根據不同的伺服器模式如專用伺服器模式或者共享伺服器模式,listener采取接下去的動作。預設是專用伺服器模式,沒有問題的話用戶端就連接配接上了資料庫的server process。
5. 這時候網絡連接配接已經建立,listener程序的曆史使命也就完成了。
#---------------
幾種連接配接用到的指令形式
1.sqlplus / as sysdba 這是典型的作業系統認證,不需要listener程序
2.sqlplus sys/oracle 這種連接配接方式隻能連接配接本機資料庫,同樣不需要listener程序
以上連接配接方式使用sys使用者或者其他通過密碼檔案驗證的使用者都不需要資料庫處于可用狀态,作業系統認證也不需要資料庫可用,普通使用者因為是資料庫認證,是以資料庫必需處于open狀态。
然後就是
#-------------
平時排錯可能會用到的
1.lsnrctl status檢視伺服器端listener程序的狀态
lsnrctl> help
the following operations are available
an asterisk (*) denotes a modifier or extended command:
start stop status
services version reload
save_config trace change_password
quit exit set*
show*
lsnrctl> status
2.tnsping 檢視用戶端sqlnet.ora和tnsname.ora檔案的配置正确與否,及對應的伺服器的listener程序的狀态。
c:\>tnsping orcl
tns ping utility for 32-bit windows: version 10.1.0.2.0 - production on 16-8月 -
2005 09:36:08
copyright (c) 1997, 2003, oracle. all rights reserved.
used parameter files:
e:\oracle\product\10.1.0\db_2\network\admin\sqlnet.ora
used tnsnames adapter to resolve the alias
attempting to contact (description = (address_list = (address = (protocol = tcp)
(host = 127.0.0.1)(port = 1521))) (connect_data = (server = dedicated) (service_
name = orcl)))
ok (20 msec)
3.
sql>show sga 檢視instance是否已經啟動
sql> select open_mode from v$database; 檢視資料庫是打開還是mount狀态。
open_mode
----------
read write
#-----------------
使用hostname通路資料庫而不是tnsname的例子
使用tnsname通路資料庫是預設的方式,但是也帶來點問題,那就是用戶端都是需要配置tnsnames.ora檔案的。如果你的資料庫伺服器位址發生改變,就需要重新編輯用戶端這個檔案。通過hostname通路資料庫就沒有了這個麻煩。
需要修改
伺服器端listener.ora
#監聽器的配置檔案listener.ora
#使用host naming則不再需要tnsname.ora檔案做本地解析
# listener.ora network configuration file: d:\oracle\product\10.1.0\db_1\network\admin\listener.ora
# (sid_name = plsextproc)
(oracle_home = d:\oracle\product\10.1.0\db_1)
# (program = extproc)
(description_list =
(address = (protocol = ipc)(key = extproc))
用戶端sqlnet.ora 如果确認不會使用tnsname通路的話,可以去掉tnsnames
# sqlnet.ora network configuration file: d:\oracle\product\10.1.0\db_1\network\admin\sqlnet.ora
names.directory_path= (hostname)
tnsnames.ora檔案不需要配置,删除也無所謂。
下面就是網絡和作業系統的配置問題了,怎麼樣能夠解析我的主機名的問題了
可以通過下面的方式連接配接
這樣的話,會連接配接boway這台伺服器,并且listener來确定你所要連接配接的service_name。
在安裝目錄下,如:e:\oracle\ora81\network\admin下用寫字闆或記事本打開tnsname.ora檔案,檔案内容大概如下:
test.softone.com =
(address = (protocol = tcp)(host = zcb_8115)(port = 1521))
(service_name = test)
藍色部分為安裝時錄入的資訊。
如果該檔案沒有配置成功,該檔案可通過以下步驟進行配置:
1)、在程式菜單中打開net8 configuration assistant
2)、選擇net8 configuration assistant,打開,進入"net8 configuration assistant:歡迎"視窗
2)、選擇"本地網絡服務名設定",點選"下一步", 彈出以下窗體;
3)、在"net8 configuration assistant:網絡服務名配置"視窗中選擇"添加",點選"下一步", 彈出以下窗體;
4)在"net8 configuration assistant:網絡服務名配置,資料庫版本"視窗中選擇"oracle 8i資料庫或服務",點選"下一步",彈出以下窗體;
5)在"net8 configuration assistant:網絡服務名配置,服務名"視窗輸入服務名,此服務名跟安裝時錄入的服務名(sid)相同,錄入後,點選"下一步",彈出以下窗體;
6)、在"net8 configuration assistant:網絡服務名配置,請選擇協定"視窗選擇"tcp"此時隻能選擇"tcp",點選"下一步", 彈出以下窗體;
7)在"net8 configuration assistant:網絡服務名配置,tcp/ip協定"視窗輸入主機名(如果連接配接本地資料庫,則錄入本地計算機名,如果連接配接遠端資料庫,則錄入遠端計算機名),選擇預設的"請使用标準端口号1521"(建議最好不要修改),點選"下一步",彈出以下窗體;
8)、在"net8 configuration assistant:網絡服務名配置,測試"視窗選擇"是,進行測試",點選"下一步",彈出以下窗體;
9)、當"net8 configuration assistant:網絡服務名配置,正在連接配接"視窗對話框中出現提示"正在連接配接….測試成功"資訊,表示測試通過。此時點選"下一步",進入"net8 configuration assistant: 網絡服務名配置,網絡服務名"視窗;
10)、在"net8 configuration assistant:網絡服務名配置,網絡服務名"視窗輸入網絡服務名,服務名為oracle連接配接串,可任意錄入,如:test,點選"下一步",彈出以下窗體;
11)、在"net8 configuration assistant:網絡服務名配置,是否需要另一個網絡服務名"視窗中選擇"否",點選"下一步",進入"網絡服務名配置完成" 視窗;
12)、在"網絡服務名配置完成"視窗中點選"下一步",彈出以下窗體;
13)、在"歡迎"視窗點選"完成",退出配置過程
tnsnames.ora配置完成後,再配置bde(bde如何配置略),可通過bde、plsql、sql explorer和tnsping指令來測試oracle是否連接配接正确。下面用tnsping來測試是否連接配接。
在指令提示符下錄入: tnsping test.softone.com