Oracle----listener.ora ,tnsnames.ora ,sqlnet.ora三個檔案解析
1.解決問題:TNS或者資料庫不能登入。
最簡單有效方法:使用oracle系統提供的工具 netca 配置(把原來的刪除掉重新配置) $netca
2.然而,仍有疑問:如何指定'listener.ora'存放的目錄?不要預設目錄($ORACLE_HOME/network/admin)
在 '.profile' 中加入
[c-sharp] view plain copy
TNS_ADMIN=/f01/oracle11/app/oracle/product/8.0.6/network/admin
export TNS_ADMIN
3.介紹三個配置檔案
1)listener.ora
2)sqlnet.ora
3)tnsnames.ora
此三檔案都是放在$ORACLE_HOME/network/admin目錄下。
1)sqlnet.ora(客戶及伺服器端)
作用類似於linux或者其他unix的nsswitch.conf檔案,通過這個檔案來決定怎麼樣找一個連線中出現的連線字串, 例如我們客戶端輸入 sqlplus sys/[email protected] 假如我的sqlnet.ora是下面這個樣子
[c-sharp] view plain copy 1. SQLNET.AUTHENTICATION_SERVICES= (NTS) 2. NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那麼,客戶端就會首先在tnsnames.ora檔案中找orcl的記錄,如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網路的途徑去解析它的ip地址然後去連線這個ip上GLOBAL_DBNAME=orcl這個例項。當然我這裡orcl並不是一個主機名 如果我是這個樣子
[c-sharp] view plain copy
1. NAMES.DIRECTORY_PATH= (TNSNAMES)
那麼客戶端就只會從tnsnames.ora查詢orcl的記錄 括號中還有其他選項,如LDAP等並不常用。
2)Tnsnames.ora(客戶及伺服器端)
這個檔案類似於unix 的hosts檔案,提供的tnsname到主機名或者ip的對應,只有當sqlnet.ora中類似 NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,也就是客戶端解析連線字串的順序中有TNSNAMES時,才會嘗試使用這個檔案。 例子中有兩個,ORCL 對應的本機,SALES對應的另外一個IP地址,裡邊還定義了使用主用伺服器還是共享伺服器模式進行連線,一句一句寫如下:
[c-sharp] view plain copy
#你所要連線的時候輸入得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 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales)
)
)
- 下面是我們公司的Oracle資料庫tnsnames.ora檔案
3)listener.ora(伺服器端) --listener監聽器程序的配置檔案
關於listener程序就不多說了,接受遠端對資料庫的接入申請並轉交給oracle的伺服器程序。所以如果不是使用的遠端的連線,listener程序就不是必需的,同樣的如果關閉listener程序並不會影響已經存在的資料庫連線。 Listener.ora檔案的例子
[c-sharp] view plain copy
#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 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
上面的例子是一個最簡單的例子,但也是最普遍的。一個listener程序為一個instance(SID)提供服務。
4.監聽器的操作命令
$ORACLE_HOME/bin/lsnrctl start
其他諸如stop,status等。具體敲完一個lsnrctl後看幫助。 上面說到的三個檔案都可以通過圖形的配置工具來完成配置
- $ORACLE_HOME/netca 嚮導形式的
- $ORACLE_HOME/netmgr
- profile 配置的是sqlnet.ora也就是名稱解析的方式
- service name 配置的是tnsnames.ora檔案
- listeners配置的是listener.ora檔案,即監聽器程序
具體的配置可以嘗試一下然後來看一下配置檔案。 這樣一來總體結構就有了,是當你輸入sqlplus sys/[email protected]的時候
- 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
- 則查詢tnsnames.ora檔案,從裡邊找orcl的記錄,並且找到主機名,埠和service_name
- 如果listener程序沒有問題的話,建立與listener程序的連線。
- 根據不同的伺服器模式如專用伺服器模式或者共享伺服器模式,listener採取接下去的動作。預設是專用伺服器模式,沒有問題的話客戶端就連線上了資料庫的server process。
- 這時候網路連線已經建立,listener程序的歷史使命也就完成了。
5.幾種連線用到的命令形式
1.sqlplus / as sysdba 這是典型的作業系統認證,不需要listener程序 2.sqlplus sys/oracle 這種連線方式只能連線本機資料庫,同樣不需要listener程序 3.sqlplus sys/[email protected] 這種方式需要listener程序處於可用狀態。最普遍的通過網路連線。 以上連線方式使用sys使用者或者其他通過密碼檔案驗證的使用者都不需要資料庫處於可用狀態,作業系統認證也不需要資料庫可用,普通使用者因為是資料庫認證,所以資料庫必需處於open狀態。 然後就是
6.平時排錯可能會用到的
1.lsnrctl status檢視伺服器端listener程序的狀態
[c-sharp] view plain copy
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
7.使用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
- # Generated by Oracle configuration tools.
- SID_LIST_LISTENER =
- (SID_LIST =
- (SID_DESC =
- # (SID_NAME = PLSExtProc)
- (SID_NAME = orcl)
- (GLOBAL_DBNAME = boway)
- (ORACLE_HOME = d:/oracle/product/10.1.0/db_1)
- # (PROGRAM = extproc)
- )
- )
- LISTENER =
- (DESCRIPTION_LIST =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
- )
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
- )
- )
客戶端sqlnet.ora 如果確認不會使用TNSNAME訪問的話,可以去掉TNSNAMES
- # sqlnet.ora Network Configuration File: d:/oracle/product/10.1.0/db_1/NETWORK/ADMIN/sqlnet.ora
- # Generated by Oracle configuration tools.
- SQLNET.AUTHENTICATION_SERVICES= (NTS)
- NAMES.DIRECTORY_PATH= (HOSTNAME)
Tnsnames.ora檔案不需要配置,刪除也無所謂。 下面就是網路和作業系統的配置問題了,怎麼樣能夠解析我的主機名的問題了 可以通過下面的方式連線 sqlplus sys/[email protected] 這樣的話,會連線boway這臺伺服器,並且listener來確定你所要連線的service_name。 -------------------------------------------------------------------------------
8.啟動時listener.ora,sqlnet.ora,tnsnames.ora配置問題解決思路
from:http://www.ixdba.net/hbcms/article/ec/231.html 1:監聽檔案listener.ora tnsnames.ora中關於host的配置建議都用ip來表示,
2:如果監聽不能啟動或者啟動後不能正常使用,
(1)首先確認你的OS的hostname,執行hostname命令,嘗試ping "hostname",看是否能通, (2)然後檢查監聽的listener.ora ,tnsnames.ora這兩個配置檔案中關於host的資訊是否是用主機名錶示的。 (3)如果是,更改到新的主機名,然後把新的主機名加入系統的hosts檔案,linux下為/etc/hosts; 然後ping 新主機名,應該能通的。 (4)如果全部是用ip表示的,那麼直接將新的主機名加入系統的hosts檔案即可。 然後ping 新主機名,也應該能通的。
3:如果第二步還是解決不了問題,
(1)檢查啟動的oracle的instance資訊,select * fromv$instance; 然後檢視本級系統的主機名,兩者應該是相等的。 (2)如果查詢出來的是老的主機名,嘗試"ping老主機名"應該不通, 通過listener也應該是連結不上; (3)如果是新的主機名,如果"ping新主機名"不通, 請修改/etc/hosts檔案增加新主機名,確認能ping通,然後重啟oracle
4:注意tns和listener檔案的設定。 具體操作步驟:
1)修改hostname為www.ixdba.net
2)修改/etc/hosts,去掉原來的主機名的行,增加該行 192.168.60.253 www.ixdba.net 3)重啟資料庫,查詢instance資訊 select * from v$instance; 得到新的HOST_NAME為www.ixdba.net 4)修改listener.ora,把HOST改成新的主機名 5)修改tnsname.ora,修改對應的HOST為新的主機名 6)重啟listener 然後connect oracle/[email protected]應該可以成功的。
1.解決問題:TNS或者資料庫不能登入。
最簡單有效方法:使用oracle系統提供的工具 netca 配置(把原來的刪除掉重新配置) $netca
2.然而,仍有疑問:如何指定'listener.ora'存放的目錄?不要預設目錄($ORACLE_HOME/network/admin)
在 '.profile' 中加入
- TNS_ADMIN=/f01/oracle11/app/oracle/product/8.0.6/network/admin
- export TNS_ADMIN
3.介紹三個配置檔案
1)listener.ora
2)sqlnet.ora
3)tnsnames.ora
此三檔案都是放在$ORACLE_HOME/network/admin目錄下。
1)sqlnet.ora(客戶及伺服器端)
作用類似於linux或者其他unix的nsswitch.conf檔案,通過這個檔案來決定怎麼樣找一個連線中出現的連線字串, 例如我們客戶端輸入 sqlplus sys/[email protected] 假如我的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等並不常用。
2)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 =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
- )
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = sales)
- )
- )
3)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 =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
- )
上面的例子是一個最簡單的例子,但也是最普遍的。一個listener程序為一個instance(SID)提供服務。
4.監聽器的操作命令
$ORACLE_HOME/bin/lsnrctl start
其他諸如stop,status等。具體敲完一個lsnrctl後看幫助。 上面說到的三個檔案都可以通過圖形的配置工具來完成配置
- $ORACLE_HOME/netca 嚮導形式的
- $ORACLE_HOME/netmgr
- profile 配置的是sqlnet.ora也就是名稱解析的方式
- service name 配置的是tnsnames.ora檔案
- listeners配置的是listener.ora檔案,即監聽器程序
具體的配置可以嘗試一下然後來看一下配置檔案。 這樣一來總體結構就有了,是當你輸入sqlplus sys/[email protected]的時候
- 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
- 則查詢tnsnames.ora檔案,從裡邊找orcl的記錄,並且找到主機名,埠和service_name
- 如果listener程序沒有問題的話,建立與listener程序的連線。
- 根據不同的伺服器模式如專用伺服器模式或者共享伺服器模式,listener採取接下去的動作。預設是專用伺服器模式,沒有問題的話客戶端就連線上了資料庫的server process。
- 這時候網路連線已經建立,listener程序的歷史使命也就完成了。
5.幾種連線用到的命令形式
1.sqlplus / as sysdba 這是典型的作業系統認證,不需要listener程序 2.sqlplus sys/oracle 這種連線方式只能連線本機資料庫,同樣不需要listener程序 3.sqlplus sys/[email protected] 這種方式需要listener程序處於可用狀態。最普遍的通過網路連線。 以上連線方式使用sys使用者或者其他通過密碼檔案驗證的使用者都不需要資料庫處於可用狀態,作業系統認證也不需要資料庫可用,普通使用者因為是資料庫認證,所以資料庫必需處於open狀態。 然後就是
6.平時排錯可能會用到的
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
7.使用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
- # Generated by Oracle configuration tools.
- SID_LIST_LISTENER =
- (SID_LIST =
- (SID_DESC =
- # (SID_NAME = PLSExtProc)
- (SID_NAME = orcl)
- (GLOBAL_DBNAME = boway)
- (ORACLE_HOME = d:/oracle/product/10.1.0/db_1)
- # (PROGRAM = extproc)
- )
- )
- LISTENER =
- (DESCRIPTION_LIST =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
- )
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
- )
- )
客戶端sqlnet.ora 如果確認不會使用TNSNAME訪問的話,可以去掉TNSNAMES
- # sqlnet.ora Network Configuration File: d:/oracle/product/10.1.0/db_1/NETWORK/ADMIN/sqlnet.ora
- # Generated by Oracle configuration tools.
- SQLNET.AUTHENTICATION_SERVICES= (NTS)
- NAMES.DIRECTORY_PATH= (HOSTNAME)
Tnsnames.ora檔案不需要配置,刪除也無所謂。 下面就是網路和作業系統的配置問題了,怎麼樣能夠解析我的主機名的問題了 可以通過下面的方式連線 sqlplus sys/[email protected] 這樣的話,會連線boway這臺伺服器,並且listener來確定你所要連線的service_name。 -------------------------------------------------------------------------------
8.啟動時listener.ora,sqlnet.ora,tnsnames.ora配置問題解決思路
from:http://www.ixdba.net/hbcms/article/ec/231.html 1:監聽檔案listener.ora tnsnames.ora中關於host的配置建議都用ip來表示,
2:如果監聽不能啟動或者啟動後不能正常使用,
(1)首先確認你的OS的hostname,執行hostname命令,嘗試ping "hostname",看是否能通, (2)然後檢查監聽的listener.ora ,tnsnames.ora這兩個配置檔案中關於host的資訊是否是用主機名錶示的。 (3)如果是,更改到新的主機名,然後把新的主機名加入系統的hosts檔案,linux下為/etc/hosts; 然後ping 新主機名,應該能通的。 (4)如果全部是用ip表示的,那麼直接將新的主機名加入系統的hosts檔案即可。 然後ping 新主機名,也應該能通的。
3:如果第二步還是解決不了問題,
(1)檢查啟動的oracle的instance資訊,select * fromv$instance; 然後檢視本級系統的主機名,兩者應該是相等的。 (2)如果查詢出來的是老的主機名,嘗試"ping老主機名"應該不通, 通過listener也應該是連結不上; (3)如果是新的主機名,如果"ping新主機名"不通, 請修改/etc/hosts檔案增加新主機名,確認能ping通,然後重啟oracle
4:注意tns和listener檔案的設定。 具體操作步驟:
1)修改hostname為www.ixdba.net
2)修改/etc/hosts,去掉原來的主機名的行,增加該行 192.168.60.253 www.ixdba.net 3)重啟資料庫,查詢instance資訊 select * from v$instance; 得到新的HOST_NAME為www.ixdba.net 4)修改listener.ora,把HOST改成新的主機名 5)修改tnsname.ora,修改對應的HOST為新的主機名 6)重啟listener 然後connect oracle/[email protected]應該可以成功的。