1)、對於oracle網絡寫的不是很全,有的地方可能有誤,希望大家多多提出意見!
2)、本文檔適合有一定oracle基礎的人員閱讀。
3)、此文檔解決了oracle監聽的基本配置、一些網絡組件的基本概念、常見問題排錯方法、怎么配置動態監聽和靜態監聽以及非默認監聽、安裝多個實例時如何配置監聽
4)、如果對監聽很感興趣請參考oracle 官方聯機文檔,已經打包。
Oracle® Database
Net Services Administrator's Guide
11g Release 2 (11.2)
E10836-06
Oracle® Database
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圖形窗口如下圖示:
圖(一)
1.4 Oracle監聽器配置(LISTENER)
如 圖(一)示,選中樹形目錄中監聽程序項,再點擊左上側“+”按鈕添加監聽程序,點擊監聽程序目錄,默認新加的監聽器名稱是LISTENER(該名稱也可以 由任意合法字符命名)。選中該名稱,選中窗口右側欄下拉選項中的“監聽位置”,點擊添加地址按鈕。在出現的網絡地址欄的協議下拉選項中選中 “TCP/IP”,主機文本框中輸入主機名稱或IP地址(如果主機即用作服務端也作為客戶端,輸入兩項之一均有效;如果主機作為服務端並需要通過網絡連 接,建議輸入IP地址),端口文本框中輸入數字端口,默認是1521,也可以自定義任意有效數字端口。配置好的監聽位置如下圖示:
圖(二)
選 中窗口右側欄下拉選項中的“數據庫服務”,點擊添加數據庫按鈕。在出現的數據庫欄中輸入全局數據庫名,如myoracle。注意這里的全局數據庫名與數據 庫SID有所區別,全局數據庫名實際通過域名來控制在同一網段內數據庫全局命名的唯一性,就如Windows下的域名控制器,如這里可以輸入 myoracle。Oracle主目錄填寫oracle home地址我這里是/u01/app/oracle/product/11.2.0/dbhome_1,輸入SID,如ORCL。完整的數據庫服務配置如下圖示:
圖(三)
保 存以上配置,默認即可在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客戶端的配置。選中如圖(一)中的服務命名,再點擊左上側“+”按鈕,彈出如下圖示對話框:
圖(四)
輸入Net服務名,如myoracle,點擊下一步,進入下圖示對話框:
圖(五)
選中TCP/IP(Internet協議),點擊下一步,如下圖示:
圖(六)
輸入主機名與端口號。注意這里的主機名與端口號必須與數據庫服務器端監聽器配置的主機名和端口號相同,主機名可以是IP也可以是主機名。點擊下一步,如下圖示:
圖(七)
輸入服務名。這里的服務名實際上就是數據庫服務器端監聽器配置中的全局數據庫名,前者與后者必須相同。服務名(service name)必須寫正確。查看服務名方法:SQL> select value from v$parameter where name = 'service_names';
連接類型 通常選專用服務器,這要視數據庫服務器的配置而定,如果配置的共享數據庫服務器,這里的連接類型就要選共享服務器,否則建議選專用服務器(關於專用服務器 的介紹請參閱相關文檔)。配置好后點擊下一步,如下圖示:
圖(八)
如 果數據庫服務器端相關服務啟動了,可以點擊測試按鈕進行連接測試。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)。配置完成的本地服務名如下圖示:
圖(九)
樹形目錄下的服務命名可以通過編輯菜單里的重命名菜單更改成任意合法字符組成的服務名稱,注意服務名稱前不能有空格字符,否則可能無法連接數據庫服務器。
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.
2、oracle 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_names 和show parameter instance_name可以查看這兩個參數的值。
注冊到監聽器中的實例值從init.ora文件中的instance_name參數取得。如果該參數沒有設定值,那么它將取init.ora文件中的db_name的值。如果在RAC中配置,您必須將集群中每個實例的instance_name參數設置為一個唯一的值。
注冊到監聽器中的服務值從init.ora文件中的參數service_names取得。如果該參數沒有設定值,數據庫將拼接init.ora文件中的 db_name和db_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_names和instance_name的值,那么僅當數據庫在監聽器運行之后啟動時,動態注冊才會發生;在這種情況下,如果監聽器后來發生了重啟,動態注冊信息將會丟失。顯然,最好在所有的數據庫啟動之前先啟動監聽器,這樣就會避免沒有顯式設置 service_names和instance_name的值時,若重啟監聽器帶來的動態注冊信息丟失的情況。
為初始化參數service_names和instance_name設置顯式的值是個很好的實踐,盡管如果您沒有設置它們,Oracle也會為動態注冊而生成默認值(基於db_name和db_main)。這樣做的原因是,如果監聽器在數據庫啟動之后重新啟動,其動態注冊行為將會有一些微妙的區別.如果監聽器在數據庫運行之后重新啟動,你們僅當您在init.ora文件中顯式地設置了service_names和instance_name的值時,每個數據庫的PMON進程才會在很短的時間之后自動注冊數據庫。
如果需要執行連接時故障轉移或負載均衡,或者想要在RAC中配置在實例之間透明地分布連接,那么使用service_names參數將是必要的。為啟用這些功能,您只需要將每個實例的數據庫參數文件中的service_names設置為同一個值,並在客戶端連接請求的service_name設置中引用該值。
如果沒有顯式設置service_names和instance_name的值,那么僅當數據庫在監聽器運行之后啟動時,動態注冊才會發生;在這種情況下,如果監聽器后來發生了重啟,動態注冊信息將會丟失。顯然,最后在啟動任何數據庫之前啟動服務器上的監聽器,並完全避免監聽器的重啟。
另外,您還可以在SQL*PLUS中使用命令:
SQL>ALTER SYSTEM REGISTER;
在數據庫打開時的任何時候,手工地在監聽器中注冊服務值。這個命令對於替換因監聽器重啟而丟失地服務值很有用,並且它所注冊地值與在數據庫啟動時由動態注冊所設置的值完全一樣。
動態監聽:
oracle監聽器運行后,oracle實例在open時,會動態向監聽程序注冊其service_names和instance_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
其它步驟省略,如下圖所示:
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
至此,配置非默認監聽結束。環境中在同一個數據庫軟件上安裝兩個實例:ORCL和UPRR。
ORCL使用監聽listener 端口1521 UPRR 使用listener1 端口1522
3.7 同時啟動兩個實例和兩個監聽
剛才看到了在啟動listener1的時候必須把listener關閉,其實可以讓實例ORCL和UPRR使用一個監聽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
4、Orace 監聽配置修改說明
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中使用的是ADR,ADR是11G的新特性,欲詳細了解百度之。
這里是個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個比較常用的操作。
在某些特定的場合可能會有這樣的需求。控制這個功能的參數是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
保存又參數: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
#--------------------------------------------
有時候處於安全考慮,會需要對listener設置密碼。
如果有多個監聽,那么需要先設置當前的監聽
LSNRCTL>set current_listener listener_name
使用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 ~]$
listener的密碼策略是防止stop,所以在stop時需要確認密碼,在start時不需要輸入密碼。
LSNRCTL> set password
Password:
The command completed successfully
使用set password輸入正確的密碼后,就可以進行stop操作了。
5、oracle sqlnet.ora說明
sqlnet.ora作用類似於linux或者其他unix的nsswitch.conf文件,通過這個文件來決定怎么樣找一個連接中出現的連接字符串。可以沒有此文件。
例如我們客戶端輸入
sqlplus system/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等並不常用。
Sqlnet.ora還有一個重要作用就是限制IP訪問Oracle。與防火牆類似的功能,Oracle 提供限制與允許特定的IP或主機名通過Oracle Net來訪問數據庫。這個功能由sqlnet.ora配置文件來實。通過監聽器的限制,比在數據庫內部通過觸發器進行限制效率要高。
限制IP例子:
通過在sqlnet.ora文件中增加下列記錄來實現
tcp.validnode_checking = yes
tcp.invited_nodes = (hostname1, hostname2,ip1,ip2)
tcp.excluded_nodes = (10.103.11.17,hostname1,hostname2)
tcp.validnode_checking = yes
tcp.invited_nodes = (hostname1, hostname2,ip1,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 Guide 11g Release 2
7、常見的問題排除方法
7.1 ora-01031:insufficient privileges
sqlplus "/ as sysdba" 連不上,報ora-01031:insufficient privileges解決方法
注意多個數據庫實例時候,set ORACLE_SID='',
1)、檢查sqlnet.ora(WINDOWS下位於%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=后面的主機名