虛機資料庫伺服器oracle11G的監聽意外中止,報錯如下
在虛機上執行lsnrctl start,問題解決。
1、當連接配接異常時,可以通過分析監聽日志來查找線索
〜[test]$ find $ORACLE_HOME -name listener.log
/opt/64bit/oracle/11.2.0/log/diag/tnslsnr/sinrndvud062/listener/trace/listener .log
〜[DBCHC] $ vim /opt/64bit/oracle/11.2.0/log/diag/tnslsnr/sinrndvud062/listener/trace/listener.log
110856 Fri Oct 21 17:00:31 2018
110857 21-OCT-2018 17:00:31 (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = DBCHC)(CID =(PROGRAM = sqlplus)(HOST = sinrndvud062)(USER = ora112)))(ADDRESS =(PROTOCOL = tcp)(HOST = 10.160.164.131)(PORT = 47405)) 建立 DBCHC 12514
110858 TNS-12514:TNS:監聽器目前不知道連接配接中請求的服務描述符
110859 Fri Oct 21 17:02:47 2018
110860 21-OCT-2018 17:02:47 service_update OSMSRDB 0
110861 21-OCT-2018 17:02:53 service_update OSMSRDB 0
110862 21-OCT- 2018 17:02:54 (CONNECT_DATA =(SID = OSMSRDB)(CID =(PROGRAM = JDBC瘦用戶端)(HOST = jdbc )(USER = linqus)))(ADDRESS =(PROTOCOL = tcp)(HOST = 10.160) .164.132)(PORT = 32823))建立 OSMSRDB 0
110863 21-OCT-2018 17:02:56 service_update OSMSRDB 0
110864 Fri Oct 21 17:03:07 2018
110865 21-OCT-2018 17:03:07 service_update XSONGDB 0
110866 21-OCT-2018 17:03:08 (CONNECT_DATA =(SID = OSMSRDB)(CID =(PROGRAM = JDBC瘦用戶端)(HOST = jdbc )(USER = linqus)))(ADDRESS =(PROTOCOL = tcp)(HOST = 10.160。 164.132)(PORT = 32835))建立 OSMSRDB 0
110867 21-OCT-2018 17:03:08 service_update OSMSRDB 0
110868 Fri Oct 21 17:06:19 2018
110869 21-OCT-2018 17:06 :19 service_update XSONGDB 0
110870 21-OCT-2018 17:06:21 (CONNECT_DATA =(SID = XSONGDB)(CID =(PROGRAM = JDBC瘦用戶端)(HOST = jdbc )(USER = linqus))) (ADDRESS =(PROTOCOL = tcp)(HOST = 10.160.164.200)(PORT = 60498))建立 XSONGDB 0
110871 21-OCT-2018 17:06:22 service_update XSONGDB 0
110872 21-OCT-2018 17:06:24 (CONNECT_DATA =(SID = XSONGDB)(CID =(PROGRAM = JDBC瘦用戶端)(HOST = jdbc )(USER = linqus)))(ADDRESS =(PROTOCOL = tcp)(HOST = 10.160.164.200)(PORT = 60502))建立 XSONGDB 0
110873 21-OCT-2018 17:06:25 service_update XSONGDB * 0
在RAC環境中,需要切換到網格使用者來查詢監聽日志
test #su - grid
/ home / ora11grid [FRWK]:找到$ find ORACLE_HOME -name listener.log
查找:<code>/ opt / ora11grid / crf / admin / run / crflogd':權限被拒絕<br/>查找:</code>/ opt / ora11grid / crf / admin / run / crfmond':權限被拒絕
/opt/ora11grid/log/diag/tnslsnr/vgerndpud852/listener/trace/listener.log
/ home / ora11grid [ FRWK]:lsnrctl
LSNRCTL for Linux:版本11.2.0.3.0 - 生産于17-NOV-2018 04:28:53
版權所有(c)1991,2011 ,Oracle。版權所有。
歡迎來到LSNRCTL,輸入“幫助”擷取資訊。
LSNRCTL> show
show
asterisk(*)表示修飾符或擴充指令後可以使用以下操作:
rawmode displaymode
rules trc_file
trc_directory trc_level
log_file log_directory
log_status current_listener
inbound_connect_timeout startup_waittime
snmp_visible save_config_on_stop
dynamic_registration enable_global_dynamic_endpoint
oracle_home pid
connection_rate_limit
LSNRCTL> show log_status
連接配接到(DESCRIPTION =(ADDRESS =(PROTOCOL = IPC)(KEY = LISTENER)))
LISTENER參數“log_status”設定為ON
指令已成功完成。
2、監聽異常中止解決方案
可以将以下參數添加到listener.ora中
SUBSCRIBE_FOR_NODE_DOWNEVENT= OFF
如下:
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER = OFF
編輯監聽監控腳本,當監聽異常中止後自動啟動監聽(每分鐘偵測一次)
腳本如下:
$ cat listener.sh
#!/bin/bash
ORACLE_HOME = / u01 / product / oracle / 11.2.0 / db_1; export ORACLE_HOME
pid =<code>ps -ef | grep tnslsnr | grep -v grep | awk'{print $ 2}'</code>
if [<code>echo $ pid | awk -v bi = 1'{print($ 1&gt; bi)?“1”:“0”}'</code>-eq“1”]
else
echo“監聽器運作正常”
echo“監聽器已經停止”
$ ORACLE_HOME / bin / lsnrctl start
exit
$ crontab -l
/ 1 sh /data/run/listener.sh 1 >> / data / run / log / listener.log 2 >> / data / run / log / listener.bad
3、監聽日志的定期清理
要對監聽日志檔案(listener.log)進行定期清理,如果不定期清理,會遇到下面一些麻煩:
1)監聽日志檔案(listener.log)變得越來越大,占用額外的存儲空間。(當然現在存儲白菜價,不差那幾G的空間。但是我們還是要本着工匠情懷,精益求精)
2)監聽日志檔案(listener.log)變得太大會帶來一些問題:LISTENER.LOG日志大小不能超過2GB,超過會導緻LISTENER監聽器無法處理新的連接配接。
3)監聽日志檔案(listener.log)變得太大,給寫入、檢視帶來的一些性能問題、麻煩。
另:監聽日志listener.log日志放在了$ORACLE_BASE/diag/tnslsnr/機器名/listener/trace目錄下
4、三種檔案的解析
1) sqlnet.ora-----通過這個檔案來決定怎麼樣找一個連接配接中出現的連接配接字元串。
例如我們用戶端輸入
sqlplus sys/oracle@ora
假如我的sqlnet.ora是下面這個樣子
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME,EZCONNECT)
那麼,用戶端就會首先在tnsnames.ora檔案中找ora的記錄.如果沒有相應的記錄則嘗試把ora當作一個主機名,通過網絡的途徑去解析它的 ip位址然後去連接配接這個ip上GLOBAL_DBNAME=ora這個執行個體,當然我這裡ora并不是一個主機名
EZCONNECT表示:可以使用簡單的方式連接配接Oracle例如:
1 CONNECT username/password@host[:port][/service_name][/instance_name]
2 CONNECT username/password@host[:port][/service_name]
3 sqlplus / as sysdba
4 sqlplus sys as sysdba/[email protected]:1521
如果我是這個樣子
NAMES.DIRECTORY_PATH= (TNSNAMES)
那麼用戶端就隻會從tnsnames.ora查找ora的記錄,括号中還有其他選項,如LDAP等并不常用。
2) tnsnames.ora------這個檔案類似于unix 的hosts檔案,提供的tnsname到主機名或者ip的對應。
隻有當sqlnet.ora中類似NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,也就是用戶端解析連接配接字元串的順序中有TNSNAMES是,才會嘗試使用這個檔案。
例子:
ORA_TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = LXL)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora)
ORA_TEST:用戶端連接配接伺服器端使用的服務别名。注意一定要頂行書寫,否則會無法識别服務别名。
PROTOCOL:用戶端與伺服器端通訊的協定,一般為TCP,該内容一般不用改。
HOST:ORACLE伺服器端IP位址或者hostname。確定伺服器端的監聽啟動正常。
PORT:資料庫偵聽正在偵聽的端口,可以察看伺服器端的listener.ora檔案或在資料庫偵聽所在的機器的指令提示符下通過lnsrctl status [listener name]指令察看。此處Port的值一定要與資料庫偵聽正在偵聽的端口一樣。
SERVICE_NAME:在伺服器端,用system使用者登陸後,sqlplus> show parameter service_name指令檢視。
3) listener.ora------listener監聽器程序的配置檔案
關于listener程序就不多說了,接受遠端對資料庫的接入申請并轉交給oracle的伺服器程序。是以如果不是使用的遠端的連接配接,listener程序就不是必需的,同樣的如果關閉listener程序并不會影響已經存在的資料庫連接配接。
#listener.ora Network Configuration File: #E:/oracle/product/10.1.0/Db_2/NETWORK/ADMIN/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ora)
(ORACLE_HOME = E:/oracle/product/10.1.0/Db_2)
(SID_NAME = ora)
LISTENER =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
LISTENER :監聽名稱,可以配置多個監聽,多個監聽的端口号要區分開來。
GLOBAL_DBNAME :全局資料庫名。通過select * from global_name; 查詢得出
ORACLE_HOME :oracle軟體的跟目錄
SID_NAME :伺服器端(本機)的SID
PROTOCOL:監聽協定,一般都使用TCP
HOST:本機IP位址,雙機時候使用浮動IP (用IP位址較好解析)
PORT:監聽的端口号,使用netstat –an 檢查該端口不被占用。
當你輸入sqlplus sys/oracle@orcl的時候
1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
2. 則查詢tnsnames.ora檔案,從裡邊找orcl的記錄,并且找到主機名,端口和service_name
3. 如果listener程序沒有問題的話,建立與listener程序的連接配接。
4. 根據不同的伺服器模式如專用伺服器模式或者共享伺服器模式,listener采取接下去的動作。預設是專用伺服器模式,沒有問題的話用戶端就連接配接上了資料庫的server process。
5. 這時候網絡連接配接已經建立,listener程序的曆史使命也就完成了。