一、Oracle監聽
監聽具備獨立性:與數據庫的啓動順序無關前後,監聽知道數據庫的位置與端口,與數據庫沒有常鏈接。
鏈接創建流程:客戶端鏈接監聽,監聽將客戶端鏈接轉發給數據庫實例,數據庫實例專門爲鏈接啓動一個
server process,同時將SP的地址告訴監聽,監聽再轉告客戶端,客戶端直接對SP發起鏈接請求,SP校驗經過
用戶名密碼後正式創建鏈接。監聽只在創建鏈接時啓做用,與數據庫沒有常鏈接,鏈接創建後,監聽關閉不影
響會話正常執行SQL。
當鏈接時有@網絡服務名,客戶端會自動調用tnsname.ora文件,解析成IP,端口,連的服務名html
listener.ora文件: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1) (PROGRAM = extproc) ) -- 靜態鏈接配置,靜態註冊在查詢監聽狀態時會有UNKNOWN狀態的服務,靜態鏈接穩定,數據庫將服務名註冊到監聽 (SID_DESC = (GLOBAL_DBNAME =ipems) --服務名 (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1) ( SID_NAME = ipems) --實例名 ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521)) ) ) -- 同一listener中配置一動態一靜態監聽 LSNR2 = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1526)) ) ) SID_LIST_LSNR2 = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1) (PROGRAM = extproc) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = ipems) (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1) (GLOBAL_DBNAME = ipems) ) ) tnsnames.ora文件 ipems = --網絡服務名 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.200)(PORT = 1521)) ) (CONNECT_DATA = (SERVER= DEDICATED) --服務器模式 (SERVICE_NAME = ipems) --服務名 ) ) lsnr2 = --網絡服務名 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.200)(PORT = 1526)) ) (CONNECT_DATA = (SERVER= DEDICATED) --服務器模式 dedicated,shared (SERVICE_NAME = ipems) --服務名 ) ) rac tnsnames.ora racdb= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.10)(PORT=1521)) --vip (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.11)(PORT=1521))) (CONNECT_DATA= (SERVICE_NAME=racdb))) -- 非默認的動態listener能夠正常起來須要在initSID.ora中配置local_listener='lsnr2'; --動態網絡服務名
二、Oracle數據庫的幾個名字
show parameter name
數據庫名:select dbid,name from v$database;
實例名: show parameter instance
select INSTANCE_NUMBER,INSTANCE_NAME from v$instance;
服務名: show parameter service
主機名:數據庫IP地址
網絡服務名:隨便啓,最好與實例名相同
三、netca 配置監聽程序和本地Net服務
[root@redhat7 ~]# xhost +
[root@redhat7 ~]# export DISPLAY=192.168.0.1:0.0 --將圖形界面映射到本地
[root@redhat7 ~]# su - oracle
[oracle@redhat7 ~]$ netca
lsnrctl start| status| stop --監聽的啓動關閉狀態查詢
tnsping ipems --tnsping網絡服務名,測試是否能夠ping通,能ping通不必定能連上
netstat -tulnp|grep 1521 --監聽是否正常啓動
alter system register; --手動註冊,pmon註冊數據庫service name到監聽裏
四、幾種鏈接方式
sqlplus hr/hr --不走監聽,本地連
sqlplus / as sysdba --不走監聽
sqlplus hr/hr@ipems --走監聽
sqlplus hr/hr@192.168.0.100:1521/ipems --走監聽,沒有走tnsname.ora
鏈接時oracle發現有@字符串,會利用tnsnames.ora解析爲主機IP和端口號,經過這兩找到監聽,監聽再根據service_name
找到具體實例。
五、雙監聽:雙IP或者雙端口
遺留,雙網卡,負載均衡。
六、oracle的監聽日誌
查找日誌:
# find /u01/app/ -name listener.log
lsnrctl status
oracle監聽日誌解析
監聽日誌記錄監聽器的工做過程,由於一些32bitOS自帶的文件系統不支持2GB以上的文件,致使監聽服務進程
(tnslsnr)append write日誌文件出錯關於「LISTENER.LOG日誌大小不能超過2GB,超過會致使LISTENER監聽器無
法處理新的鏈接。
清理監聽日誌:
lsnrctl set log_status off
mv listener.log listener.yyyymmdd
lsnrctl set log_status on
lsnrctl status顯示信息解析
UNKNOWN,READY狀態說明其目前有一個靜態註冊和一個動態註冊
SID_XPT服務:爲DG準備的服務,DB BROKER會用到,若是不用DG能夠刪掉。
SID:啓動數據庫實例的服務
SIDXDB:高效處理XML數據的服務,默認會佔用8080端口。
PLSExtProc:PL/SQL調用外部接口(C、JAVA編寫的過程)的服務,能夠從listerner.ora中移除該項,在監聽
啓動時再也不啓動PLSExtProc服務。
七、sqlnet.ora用來決定oracle怎麼解析一個鏈接中出現的字符串。在域用戶即非系統管理員用戶安裝oracle
建立數據庫實例時會報錯,能夠將用戶添加到DBA組或者刪掉sqlnet.ora文件。sql
八、涉及IP地址有關的文件
Oracle默認會在..\product\10.2.0\db_1下面建立一個名爲「當前IP或機器名_SID」的目錄,該目錄存儲
的是SID實例的配置等信息;
同時Oracle默認在..\product\10.2.0\db_1\oc4j\j2ee目錄下建立一個名爲「OC4J_DBConsole_當前IP或機器名_SID」
的目錄,存放的是OracleDBConsole服務的相關配置等信息;
Oracle 監聽文件listener.ora,本地網絡服務tnsnames.ora中的HOST設爲當前IP地址;
數據庫遷移或修改IP後只用關注第三種狀況,對應修改便可。數據庫
參考資料:
http://www.cnblogs.com/kerrycode/p/4227579.html
http://blog.itpub.net/17203031/viewspace-701017
http://www.ha97.com/4785.html服務器