Oracle監聽配置及訪問方式完全解析

Oracle 網絡配置 
三個配置文件 listener.ora 、sqlnet.ora 、tnsnames.ora ,都是放在$ORACLE_HOME\network\admin目錄下。
1. sqlnet.ora----- 作用類似於linux 或者其他unix 的nsswitch.conf 文件,通過這個文件來決定怎麼樣找一個連接中出現的連接字符串。 
例如我們客戶端輸入
sqlplus sys/oracle@orcl
假如我的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 是,纔會嘗試使用這個文件。
 
PROTOCOL :客戶端與服務器端通訊的協議,一般爲TCP ,該內容一般不用改。
HOST :數據庫偵聽所在的機器的機器名或IP 地址,數據庫偵聽一般與數據庫在同一個機器上,所以當我說數據庫偵聽所在的機器一般也是指數據庫所在的機器。在UNIX 或WINDOWS 下,可以通過在數據庫偵聽所在的機器的命令提示符下使用hostname 命令得到機器名,或通過ipconfig(for WINDOWS) or ifconfig (for UNIX )命令得到IP 地址。需要注意的是,不管用機器名或IP 地址,在客戶端一定要用ping 命令ping 通數據庫偵聽所在的機器的機器名,否則需要在 hosts 文件中加入數據庫偵聽所在的機器的機器名的解析。
PORT :數據庫偵聽正在偵聽的端口,可以察看服務器端的listener.ora 文件或在數據庫偵聽所在的機器的命令提示符下通過lnsrctl status [listener name] 命令察看。此處Port 的值一定要與數據庫偵聽正在偵聽的端口一樣。
SERVICE_NAME :在服務器端,用system 用戶登陸後,sqlplus> show parameter service_name命令察看。
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 =dg1)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = sales)

    )

  )

注意:如果數據庫服務器用MTS ,客戶端程序需要用database link 時最好明確指明客戶端用dedicated 直連方式, 不然會遇到很多跟分佈式環境有關的ORACLE BUG 。一般情況下數據庫服務器用直接的連接會好一些,除非你的實時數據庫連接數接近1000 。
3. listener.ora------listener 監聽器進程的配置文件 
關於listener 進程就不多說了,接受遠程對數據庫的接入申請並轉交給oracle 的服務器進程。所以如果不是使用的遠程的連接,並且不需要使用OEM時,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 = /u01/app/oracle)
       (SID_NAME = ORCL)
)
)
 
# 監聽器的名字,一臺數據庫可以有不止一個監聽器
# 再向下面是監聽器監聽的協議,ip,端口等,這裏使用的tcp1521端口,並且使#用的是主機名
LISTENER =
     (DESCRIPTION =
         (ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(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 文件,即監聽器進程
具體的配置可以嘗試一下然後來看一下配置文件。
這樣一來總體結構就有了
不同的連接方式 
連接過程 
當你輸入sqlplus sys/oracle@orcl 的時候
1. 查詢sqlnet.ora 看看名稱的解析方式,發現是TNSNAME
2 .則查詢tnsnames.ora 文件,從裏邊找orcl 的記錄,並且找到主機名,端口和service_name
3. 如果listener 進程沒有問題的話,建立與listener 進程的連接。
4 .根據不同的服務器模式如專用服務器模式或者共享服務器模式,listener 採取接下去的動作。默認是專用服務器模式,沒有問題的話客戶端就連接上了數據庫的server process 。
5 .這時候網絡連接已經建立,listener 進程的歷史使命也就完成了。
#---------------

幾種連接方式

簡便命名連接:默認已啓用,不需要進行客戶機配置,僅支持TC/IP(無SSL),不支持高級連接,如:連接時故障轉移,源路由,負載平衡。連接方式如: connect hr/[email protected]:1521/dba10g 。其中db.us.oracle.com爲主機名當然也可以用IP代替,1521爲連接端口,dba10g爲服務名---可通過show parameter service 查看。

本地命名:需要客戶機名稱解析文件tnsname.ora,支持所有的Oracle Net協議,支持高級連接選項。連接方式如: connect hr/hr@orcl,其中orcl爲數據庫實例名

目錄命名:需要加載了Oracle Net名稱解析的LDAP:Oracle Internet Directory和Microsoft Active Directory Services。支持所有的Oracle Net協議,支持高級連接選項。連接方式如: connect hr/hr@orcl

外部命名:使用支持的非Oracle命名服務,包括:網絡信息服務(NIS)外部命名,分佈式計算環境(DCE)單元目錄服務(CDS)
連接用到的幾種驗證形式
1.sqlplus / as sysdba 這是典型的操作系統認證,不需要listener 進程
2.sqlplus sys/oracle 這種連接方式只能連接本機數據庫,同樣不需要listener 進程
3.sqlplus sys/oracle@orcl 這種方式需要listener 進程處於可用狀態。最普遍的通過網絡連接。
以上驗證方式使用sys 用戶或者其他通過密碼文件驗證的用戶都不需要數據庫處於可用狀態,操作系統認證也不需要數據庫可用,數據庫用戶認證放是由於採用數據庫認證,所以數據庫必需處於open狀態。

作爲普通用戶進行登錄
[oracle@dg1 admin]$ sqlplus sys/oracle
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Feb 13 16:18:33 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
ERROR:
ORA-01034: ORACLE not available 
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory
Enter user-name: 

initSID.ora 中的Remote_Login_Passwordfile 對身份驗證的影響 

三個可選值:
NONE :默認值,指示Oracle 系統不使用密碼文件,通過操作系統進行身份驗證的特權用戶擁有SYSORA 和SYSOPER 權限
EXCLUSIVE :
1. 表示只有一個數據庫實例可以使用密碼文件
2. 允許將SYSORA 和SYSOPER 權限賦值給SYS 以外的其它用戶
SHARED:
1. 表示可以有多個數據庫實例可以使用密碼文件
2. 不允許將SYSORA 和SYSOPER 權限賦值給SYS 以外的其它用戶
所以,如果要以操作系統身份登錄,Remote_Login_Passwordfile 應該設置爲NONE 
關於域名( 主機名) 解析 
/etc/hosts (UNIX)
或者windows\hosts(WIN98) winnt\system32\drivers\etc\hosts (WIN2000)
客戶端需要寫入數據庫服務器IP 地址和主機名的對應關係。
127.0.0.1 dg1
192.168.0.35 oracledb oracledb
192.168.0.45 tomcat tomcat
202.84.10.193 bj_db bj_db 

有些時候我們配置好第一步後,tnsping 數據庫服務器別名顯示是成功的,
但是sqlplus username/password@servicename 不通,jdbc thin link 也不通的時候, 
一定不要忘了在客戶端做這一步,原因可能是DNS 服務器裏沒有設置這個服務器IP 地址和主機名的對應關係。
如果同時有私有IP 和Internet 上公有IP ,私有IP 寫在前面,公有IP 寫在後面。
編輯前最好留一個備份,增加一行時也最好用複製粘貼,避免編輯hosts 時空格或者tab 字符錯誤。
UNIX 下ORACLE 多數據庫的環境,OS 客戶端需要配置下面兩個環境變量
ORACLE_SID=appdb;export ORACLE_SID
TWO_TASK=appdb;export TWO_TASK 

來指定默認的目標數據庫 
平時排錯可能會用到的
1 .lsnrctl status 查看服務器端listener 進程的狀態
LSNRCTL>help
LSNRCTL>status
LSNRCTL> services
 
2 .tnsping 查看客戶端sqlnet.ora 和tnsname.ora 文件的配置正確與否,及對應的服務器的listener 進程的狀態。
[oracle@dg1 dbs]$ tnsping orcl
TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 13-FEB-2011 16:48:06
Copyright (c) 1997, 2005, Oracle.  All rights reserved.
Used parameter files:
/u01/app/oracle/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(PORT = 1521))) (CONNECT_DATA = (SID = orcl)))
OK (10 msec)
 
3 . 查看instance 是否已經啓動 
SQL>select instance_name,host_name,status from v$instance; 
查看數據庫是打開還是mount 狀態。 
SQL>select open_mode from v$database 
INSTANCE_NAME                  STATUS
------------------------------ ------------------------------------
orcl                           OPEN
 
使用hostname 訪問數據庫而不是tnsname 的例子
使用tnsname 訪問數據庫是默認的方式,但是也帶來點問題,那就是客戶端都是需要配置tnsnames.ora 文件的。如果你的數據庫服務器地址發生改變,就需要重新編輯客戶端這個文件。通過hostname 訪問數據庫就沒有了這個麻煩。
查看數據庫名
SQL> select name from v$database;
NAME
---------------------------
ORCL
 
需要修改服務器端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 = ORCL)
            (ORACLE_HOME = /u01/app/oracle)
# (PROGRAM = extproc)
)
)


LISTENER =
     (DESCRIPTION_LIST =
           (DESCRIPTION =
           (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
     (DESCRIPTION =
           (ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(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@orcl
這樣的話,會連接orcl 這臺服務器,並且listener 來確定你所要連接的service_name 

客戶端連接服務器端常見問題排除方法

要排除客戶端與服務器端的連接問題,首先檢查客戶端配置是否正確(客戶端配置必須與數據庫服務器端監聽配置一致),再根據錯誤提示解決。下面列出幾種常見的連接問題:

1、 ORA-12541: TNS: 沒有監聽器

顯而易見,服務器端的監聽器沒有啓動,另外檢查客戶端IP地址或端口填寫是否正確。啓動監聽器:

$ lsnrctl start

2、ORA-12500: TNS: 監聽程序無法啓動專用服務器進程

對於Windows而言,沒有啓動Oracle實例服務。啓動實例服務:
C:oradim –startup -sid myoracle 

3、 ORA-12535: TNS: 操作超時

出現這個問題的原因很多,但主要跟網絡有關。解決這個問題,首先檢查客戶端與服務端的網絡是否暢通,如果網絡連通,則檢查兩端的防火牆是否阻擋了連接。

4、 ORA-12154: TNS: 無法處理服務名

檢查輸入的服務名與配置的服務名是否一致。另外注意生成的本地服務名文件(Windows下如D:oracleora92networkadmin tnsnames.ora,Linux/Unix下/network/admin/tnsnames.ora)裏每項服務的首 行服務名稱前不能有空格。

5、 ORA-12514: TNS: 監聽進程不能解析在連接描述符中給出的SERVICE_NAME

打開Net Manager,選中服務名稱,檢查服務標識欄裏的服務名輸入是否正確。該服務名必須與服務器端監聽器配置的全局數據庫名一致。同時檢查sqlnet.ora,例如如果想要採用簡便連接方式連接就需要在NAMES.DIRECTORY_PATH參數中添加EZCONNECT。

6、ORA-12518 TNS:監聽程序無法分發客戶機連接

出現該報錯有兩個原因:在共享模式下是由於調度進程(dispatchers)太少,在獨佔模式下是由於進程數(proces ses)超過了數據庫默認的最大進程數。解決步驟:

1、show parameter process查看數據庫允許最大進程數

2、select count(*) from v$session;查看當前系統進程數

如果進程數不夠,可通過擴大PGA來增大進程數:

alter system set workarea_size_policy=auto scope=both;
alter system set pga_aggregate_target=512m scope=both;
 

3、show parameter dispatchers查看調度進程數量

如果調度進程太少,則可執行:

alter system set dispatchers = '(protocol=tcp)(dispatchers=3)(service=oracle10xdb)';

7、 Windows 下啓動監聽服務提示找不到路徑

用命令或在服務窗口中啓動監聽提示找不到路徑,或監聽服務啓動異常。打開註冊表,進入HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/OracleOraHome92TNSListener項,查看ImagePath字符串項是否存在,如果沒 有,設定值爲D:oracleora92BINTNSLSNR,不同的安裝路徑設定值做相應的更改。這種方法同樣適用於Oracle實例服務,同 上,找到如同HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/Oracle ServiceMYORACLE項,查看ImagePath字符串項是否存在,如果沒有,則新建,設定值爲d:oracleora92 binORACLE.EXE MYORACLE。以上是Oracle客戶端連接服務器端常見的一些問題,當然不能囊括所有的連接異常。解決問題的關鍵在於方法與思路,而不是每種問題都有固定的答案。

8、TNS-12537, TNS-12560, TNS-00507 Linux Error: 29: Illegal seek error When Starting the Listener

在linux,Unix底下如果/etc/hosts文件配置不正確會出現如下報錯

$ lsnrctl start

LSNRCTL for HPUX: Version 10.1.0.4.0 - Production on 01-JUL-2005 10:16:59 Copyright (c) 1991, 2004, Oracle. All rights reserved.

Starting /db02/product/10.1/bin/tnslsnr: please wait...

TNS-12537: TNS:connection closed

TNS-12560: TNS:proto adapter error

TNS-00507: Connection closed HPUX Error: 29: Illegal seek

解決方式:

檢查該用戶是否有/etc/hosts文件的訪問權限,檢查/etc/hosts文件下是否包含

127.0.0.1 localhost.localdomain localhost

9、ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was:192.168.1.1:1521:bbcd

這個問題一般發生在利用JDBC連接數據庫時,這裏需要注意,上面的bbcd的位置應該填寫sid_name,一般JDBC的配置格式爲jdbc:oracle:thin:@IP/HOSTNAME:PORT:SID例如jdbc:oracle:thin:@145.**.**.**:1521:z***db2

10、Ora-12514:TNS:監聽程序當前無法識別鏈接描述符中請求的服務

該問題是由於缺少監聽器的SID_LIST描述項引起的,採用netca進行配置的時候經常會遇到該問題,listener.ora示例如下

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/oracle/product/9.2.0.4)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = SAMPLE.COM)
(ORACLE_HOME = /opt/oracle/product/9.2.0.4)
(SID_NAME = SAMPLE)
))

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = tcy.com)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)))

11、ORA-12528: TNS:listener: all appropriate instances are blocking new connections
ORA-12528:監聽中的服務使用了動態服務,系統啓動後,數據庫沒有正常的MOUNT,因此在動態模式下,就會出現這個問題,用靜態的就不會有這個問題,因此上面的方法就是把監聽設置爲靜態,或者在tnsnames.ora中追加(UR=A)。
lisnter.ora增加如下內容
 (SID_DESC =

      (GLOBAL_DBNAME = ammicly)

      (ORACLE_HOME = c:\oracle\product\10.1.0\db_1)

      (SID_NAME = ammicly)

    )

或者在tnsnames.ora增加如下內容

 

 (UR=A)
12、ORA-01034: ORACLE not available和ORA-27101: shared memory realm does not exist

檢查tnsping是否能正常工作,檢查lsnrctl status是否正常。檢查local_listener參數(pmon只會動態註冊port等於1521的監聽,否則pmon不能動態註冊listener,要想讓pmon動態註冊listener,需要設置local_listener參數),通過如下方式設置

alter system set local_listener='(ADDRESS =(PROTOCOL=TCP)(HOST=10.201.1.134)(PORT=1521)(SID=siebtest))';

13、ORA-12520 TNS:Listener count not find available handler for requested type of server

有以下3種可能

1、檢查數據庫是否是專用服務器,但是在tnsname.ora配置中設置了連接方式爲shared,這種情況下打開tnsname.ora, 把(server = shared) 改成 (server = dedicate);
2、是由於process不夠引起的;

select count(*) from v$session;
show parameter processes

show parameter sessions

調大processes參數即可

3、local_listener設置不當,設置方式參見上文。

14、TNS-12542: TNS:address already in use
 TNS-12560: TNS:protocol adapter error
  TNS-00512: Address already in use

檢查/etc/hosts的配置,是否有多個ip指向同一主機名的情況

參考至:http://lzysystem.iteye.com/blog/424569
                http://blogold.chinaunix.net/u2/82873/showart_1830733.html
                http://gggwfn1982.blog.163.com/blog/static/15000427201041192213787/
                http://guolr.iteye.com/blog/549692   

                http://blog.sina.com.cn/s/blog_4cd0d3a701000a6j.html 
                http://pengxianfeng.i.sohu.com/blog/view/84726397.htm 
                http://blog.sina.com.cn/s/blog_517cae3c01015dwu.html
                http://luoping.blog.51cto.com/534596/1062670
                http://xiekeli.blogbus.com/logs/93619549.html
                http://www.linuxidc.com/Linux/2012-11/73694.htm

轉載:http://czmmiao.iteye.com/blog/932479

發佈了1 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章