今天來學習一下監聽的相關內容,昨晚被老大問了兩個關於監聽很簡單的問題,但是卻吞吞吐吐回答,而且有一個問題還答錯了,剛剛查了下資料,才發現“驢頭對了馬嘴”,哭笑不得。
一、監聽(listener)是什么
監聽器是Oracle基於服務器端的一種網絡服務,主要用於監聽客戶端向數據庫服務器端提出的連接請求。既然是基於服務器端的服務,那么它也只存在於數據庫服務器端,進行監聽器的設置也是在數據庫服務器端完成的。
oracle網絡配置有三個配置文件 listener.ora,tnsnames.ora,sqlnet.ora,其目錄均在$ORACLE_HOME/network/admin 。
Oracle客戶端與服務器端的連接是通過客戶端發出連接請求,由服務器端監聽器對客戶端連接請求進行合法檢查,如果連接請求有效,則進行連接,否則拒絕該連接。
二、如何配置監聽
1)listener.ora 主要負責服務器端的監聽配置,配置的基本模板:
# listener.ora Network Configuration File: /home/oracle/app/product/11/db/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER_ORA = (注:LISTENER_ORA 為監聽名字) (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 12.1.4.5)(PORT = 1521)) ) ) SID_LIST_LISTENER_ORA = (注:LISTENER_ORA 為監聽名字) (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = wsj) (ORACLE_HOME = /home/oracle/app/product/11/db) (SID_NAME = wsj) ) )
ADR_BASE_LISTENER = /oracle/app/oracle
其中:
PROTOCOL指的是監聽接收鏈接的協議;
HOST是指的監聽運行的主機或者IP地址;
PORT指的是監聽運行的端口;
SID_NAME指的是監聽服務的實例名;
GLOBAL_NAME指的是監聽服務的服務名;
ORACLE_HOME指的是監聽服務的$ORACLE_HOME。
如果[監聽名]和SID_LIST_[監聽名]配置是成對出現的,這代表是靜態監聽;如果listener.ora文件只有[監聽名]的配置,監聽就變成動態監聽。
動態注冊:客戶端(sys用戶)只能在遠程數據庫啟動的情況下連接上,遠程數據庫關閉時客戶端連接不上遠程數據庫。
靜態注冊:無論遠程數據庫處於開啟還是關閉狀態,客戶端(sys用戶)都可連接上。
靜態注冊可以在客戶端控制服務器端數據庫的啟停,而動態注冊則不可以,動態注冊的監聽在實例關閉時會被注銷。
數據庫關閉的狀態下,只有sys用戶可連入數據庫,其他用戶不可連入。
測試:
當數據庫關閉狀態時,sys用戶可以連入數據庫,提示接入空實例。其他用戶不能連接至數據庫:
[oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 11 21:14:56 2018 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance.
SQL> exit
[oracle@localhost ~]$ sqlplus hr/12
SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 11 21:16:47 2018
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
Process ID: 0
Session ID: 0 Serial number: 0
a.當為動態配置時:
查看listener.ora:
[oracle@localhost ~]$ cd /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/
[oracle@localhost admin]$ more listener.ora
# listener.ora Network Configuration File: /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /oracle/app/oracle
在數據庫關閉的情況下查看監聽狀態:
[oracle@localhost ~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 11-FEB-2018 21:27:00 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 11-FEB-2018 13:07:16 Uptime 0 days 8 hr. 19 min. 43 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora Listener Log File /oracle/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) The listener supports no services The command completed successfully
此時,遠程連接數據庫,發現有報錯:
[oracle@localhost ~]$ sqlplus sys/oracle@rcl as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 11 21:28:18 2018 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor Enter user-name:
當打開數據庫再次查看監聽狀態:
[oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 11 21:29:15 2018 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 830930944 bytes Fixed Size 2257800 bytes Variable Size 503319672 bytes Database Buffers 318767104 bytes Redo Buffers 6586368 bytes Database mounted. Database opened. SQL> ! [oracle@localhost ~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 11-FEB-2018 21:30:09 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 11-FEB-2018 13:07:16 Uptime 0 days 8 hr. 22 min. 52 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora Listener Log File /oracle/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Services Summary... Service "ORCLXDB" has 1 instance(s). Instance "mydb", status READY, has 1 handler(s) for this service... Service "mydb" has 1 instance(s). Instance "mydb", status READY, has 1 handler(s) for this service... The command completed successfully
b.當為靜態監聽時:
查看listener.ora : <當配置listener.ora中GLOBAL_DBNAME的值 == tnsnames.ora中的SERVICE_NAME!!!!!!!!!>
[oracle@localhost admin]$ more listener.ora # listener.ora Network Configuration File: /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = /oracle/app/oracle SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = mydb) ##listener.ora中GLOBAL_DBNAME的值 == tnsnames.ora中的SERVICE_NAME (ORACLE_HOME = /oracle/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = mydb) ##可通過env | grep ORACLE查看SID_NAME和$ORACLE_HOME的值 ) )
在數據庫關閉的情況下查看監聽狀態:
[oracle@localhost admin]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 11-FEB-2018 22:16:02 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 11-FEB-2018 22:13:25 Uptime 0 days 0 hr. 2 min. 36 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora Listener Log File /oracle/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Services Summary... Service "mydb" has 1 instance(s). Instance "mydb", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully
此時,遠程連接數據庫,成功連接:
[oracle@localhost ~]$ sqlplus sys/oracle@rcl as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Sun Feb 11 22:16:46 2018 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance.
開啟數據庫,再次查看監聽狀態(UNKNOWN即表示靜態監聽):
[oracle@localhost ~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 11-FEB-2018 22:17:49 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 11-FEB-2018 22:13:25 Uptime 0 days 0 hr. 4 min. 23 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora Listener Log File /oracle/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Services Summary... Service "ORCLXDB" has 1 instance(s). Instance "mydb", status READY, has 1 handler(s) for this service... Service "mydb" has 2 instance(s). Instance "mydb", status UNKNOWN, has 1 handler(s) for this service... Instance "mydb", status READY, has 1 handler(s) for this service... The command completed successfully
2)tnsnames.ora:主要負責客戶端的監聽配置,基本模板:
# tnsnames.ora Network Configuration File: /home/oracle/app/product/11/db/network/admin/tnsnames.ora # Generated by Oracle configuration tools.
#RCL為實例名
RCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.2)(PORT = 1521)) #TNSNAME 對應的主機,端口,協議
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb) #可通過show parameter service_name;查詢service_name 配置listener.ora中GLOBAL_DBNAME的值 == tnsnames.ora中的SERVICE_NAME
)
)
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命令察看。
RCL: 對應的本機,SALES 對應的另外一個IP 地址,里邊還定義了使用主用服務器還是共享服務器模式進行連接
3)sqlnet.ora
是駐留在客戶端機器和數據庫服務器上。使用該文件存儲和實現概要文件。數據庫服務器可以在sqlnet.ora文件中配置訪問控制參數。這些參數指定基於協議的客戶機是否允許或拒絕訪問。
列出一些常見參數:
BEQUEATH_DETACH:控制unix系統中signal handling 的開關,默認是no,即signal handling 打開。DEFAULT_SDU_SIZE:指定session data unit (SDU) 的大小,單位是bytes,建議在client端和server端都設置這個參數,確保鏈接的時候使用相同的SDU size,如果client端和server端配置的值不匹配會使用較小的。 LOG_DIRECTORY_CLIENT/LOG_DIRECTORY_SERVER:指定客戶端/server端log日志文件的位置 NAMES.DEFAULT_DOMAIN:設定客戶端解析名字的域 NAMES.DIRECTORY_PATH:指定client name解析方法的次序,默認是NAMES.DIRECTORY_PATH=(tnsnames, onames, hostname。取值可以是tnsnames,ldap(dictionary server),hostname/ezconnect,cds (分布式環境下),nis (Network Information Service (NIS) SQLNET_ALLOWED_LOGON_VERSIONS:指定運行鏈接的oracle的版本SQLNET_ALLOWED_LOGON_VERSIONS=(10,9,8) SQLNET.AUTHENTICATION_SERVICES:指定啟動一個或多個認證服務 SQLNET.INBOUND_CONNECT_TIMEOUT:指定客戶端沒有鏈接成功超時的時間。超時之后oracle會中斷鏈接,同時報錯。 SSL_VERSION:指定ssl鏈接的版本 TCP.EXCLUDED_NODES:指定不允許訪問oracle的節點,可以使用主機名或者IP地址 TCP.INVITED_NODES:指定允許訪問db的客戶端,他的優先級比TCP.EXCLUDED_NODES高。 TCP.VALIDNODE_CHECKING:使用這個參數來啟用上邊的兩個參數。 TNSPING.TRACE_DIRECTORY:使用這個參數指定tnsping trace文件的目錄,默認是$ORACLE_HOME/network/trace目錄
三、一些常用命令
a. lsnrctl start/stop 開啟監聽/關閉監聽
b.lsnrctl status 查看監聽狀態 (ready:動態,unknown:靜態,)
c.lsnrctl reload 重新裝入監聽器,重新讀取listener.ora文件,但不關閉監聽器。如果該文件發生了變化,重新刷新監聽器。
d.lsnrctl version 顯示oracle net軟件與協議適配器的版本。
e.lsnrctl services 列舉監聽器的服務信息,列出服務的一個匯總表及為每個協議服務處理程序所建立和拒絕的連接信息個數。
………………
先到這里啦,后續再加~~~