Oracle Listener


1)、對於oracle網絡寫的不是很全,有的地方可能有誤,希望大家多多提出意見!

2)、本文檔適合有一定oracle基礎的人員閱讀。

3)、此文檔解決了oracle監聽的基本配置、一些網絡組件的基本概念、常見問題排錯方法、怎麼配置動態監聽和靜態監聽以及非默認監聽、安裝多個實例時如何配置監聽

4)、如果對監聽很感興趣請參考oracle 官方聯機文檔,已經打包。

Oracle® Database

Net Services Administrator's Guide

11g Release 2 (11.2)

E10836-06

Oracle® Database

Net Services Reference

11g Release 2 (11.2)

E10835-05

1、數據庫監聽配置

1.1監聽器(LISTENER)

監聽器是Oracle基於服務器端的一種網絡服務,主要用於監聽客戶端向數據庫服務器端提出的連接請求。既然是基於服務器端的服務,那麼它也只存在於數據庫服務器端,進行監聽器的設置也是在數據庫服務器端完成的。

1.2本地服務名(Tnsnames)

Oracle客戶端與服務器端的連接是通過客戶端發出連接請求,由服務器端監聽器對客戶端連接請求進行合法檢查,如果連接請求有效,則進行連接,否則拒絕該連接。

本地服務名是Oracle客戶端網絡配置的一種,另外還有Oracle名字服務器(Oracle Names Server)等。Oracle常用的客戶端配置就是採用的本地服務名,本文中介紹的也主要是基於本地服務名的配置。以下的例子都是以oracle 11g r2爲例。

1.3 Oracle網絡連接配置方法

配置Oracle服務器端與客戶端都可以在其自帶的圖形化Oracle網絡管理器(Oracle Net Manager)裏完成(建議在圖形化的工具下完成Oracle服務端或客戶端的配置)。在Windows下,點擊開始/程序/Oracle – Ora11gHome/Configuration and Migration Tools/Net Manager”啓動Oracle網絡管理器工具,在Linux/Unix(windows是在cmd命令窗口),利用netmgr命令來啓動圖形化Oracle網絡管理器,如:

[oracle@resoft Desktop]$ netmgr

Linux RHEL6.0下啓動Net Manager圖形窗口如下圖示:

clip_image001

()

1.4 Oracle監聽器配置(LISTENER)

()示,選中樹形目錄中監聽程序項,再點擊左上側“+”按鈕添加監聽程序,點擊監聽程序目錄,默認新加的監聽器名稱是LISTENER(該名稱也可以由任意合法字符命名)。選中該名稱,選中窗口右側欄下拉選項中的監聽位置,點擊添加地址按鈕。在出現的網絡地址欄的協議下拉選項中選中 “TCP/IP”,主機文本框中輸入主機名稱或IP地址(如果主機即用作服務端也作爲客戶端,輸入兩項之一均有效;如果主機作爲服務端並需要通過網絡連接,建議輸入IP地址),端口文本框中輸入數字端口,默認是1521,也可以自定義任意有效數字端口。配置好的監聽位置如下圖示:

clip_image002

()

中窗口右側欄下拉選項中的數據庫服務,點擊添加數據庫按鈕。在出現的數據庫欄中輸入全局數據庫名,如myoracle。注意這裏的全局數據庫名與數據SID有所區別,全局數據庫名實際通過域名來控制在同一網段內數據庫全局命名的唯一性,就如Windows下的域名控制器,如這裏可以輸入 myoracleOracle主目錄填寫oracle home地址我這裏是/u01/app/oracle/product/11.2.0/dbhome_1,輸入SID,如ORCL。完整的數據庫服務配置如下圖示:

clip_image003

()

存以上配置,默認即可在Oracle安裝目錄下找到監聽配置文件 (Windows下如D:\oraclec\product\11.2.0\orcl\network\admin Linux/Unix$ ORACLE_HOME/network/admin/listener.ora)。至此,Oracle服務端監聽器配置已經完成。

服務器端監聽(listener.ora)還是比較好配置的,大部分情況下在數據庫安裝完成時已經根據嚮導配置好了。

1.5 本地服務名配置(Tnsnames)

地服務名是基於Oracle客戶端的網絡配置,所以,如果客戶端需要連接數據庫服務器進行操作,則需要配置該客戶端,其依附對象可以是任意一臺欲連接數據庫服務器進行操作的pc機,也可以是數據庫服務器自身。在客戶端配置tnsnames時首先確保oracle客戶端已經安裝(下載地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.htm)如前面所介紹,可以利用Oracle自帶的圖形化管理工具Net Manager來完成Oracle客戶端的配置。選中如圖()中的服務命名,再點擊左上側“+”按鈕,彈出如下圖示對話框:

clip_image004

()

輸入Net服務名,如myoracle,點擊下一步,進入下圖示對話框:

clip_image005

()

選中TCP/IP(Internet協議),點擊下一步,如下圖示:

clip_image006

()

輸入主機名與端口號。注意這裏的主機名與端口號必須與數據庫服務器端監聽器配置的主機名和端口號相同,主機名可以是IP也可以是主機名。點擊下一步,如下圖示:

clip_image007

()

輸入服務名。這裏的服務名實際上就是數據庫服務器端監聽器配置中的全局數據庫名,前者與後者必須相同。服務名(service name)必須寫正確。查看服務名方法:SQL> select value from v$parameter where name = 'service_names';

連接類型 通常選專用服務器,這要視數據庫服務器的配置而定,如果配置的共享數據庫服務器,這裏的連接類型就要選共享服務器,否則建議選專用服務器(關於專用服務器的介紹請參閱相關文檔)。配置好後點擊下一步,如下圖示:

clip_image008

()

果數據庫服務器端相關服務啓動了,可以點擊測試按鈕進行連接測試。Oracle默認是通過scott/tiger用戶進行測試連接,由於scott用戶是 Oracle自帶的示例用戶,對於正式的業務數據庫或專業測試數據庫可能沒有配置這個用戶,所以需要更改成有效的用戶登錄纔可能測試成功。如果這裏測試連接不成功,也不要緊,先點完成按鈕結束配置。

Oracle網絡管理器(Oracle Net Manager)主窗口,保存配置,默認即可在Oracle安裝目錄下找到本地服務名配置文件 (Windows下如: D:\oraclec\product\11.2.0\orcl\network\admin\tnsnames.ora Linux/Unix$ ORACLE_HOME/network/admin/tnsnames.ora)。配置完成的本地服務名如下圖示:

clip_image009

()

樹形目錄下的服務命名可以通過編輯菜單裏的重命名菜單更改成任意合法字符組成的服務名稱,注意服務名稱前不能有空格字符,否則可能無法連接數據庫服務器。

1.6 連接數據庫服務器

(1) 啓動服務器端監聽器與數據庫服務

Linux/Unix下,啓動監聽器:

$ lsnrctl start

關閉監聽器:

$ lsnrctl stop

查看監聽狀態:

$ lsnrctl status

啓動數據庫:

$ sqlplus /nolog

SQL>conn sys@myoracle as sysdba --這裏的myoracle是前面配置的客戶端本地服務名

SQL>conn / as sysdba

SQL>startup

Windows下,啓動監聽器:

C: lsnrctl start

以上服務必須同時啓動,客戶端才能連接數據庫。由於默認配置的監聽器名稱是Listener,上述命令可以正常啓動監聽器,如果監聽器名稱是其它名稱,如aListener,則需要用下列方式才能啓動:

Linux/Unix下:

$ lsnrctl start aListener

Windows下:

C:lsnrctl start aListener

(2) 測試連接數據庫服務器

測試的方法多種多樣,可以在上面配置本地服務名時進行測試,也可以是第三方客戶端工具,如PL/SQL Developer,最方便的是用Oracle自帶的sqlplus工具,以下利用sqlplus進行測試:

[oracle@resoft Desktop]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.3.0 Production on Tue Feb 19 17:06:32 2013

Copyright (c) 1982, 2011, Oracle. All rights reserved.

SQL> conn scott/tiger@myoracle

Connected.

2oracle listener動態註冊和靜態註冊

也就是我們經常說的靜態監聽和動態監聽

2.1 什麼是註冊
註冊就是將數據庫作爲一個服務註冊到監聽程序。客戶端不需要知道數據庫名和實例名,只需要知道該數據庫對外提供的服務名就可以申請連接到數據庫。這個服務名可能與實例名一樣,也有可能不一樣。比如上面查看到的服務名就是:SQL> select value from v$parameter where name = 'service_names';

VALUE

--------------------------------------------------------------------------------

ORCL       
在數據庫服務器啓動過程中,數據庫服務器會向監聽程序註冊相應的服務(無論何時啓動一個數據庫,默認地都有兩條信息註冊到監聽器中:數據庫服務器對應的實例和服務。)
相當於是這樣:在數據庫服務器和客戶端之間有一監聽程序(Listener),在監聽程序中,會記錄相應數據庫對應的服務名(一個數據庫可能對應有多個服務名),當客戶端需要連接數據庫時,只需要提供服務名,就可以建立客戶端和服務器之間的連接。

2.2 動態註冊
動態註冊是在instance啓動的時候PMON進程根據init.ora(服務器參數文件)中instance_name,service_names兩個參數將實例和服務動態註冊到listener中。
首先要在init.ora中指定instance_name,service_names兩個參數的值。在sqlplus下通過show parameter service_namesshow parameter instance_name可以查看這兩個參數的值。
註冊到監聽器中的實例值從init.ora文件中的instance_name參數取得。如果該參數沒有設定值,那麼它將取init.ora文件中的db_name的值。如果在RAC中配置,您必須將集羣中每個實例的instance_name參數設置爲一個唯一的值。
註冊到監聽器中的服務值從init.ora文件中的參數service_names取得。如果該參數沒有設定值,數據庫將拼接init.ora文件中的 db_namedb_domain的值來註冊自己。如果選擇提供service_names值,您可以使用完全限定的名稱(比如 orcl.oracle.com)或縮寫的名稱(比如orcl)。如果選擇縮寫的名稱並設置了db_domain參數,註冊到監聽器中的服務將是 service_name值和db_domain值的拼接。例如下面的設置將導致服務orcl.oracle.com被註冊到監聽器中:
db_domain=oracle.com        
service_names=orcl ;        
採取動態註冊方法時,listener.ora中的內容如下:
SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = PLSExtProc)

(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

(PROGRAM = extproc)

)

)

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1521))

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

)       
可選擇的是,您可以在service_names參數中指定多個服務值,值之間用逗號格開,這對於共享服務器配置是很有用的。
動態註冊默認只註冊到默認的監聽器上(名稱是LISTENER、端口是1521、協議是TCP),因爲pmon只會動態註冊port等於1521的監聽,否則pmon不能動態註冊listener,如果需要向非默認監聽註冊,則需要配置local_listener參數!

將監聽的信息添加到tnsnames.ora 文件中。 注意,是tnsnames.ora 文件, 因爲pmon在動態註冊監聽時要從tnsnames.ora中讀取相關信息。

如果沒有顯式設置service_namesinstance_name的值,那麼僅當數據庫在監聽器運行之後啓動時,動態註冊纔會發生;在這種情況下,如果監聽器後來發生了重啓,動態註冊信息將會丟失。顯然,最好在所有的數據庫啓動之前先啓動監聽器,這樣就會避免沒有顯式設置 service_namesinstance_name的值時,若重啓監聽器帶來的動態註冊信息丟失的情況。

爲初始化參數service_namesinstance_name設置顯式的值是個很好的實踐,儘管如果您沒有設置它們,Oracle也會爲動態註冊而生成默認值(基於db_namedb_main)。這樣做的原因是,如果監聽器在數據庫啓動之後重新啓動,其動態註冊行爲將會有一些微妙的區別.如果監聽器在數據庫運行之後重新啓動,你們僅當您在init.ora文件中顯式地設置了service_namesinstance_name的值時,每個數據庫的PMON進程纔會在很短的時間之後自動註冊數據庫。

如果需要執行連接時故障轉移或負載均衡,或者想要在RAC中配置在實例之間透明地分佈連接,那麼使用service_names參數將是必要的。爲啓用這些功能,您只需要將每個實例的數據庫參數文件中的service_names設置爲同一個值,並在客戶端連接請求的service_name設置中引用該值。

如果沒有顯式設置service_namesinstance_name的值,那麼僅當數據庫在監聽器運行之後啓動時,動態註冊纔會發生;在這種情況下,如果監聽器後來發生了重啓,動態註冊信息將會丟失。顯然,最後在啓動任何數據庫之前啓動服務器上的監聽器,並完全避免監聽器的重啓。

另外,您還可以在SQL*PLUS中使用命令:

SQL>ALTER SYSTEM REGISTER;

在數據庫打開時的任何時候,手工地在監聽器中註冊服務值。這個命令對於替換因監聽器重啓而丟失地服務值很有用,並且它所註冊地值與在數據庫啓動時由動態註冊所設置的值完全一樣。

動態監聽:

oracle監聽器運行後,oracle實例在open時,會動態向監聽程序註冊其service_namesinstance_name

其中instance_name默認是:db_name

service_names默認是:db_name.db_domain       
2.3 靜態註冊
靜態註冊就是實例啓動時讀取listener.ora文件的配置,將實例和服務註冊到監聽程序。無論何時啓動一個數據庫,默認地都有兩條信息註冊到監聽器中:數據庫服務器對應的實例和服務。
靜態註冊時,listener.ora中的GLOBAL_DBNAME向外提供服務名,listener.ora中的SID_NAME提供註冊的實例名。
採取靜態註冊方法時,listener.ora中的內容如下:
SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = myoracle)

(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

(SID_NAME = ORCL)

)

)

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1521))

)

)       
該文件表明數據庫是單實例的,實例名爲orcl,向外提供了1個服務:ORCL

靜態監聽:

oracle實例運行後,監聽程序啓動時,根據listener.ora的配置註冊相應的服務。

其中global_dbname對應的是oracle對外的服務名,即初始化參數裏的service_names

sid_name對應的是oralce實例的名稱,即初始化參數裏的instance_name

既然有動態監聽爲什麼還要靜態監聽呢?原因如下:

1).監聽器不是最早啓動,oracle實例先啓動

2).監聽器重啓

3).oracle實例沒有open

2.4查詢某服務是靜態註冊還是動態註冊
可以使用命令lsnrctl status來查看某服務是靜態註冊還是動態註冊。
實例狀態爲UNKNOWN值時表明此服務是靜態註冊的設置。這時監聽器用來表明它不知道關於該實例的任何信息,只有當客戶發出連接請求時,它才檢查該實例是否存在。
動態註冊的數據庫通過狀態信息中的狀態READY或狀態BLOCKED(對於一個備用數據庫)來指明。舉例:已經註冊的動態監聽(最常用)

[oracle@resoft admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 19-FEB-2013 18:11:48

Copyright (c) 1991, 2011, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias LISTENER

Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production

Start Date 19-FEB-2013 22:48:26

Uptime 248 days 13 hr. 13 min. 56 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/resoft/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=resoft)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Services Summary...

Service "ORCL" has 1 instance(s).

Instance "ORCL", status READY, has 1 handler(s) for this service...

Service "ORCLXDB" has 1 instance(s).

Instance "ORCL", status READY, has 1 handler(s) for this service...

The command completed successfully

不管何時關閉數據庫,動態註冊的數據庫都會動態地從 監聽器註銷,而與之相關的信息將從狀態列表中消失。這樣,不管數據庫是在運行還是已經關閉,監聽器總是知道它的狀態。該信息將被用於連接請求的回退(fallback)和負載平衡。

3、配置非默認監聽

上面配置的監聽都是默認監聽 監聽名:listener 端口:1521 這是會自動註冊的,但是實際生產中基本上都是非默認監聽。

以下測試直接修改服務器端監聽文件listener.ora或者tnsnames.ora

目前測試數據庫上已經有實例ORCL現在創建一個新的實例UPRR,設置監聽名字listener1端口1522

3.1 使用dbca數據庫嚮導創建一個新實例UPRR

其它步驟省略,如下圖所示:

clip_image010

clip_image011

3.2 配置服務器端監聽

listener.ora文件中添加以下內容

SID_LIST_LISTENER1 =

(SID_LIST =

(SID_DESC =

(SID_NAME = UPRR)

(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

(PROGRAM = extproc)

)

)

LISTENER1 =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

)

3.3 註冊非默認監聽

然後以sys用戶運行:

[oracle@resoft admin]$ export ORACLE_SID=UPRR

[oracle@resoft admin]$ sqlplus / as sysdba

SQL> alter system set local_listener=listener1 scope=spfile;

SQL> alter system register;

或者:

SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))';

SQL> alter system register;

系統已更改。

3.4 tnsnames.ora中添加解析文件

Tnsnames.ora中添加以下內容

UPRR =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = UPRR)

)

)

SID_LIST_LISTENER1 =

(SID_LIST =

(SID_DESC =

(SID_NAME = UPRR)

(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

(PROGRAM = extproc)

)

)

LISTENER1 =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

)

3.5 啓動非默認監聽listener1

[oracle@resoft admin]$ lsnrctl

LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 19-FEB-2013 19:40:23

Copyright (c) 1991, 2011, Oracle. All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> stop listener --先關閉之前已經啓動的監聽listener

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1521)))

The command completed successfully

LSNRCTL> start listener1

Starting /u01/app/oracle/product/11.2.0/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 11.2.0.3.0 - Production

System parameter file is /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Log messages written to /u01/app/oracle/diag/tnslsnr/resoft/listener1/alert/log.xml

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=resoft)(PORT=1522)))

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1522)))

STATUS of the LISTENER

------------------------

Alias listener1

Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production

Start Date 19-FEB-2013 19:41:04

Uptime 0 days 0 hr. 0 min. 1 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/resoft/listener1/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=resoft)(PORT=1522)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Services Summary...

Service "UPRR" has 1 instance(s).

Instance "UPRR", status UNKNOWN, has 1 handler(s) for this service... –此時監聽的狀態是沒有註冊,重啓下數據庫實例UPRR即可

The command completed successfully

3.6 重啓實例

SQL> startup

ORACLE instance started.

Total System Global Area 636100608 bytes

Fixed Size 1346812 bytes

Variable Size 184550148 bytes

Database Buffers 444596224 bytes

Redo Buffers 5607424 bytes

Database mounted.

Database opened.

SQL> show parameter listener

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

listener_networks string

local_listener string LISTENER1

remote_listener string

[oracle@resoft admin]$ lsnrctl status listener1

LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 19-FEB-2013 19:52:18

Copyright (c) 1991, 2011, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=resoft)(PORT=1522)))

STATUS of the LISTENER

------------------------

Alias listener1

Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production

Start Date 19-FEB-2013 19:41:04

Uptime 0 days 0 hr. 11 min. 14 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/resoft/listener1/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=resoft)(PORT=1522)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Services Summary...

Service "UPRR" has 2 instance(s).

Instance "UPRR", status UNKNOWN, has 1 handler(s) for this service...

Instance "UPRR", status READY, has 1 handler(s) for this service...

Service "UPRRXDB" has 1 instance(s).

Instance "UPRR", status READY, has 1 handler(s) for this service...

The command completed successfully

至此,配置非默認監聽結束。環境中在同一個數據庫軟件上安裝兩個實例:ORCLUPRR

ORCL使用監聽listener 端口1521 UPRR 使用listener1 端口1522

3.7 同時啓動兩個實例和兩個監聽

剛纔看到了在啓動listener1的時候必須把listener關閉,其實可以讓實例ORCLUPRR使用一個監聽listener但是ORCL使用1521端口,UPRR使用1522端口。

修改後的listener.ora文件如下:
SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

(SID_NAME = ORCL)

)

(SID_DESC =

(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

(SID_NAME = UPRR)

)

)

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1521))

)

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1522))

)

)

修改完listener.ora後,把內容貼到tnsnames.ora

3.8 使用遠程PC測試

在我本機oracle client tnsnames.ora中添加如下內容:

注意:別名如:ORCL第一行要頂格寫

ORCL =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.220.200)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = ORCL)

)

)

UPRR =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.220.200)(PORT = 1522))

)

(CONNECT_DATA =

(SERVICE_NAME = UPRR)

)

)

使用sqlplus 登錄連個實例

C:\>sqlplus scott/tiger@orcl

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 2 19 20:45:53 2013

Copyright (c) 1982, 2010, Oracle. All rights reserved.

連接到:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> exit

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options斷開

C:\>sqlplus scott/tiger@uprr

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 2 19 20:46:05 2013

Copyright (c) 1982, 2010, Oracle. All rights reserved.

連接到:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

4Orace監聽配置修改說明

4.1 監聽日誌說明

Oracle的監聽(Listener)在缺省情況下,會在文件中記錄日誌,記錄數據庫實例註冊操作、客戶端的連接等。

Oracle 11g中的信息如下:

[oracle@dave ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.3.0 - Productionon 22-DEC-2012 21:36:43

Copyright (c) 1991, 2011, Oracle. All rights reserved.

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias LISTENER

Version TNSLSNR for Linux: Version11.2.0.3.0 - Production

Start Date 22-DEC-2012 21:31:53

Uptime 0 days 0 hr. 4 min. 50 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/dave/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.4)(PORT=1521)))

Services Summary...

Service "dave" has 2 instance(s).

Instance "dave", status UNKNOWN, has 1 handler(s) for thisservice...

Instance "dave", status READY, has 1 handler(s) for thisservice...

Service "daveXDB" has 1instance(s).

Instance "dave", status READY, has 1 handler(s) for thisservice...

The command completed successfully

這個是Oracle 11g裏的listener的保存位置。在Oracle 11g中使用的是ADRADR11G的新特性,欲詳細瞭解百度之。

這裏是個xml文件,不方便文件,我們可以去trace目錄下,看文本格式的:

[oracle@dave trace]$ pwd

/u01/app/oracle/diag/tnslsnr/dave/listener/trace

[oracle@dave trace]$ ls

listener.log

[oracle@dave trace]$

[oracle@dave trace]$ tail -20 listener.log

Sat Dec 22 21:33:39 2012

22-DEC-2012 21:33:39 * service_update *dave * 0

22-DEC-2012 21:33:42 * service_update *dave * 0

22-DEC-2012 21:33:45 * service_update *dave * 0

Sat Dec 22 21:34:18 2012

22-DEC-2012 21:34:18 * service_update *dave * 0

22-DEC-2012 21:34:21 * service_update *dave * 0

22-DEC-2012 21:34:24 * service_update *dave * 0

22-DEC-2012 21:34:27 * service_update *dave * 0

Sat Dec 22 21:34:48 2012

22-DEC-2012 21:34:48 * service_update *dave * 0

Sat Dec 22 21:35:06 2012

22-DEC-2012 21:35:06 * service_update *dave * 0

Sat Dec 22 21:36:18 2012

22-DEC-2012 21:36:18 * service_update *dave * 0

Sat Dec 22 21:36:43 2012

WARNING: Subscription for node down eventstill pending

22-DEC-2012 21:36:43 *(CONNECT_DATA=(CID=(PROGRAM=)(HOST=dave)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=186647296))* status * 0

Sat Dec 22 21:37:34 2012

22-DEC-2012 21:37:34 * service_update *dave * 0

對於一些使用短連接的,頻繁的連接數據庫的應用,listener.log增長很快。有的可以在比較短的時間內(十幾天)就可以超過2GB。對於一些平臺的某些版本的Oracle,在監聽日誌增大到2GB以後會導致監聽不能正常工作。

對於這種listener.log增長非常迅速的系統,可以關閉監聽日誌,不讓監聽寫日誌到文件。也可以寫個job定期清理。

關於Oracle Listener 的說明,官網有更多詳細描述。

Listener Control Utility

http://docs.oracle.com/cd/E11882_01/network.112/e10835/lsnrctl.htm#NETRF118

這裏我們看2個比較常用的操作。

4.2停止寫listener log

在某些特定的場合可能會有這樣的需求。控制這個功能的參數是LOG_STATUS官網對這個參數的說明:To turn listenerlogging on or off.

--OS層面直接使用:

lsnrctl SET LOG_STATUS {on | off}

--LSNRCTL 工具中使用:

LSNRCTL> SET LOG_STATUS {on | off}

--查看log_status狀態:

LSNRCTL> show log_status

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

LISTENER parameter "log_status"set to ON

The command completed successfully

說明:

之前遇到一個很奇怪的問題,就是log_status狀態是on,但是listener就是不寫日誌,再次手工設置爲on後,又正常寫日誌。

LSNRCTL> setlog_status off

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

LISTENER parameter "log_status"set to OFF

The command completed successfully

LSNRCTL> showlog_status

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

LISTENER parameter "log_status"set to OFF

The command completed successfully

LSNRCTL> setlog_status on

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

LISTENER parameter "log_status"set to ON

The command completed successfully

LSNRCTL> showlog_status

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

LISTENER parameter "log_status" setto ON

The command completed successfully

4.3保存listener 的修改

保存又參數:SAVE_CONFIG控制,官網的說明:

To save the current configuration state of the listener, includingtrace level, trace file, trace directory, and logging tothe listener.ora file. Any changes are stored in listener.ora,preserving formatting, comments, and case as much as possible. Beforemodification of the listener.ora file, a backup of the file,called listener.bak, is created.

我們在第一部分修改了log_status 的配置,如果沒有保存,那麼在重啓監聽之後,修改就會失效,所以這裏要保存,才能永久的生效。

LSNRCTL> save_config

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

Saved LISTENER configuration parameters.

Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Old Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.bak

The command completed successfully

注意:

這裏使用的是默認的listner,如果不是默認的,就需要加上listener_name.如:

LSNRCTL> SAVE_CONFIG listener_name

保存之後,修改的內容就會寫入listener.ora 文件。

這裏是我的的測試環境,其中listener.ora 文件多瞭如下內容:

/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

#----ADDED BY TNSLSNR 22-DEC-201221:59:58---

LOGGING_LISTENER = ON

#--------------------------------------------

4.4加密listener

有時候處於安全考慮,會需要對listener設置密碼。

4.4.1設置監聽名

如果有多個監聽,那麼需要先設置當前的監聽

LSNRCTL>set current_listener listener_name

4.4.2設置密碼

使用change_password設置listener口令。

LSNRCTL> change_password

Old password: --如果原來沒有設置口令就直接回車,否則輸入原來的口令

New password:

Reenter new password:

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

Password changed for LISTENER

The command completed successfully

--保存密碼:

LSNRCTL> save_config

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

Saved LISTENER configuration parameters.

Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Old Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.bak

The command completed successfully

--加密之前:

[oracle@dave ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.3.0 -Production on 22-DEC-2012 22:54:55

Copyright (c) 1991, 2011, Oracle. All rights reserved.

Connecting to(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias LISTENER

Version TNSLSNR for Linux: Version11.2.0.3.0 - Production

Start Date 22-DEC-2012 21:57:46

Uptime 0 days 0 hr. 57 min. 9 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/dave/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.4)(PORT=1521)))

Services Summary...

Service "dave" has 2 instance(s).

Instance "dave", status UNKNOWN, has 1 handler(s) for thisservice...

Instance "dave", status READY, has 1 handler(s) for thisservice...

Service "daveXDB" has 1instance(s).

Instance "dave", status READY, has 1 handler(s) for thisservice...

--加密之後:

LSNRCTL> status

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.4)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias LISTENER

Version TNSLSNR for Linux: Version11.2.0.3.0 - Production

Start Date 22-DEC-2012 22:56:19

Uptime 0 days 0 hr. 11 min. 2 sec

Trace Level off

Security ON: Password or Local OSAuthentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/dave/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.4)(PORT=1521)))

Services Summary...

Service "dave" has 2 instance(s).

Instance "dave", status UNKNOWN, has 1 handler(s) for thisservice...

Instance "dave", status READY, has 1 handler(s) for thisservice...

Service "daveXDB" has 1instance(s).

Instance "dave", status READY, has 1 handler(s) for this service...

The command completed successfully

--listener.ora 文件中也會多一個配置參數:

[oracle@dave ~]$ cat/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

#----ADDED BY TNSLSNR 22-DEC-201221:59:58---

LOGGING_LISTENER = ON

#--------------------------------------------

#----ADDED BY TNSLSNR 22-DEC-201223:06:31---

PASSWORDS_LISTENER =1DF5C2FD0FE9CFA2

#--------------------------------------------

[oracle@dave ~]$

4.4.3解除密碼

listener的密碼策略是防止stop,所以在stop時需要確認密碼,在start時不需要輸入密碼。

LSNRCTL> set password

Password:

The command completed successfully

使用set password輸入正確的密碼後,就可以進行stop操作了。

5oracle sqlnet.ora說明

sqlnet.ora作用類似於linux或者其他unixnsswitch.conf文件,通過這個文件來決定怎麼樣找一個連接中出現的連接字符串。可以沒有此文件。
例如我們客戶端輸入
sqlplus system/oracle@orcl
假如我的sqlnet.ora是下面這個樣子
SQLNET.AUTHENTICATION_SERVICES= (NTS)        
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)        
那麼,客戶端就會首先在tnsnames.ora文件中找orcl的記錄.如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網絡的途徑去解析它的 ip地址然後去連接這個ipGLOBAL_DBNAME=orcl這個實例,當然我這裏orcl並不是一個主機名
如果我是這個樣子
NAMES.DIRECTORY_PATH= (TNSNAMES)        
那麼客戶端就只會從tnsnames.ora查找orcl的記錄,括號中還有其他選項,如LDAP等並不常用。

Sqlnet.ora還有一個重要作用就是限制IP訪問Oracle。與防火牆類似的功能,Oracle提供限制與允許特定的IP或主機名通過Oracle Net來訪問數據庫。這個功能由sqlnet.ora配置文件來實。通過監聽器的限制,比在數據庫內部通過觸發器進行限制效率要高。

限制IP例子:
通過在sqlnet.ora文件中增加下列記錄來實現

tcp.validnode_checking = yes

tcp.invited_nodes = (hostname1, hostname2ip1,ip2)

tcp.excluded_nodes = (10.103.11.17,hostname1,hostname2)

tcp.validnode_checking = yes

tcp.invited_nodes = (hostname1, hostname2ip1,ip2)

tcp.excluded_nodes = (10.103.11.17,hostname1,hostname2)

當使用invited_nodes時,則所有沒有包含在invited_nodes值中的IP或主機將無法通過Oracel Net連接到數據庫。而如果使用excluded_nodes時,除了excluded_nodes值中列出的IP和主機不可訪問之外,其餘的節點都可以訪問數據庫。通常情況下,更傾向於使用excluded_nodes參數。

6、其它oracle network配置說明

工作壓力關係,在這裏不再介紹,有興趣參考官方文檔

Oracle® Database Net Services Administrator's Guide11g Release 2

7、常見的問題排除方法

7.1 ora-01031:insufficient privileges

sqlplus "/ as sysdba" 連不上,報ora-01031:insufficient privileges解決方法

注意多個數據庫實例時候,set ORACLE_SID='',

1)、檢查sqlnet.oraWINDOWS下位於%ORACLE_HOME%NETWORKADMIN目錄)是否包含這句:SQLNET.AUTHENTICATION_SERVICES=(NTS),沒有的話加上

2)、檢查登陸windows的用戶(administrator或安裝oracle時候使用的用戶)是不是在包含在ORA_DBA組中,域用戶沒有連上域服務器時就可能出現這種現象。

3)、 要保證 remote_login_passwordfile 參數 = EXCLUSIVE .

4)、看看是否需要使用orapassw生成口令文件 .

一種解決方法案例:

1)、檢查系統參數:

SQL> show parameter password

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

remote_login_passwordfile string EXCLUSIVE

2)、

select * from v$pwfile_users;

SQL>

爲空

3)、

SQL> grant sysdba to sys;

grant sysdba to sys

*

ERROR at line 1:

ORA-01994: GRANT failed: password file missing or disabled

4)、建立password文件

D:/>orapwd file="D:/oracle/product/10g/db_1/database/PWDoratest.ora" password=gp

oswong entries=10

5)、

SQL> select * from v$pwfile_users;

USERNAME SYSDB SYSOP

------------------------------ ----- -----

SYS TRUE TRUE

SYS正常顯示出來。

6)、重新在遠程以SYSDBA登錄,可正常使用。

如果口令文件創建的有問題,也是會報如下的錯誤:

ora-01031:insufficient privileges

口令文件的命名格式應爲orapwsid,並且sid是區分大小寫的。由於Target Database連接Auxiliary Database時需要驗證口令,

如果違反了以上規則,將會提示ORA-01031: insufficient privileges

我在用linux創建duplicate數據庫的時候就是因爲口令文件創建的路徑和名稱不對才遇到這個錯誤

7.2 ORA-12514:TNS監聽程序當前無法識別連接描述副中請求的服務

這是最常見的錯誤。

1)、打開Net Manager,選中服務名稱,檢查服務標識欄裏的服務名輸入是否正確。該服務名必須與服務器端監聽器配置的全局數據庫名一致。

2)、如果使用動態監聽,檢查監聽是否註冊到oracle實例中。解決方法:監聽啓動的狀態下,重啓oracle實例。

7.3 ORA-12541: TNS:沒有監聽器

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

$ lsnrctl start

C:lsnrctl start

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

檢查輸入的服務名與配置的服務名是否一致。另外注意生成的本地服務名文件tnsnames.ora裏每項服務的首行服務名稱前不能有空格。

7.5 ORA-12535: TNS:操作超時

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

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

用命令或在服務窗口中啓動監聽提示找不到路徑,或監聽服務啓動異常。打開註冊表,進入

HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/OracleOraHome11GTNSListener項,查看ImagePath字符串項是否存在,如果沒有,設定值爲實際安裝路徑,不同的安裝路徑設定值做相應的更改。這種方法同樣適用於Oracle實例服務,同上,找到如同HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/Oracle ServiceMYORACLE項,查看ImagePath字符串項是否存在,如果沒有,則新建,設定值爲安裝路徑。7.7 windows 修改計算機名後監聽出問題

1)、修改C:\Windows\System32\drivers\etc\hosts文件使計算機名和Ip映射正確

如:127.0.0.1 bj-pe2-chenqy

2)、修改oralce解析文件tnsnames.ora(ADDRESS = (PROTOCOL = TCP)(HOST = resoft)(PORT = 1521)) host=後面的主機名






轉載自: http://blog.csdn.net/haiross/article/details/13613931


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