1.解決問題:TNS或者數據庫不能登陸。
最簡單有效方法:使用oracle系統提供的工具 netca 配置(把原來的刪除掉從新配置)
$netca
2.然而,仍有疑問:如何指定'listener.ora'存放的目錄?不要默認目錄($ORACLE_HOME/network/admin)
在 '.profile' 中加入html
- TNS_ADMIN=/f01/oracle11/app/oracle/product/8.0.6/network/admin
- export TNS_ADMIN
linux
3.介紹三個配置文件
1)listener.orasql
2)sqlnet.ora數據庫
3)tnsnames.ora服務器
此三文件都是放在$ORACLE_HOME/network/admin目錄下。 網絡
1)sqlnet.ora(客戶及服務器端)
做用相似於linux或者其餘unix的nsswitch.conf文件,經過這個文件來決定怎麼樣找一個鏈接中出現的鏈接字符串,
例如咱們客戶端輸入
sqlplus sys/oracle@orcl
假如個人sqlnet.ora是下面這個樣子
oracle
- SQLNET.AUTHENTICATION_SERVICES= (NTS)
-
- NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那麼,客戶端就會首先在tnsnames.ora文件中找orcl的記錄,若是沒有相應的記錄則嘗試把orcl看成一個主機名,經過網絡的途徑去解析它的ip地址而後去鏈接這個ip上GLOBAL_DBNAME=orcl這個實例。固然我這裏orcl並非一個主機名
若是我是這個樣子
app
- NAMES.DIRECTORY_PATH= (TNSNAMES)
那麼客戶端就只會從tnsnames.ora查找orcl的記錄
括號中還有其餘選項,如LDAP等並不經常使用。tcp
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/oracle@orcl的時候
- 查詢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/oracle@orcl 這種方式須要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/oracle@boway
這樣的話,會鏈接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/oracle@standby應該能夠成功的。