shell sqlplus执行sql文_如何通过 Shell 监控异常等待事件和活跃会话
作者 | JiekeXu
來源 |?JiekeXu之路(ID: JiekeXu_IT)
轉(zhuǎn)載請(qǐng)聯(lián)系授權(quán) |?(微信ID:xxq1426321293)
大家好,我是 JiekeXu,分開這么久很高興又和大家見面了,今天分享下如何通過 Shell 監(jiān)控異常等待事件和活躍會(huì)話。本文首發(fā)于微信公眾號(hào)【JiekeXu之路】,歡迎點(diǎn)擊上方藍(lán)字關(guān)注我吧!前幾天有網(wǎng)友在墨天輪平臺(tái)上問到“如何寫一個(gè)定時(shí)任務(wù)監(jiān)控用戶會(huì)話連接數(shù)”的問題,由于當(dāng)時(shí)比較忙,回答的比較簡(jiǎn)單也比較匆忙。最近也因?yàn)楣拘马?xiàng)目老是加班,運(yùn)維保障,安裝 RAC、搭建 DG 、故障處理等等,占據(jù)了很大個(gè)人時(shí)間,休息充電的時(shí)間難免減少了很多,今日利用閑暇時(shí)間,來繼續(xù)說一說監(jiān)控會(huì)話相關(guān)的這個(gè)話題。
通常我們平時(shí)都是通過運(yùn)行 SQL 語句直接查詢 V$SESSION 視圖得到結(jié)果,然后直接輸出到屏幕上,具體的 SQL 如下:
--- 查看用戶會(huì)話select username,count(username) from gv$session where username is not null group by username order by 2;--- 查看異常等待事件select inst_id,sid,serial#,program,sql_id,event,seconds_in_wait "wait(s)" from gv$sessionwhere type<>'BACKGROUND' and wait_class <> 'Idle' order by inst_id;---?查看活躍會(huì)話數(shù)select inst_id,status,count(*) from gv$session where?type<>?'BACKGROUND'?group?by?inst_id,status?order?by?3;今天主要是通過 Shell 循環(huán)等手段來實(shí)現(xiàn):
[oracle@JiekeXu ~]$ more wait_event.shwhile truedoDATE=`date?+%Y-%m-%d`sqlplus "/ as sysdba" << EOF | grep -A5 EVENT | grep -v Version | grep -v Copyright | grep -v Enterprise | grep -v '>'#sqlplus?"/?as?sysdba"?1>>/home/oracle/wait_history_$DATE.log?2>&1?<'set termout offset linesize 250 pagesize 100col inst_id for 9col sid for 9999col serial# for 99999column program format a30column event format a35col "wait(s)" for 9999--set?timing?onselect inst_id ,sid,serial#,program,sql_id,event,seconds_in_wait "wait(s)" from gv\$sessionwhere type<>'BACKGROUND' and wait_class <> 'Idle' order by inst_id;exitEOFsleep?5done注:gv\$session 中需要用 “\” 轉(zhuǎn)義 “$” 符號(hào),grep -A5 EVENT 這個(gè)只是過濾掉 SQLPlus 登陸退出的提示,以便更友好的輸出結(jié)果。?每隔 5 秒運(yùn)行此腳本,便可以輸出異常的等待事件到屏幕上,通過 While True 循環(huán)然后等待 5 s 繼續(xù)執(zhí)行達(dá)到監(jiān)控效果,如下是我的測(cè)試環(huán)境執(zhí)行結(jié)果:
[oracle@JiekeXu ~]$ sh wait_event.shINST_ID SID SERIAL# PROGRAM SQL_ID EVENT wait(s)------- ----- ------- ------------------------------ ------------- ----------------------------------- -------1 275 21812 sqlplus@JiekeXu (TNS V1-V3) d9n1shwuv7x4q SQL*Net message to client 0INST_ID SID SERIAL# PROGRAM SQL_ID EVENT wait(s)------- ----- ------- ------------------------------ ------------- ----------------------------------- -------1 275 23182 sqlplus@JiekeXu (TNS V1-V3) d9n1shwuv7x4q SQL*Net message to client 0INST_ID SID SERIAL# PROGRAM SQL_ID EVENT wait(s)------- ----- ------- ------------------------------ ------------- ----------------------------------- -------1 275 17811 sqlplus@JiekeXu (TNS V1-V3) d9n1shwuv7x4q SQL*Net message to client 0INST_ID SID SERIAL# PROGRAM SQL_ID EVENT wait(s)------- ----- ------- ------------------------------ ------------- ----------------------------------- -------1 275 4359 sqlplus@JiekeXu (TNS V1-V3) d9n1shwuv7x4q SQL*Net message to client 0INST_ID SID SERIAL# PROGRAM SQL_ID EVENT wait(s)------- ----- ------- ------------------------------ ------------- ----------------------------------- -------1 275 31876 sqlplus@JiekeXu (TNS V1-V3) d9n1shwuv7x4q SQL*Net message to client 0INST_ID SID SERIAL# PROGRAM SQL_ID EVENT wait(s)------- ----- ------- ------------------------------ ------------- ----------------------------------- -------1 275 12138 sqlplus@JiekeXu (TNS V1-V3) d9n1shwuv7x4q SQL*Net message to client 0INST_ID SID SERIAL# PROGRAM SQL_ID EVENT wait(s)------- ----- ------- ------------------------------ ------------- ----------------------------------- -------1 275 44219 sqlplus@JiekeXu (TNS V1-V3) d9n1shwuv7x4q SQL*Net message to client 0^Z[1]+ Stopped sh wait_event.sh當(dāng)然如果異常等待事件較多,或者這里不止一條 SQL 語句,執(zhí)行結(jié)果輸出到屏幕上不是一個(gè)很好的選擇,便可以使用上面注釋掉的一行 SQL 將結(jié)果輸入到?wait_history_$DATE.log 文件,然后查查此文件即可。
watch 命令
下面在看一下使用?watch 命令的效果,watch 是一個(gè)非常實(shí)用的命令,基本所有的 Linux 發(fā)行版都帶有這個(gè)小工具,如同名字一樣,watch 可以幫你監(jiān)測(cè)一個(gè)命令的運(yùn)行結(jié)果,省得你一遍遍的手動(dòng)運(yùn)行。其后跟?-n 或 --interval 參數(shù), watch 缺省每 2 秒運(yùn)行一下程序,可以用-n或 -interval 來指定間隔的時(shí)間。
watch -n 1 /usr/bin/sh cat_user_session.sh由于這里是測(cè)試用例,沒有更多的連接,效果不太明顯。異常等待事件和活動(dòng)會(huì)話均不明顯,下面通過一生產(chǎn)環(huán)境 ADG 備庫(kù)來演示一下。
監(jiān)控異常等待事件案例分享
監(jiān)控 ADG 備庫(kù)活動(dòng)會(huì)話和異常等待事件,每隔 10?秒鐘記錄一次,將結(jié)果保存到日志文件中,并定期清理歷史日志文件。
JIEKEDB1:/app/soft$lssession_history_2020-09-28.logPatchSearch.xml session_history_2020-09-22.log session_history_2020-09-28.log.bakagent session_history_2020-09-23.log session_history_2020-09-29.logcatsession.sh session_history_2020-09-24.log cleartmplog.sh session_history_2020-09-25.log p19433930_11204180116_AIX64-5L.zip session_history_2020-09-26.log tmp.logp20380541_112040_AIX64-5L.zip?session_history_2020-09-27.log---- 申明環(huán)境變量后存放一些要查的 SQL,并將結(jié)果存入 session_history_$DATE.logJIEKEDB1:/app/soft$cat?catsession.shumask 022export ORACLE_BASE=/app/oracleexport ORACLE_HOME=/app/product/11.2.0/dbexport ORACLE_SID=JIEKEXUDB1export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATHexport LIBPATH=$ORACLE_HOME/libDATE=`date +%Y-%m-%d`sqlplus "/ as sysdba" 1>>/app/soft/session_history_$DATE.log 2>&1 <set termout offset heading off feedback off pagesize 0 verify off echo offset linesize 250 pagesize 300column program format a30column event format a45set time onhost echo '--------------historysession-----------------------'select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'),inst_id,sid,serial#,program,sql_id,event,SECONDS_IN_WAITfrom gv\$sessionwhere status='ACTIVE' and type <> 'BACKGROUND' and wait_class<>'Idle'and event not in('parallel recovery slave next change')order by inst_id,sid;host echo '--數(shù)據(jù)庫(kù)異常等待事件-----------------'select event, SECONDS_IN_WAITfrom v\$session where type <> 'BACKGROUND' and STATE='ACTIVE' and wait_class<>'Idle'group by event,SECONDS_IN_WAITorder by SECONDS_IN_WAIT desc;host echo '-------------------------------'host echo '--數(shù)據(jù)庫(kù)連接數(shù)-----------------'select inst_id,status,count(*) from gv\$session where type <> 'BACKGROUND' group by inst_id,status order by 1;exit;EOFsession_history_$DATE.log 日志每天生成一個(gè),時(shí)間長(zhǎng)久不利于管理,故需要清理,然后使用?cleartmplog.sh?定期清理,腳本如下:
JIEKEDB1:/app/soft$cat?cleartmplog.shfind /app/soft -name "session_history*" -mtime +7 -exec rm -rf {} \;最后,每 10 秒運(yùn)行一次,這里還有一點(diǎn)小技巧,crontab?里顯示的是分時(shí)日月周,并沒有秒級(jí)別的設(shè)置,這里便借助 sleep 10?來達(dá)到 10 秒運(yùn)行一次的效果。
min hour day month week command分鐘?????小時(shí)??????日??????月???????周??????動(dòng)作(任務(wù)命令)????0-59 0-23 1-31 1-12 0-7 命令或腳本(寫絕對(duì)路徑)JIEKEDB1:/app/soft$crontab -l* * * * * sleep 10; /usr/bin/sh /app/soft/catsession.sh* * * * * sleep 20; /usr/bin/sh /app/soft/catsession.sh* * * * * sleep 30; /usr/bin/sh /app/soft/catsession.sh* * * * * sleep 40; /usr/bin/sh /app/soft/catsession.sh* * * * * sleep 50; /usr/bin/sh /app/soft/catsession.sh*?*?*?*?*?sleep?60;?/usr/bin/sh?/app/soft/catsession.sh30 2 * * * /usr/bin/sh /app/soft/cleartmplog.sh最后,摟一眼生成的日志,?session_history_2020-09-29.log 日志中每 10 秒則會(huì)顯示 SQL 查詢結(jié)果,但是有 SQLPlus 登入登出信息,顯示的格式不是很友好,腳本可以繼續(xù)優(yōu)化。我這里是 AIX 6.1 ADG 備庫(kù)上的信息,部分 Shell 命令在操作系統(tǒng)上不好用,但 Linux 系統(tǒng)則沒有問題,希望看到的小伙伴們可以在嘗試一下。
當(dāng)備庫(kù)發(fā)生性能問題時(shí),便可以通過此日志記錄當(dāng)時(shí)會(huì)話信息,異常等待事件,便可以分析性能問題,大大的提供了分析資料,節(jié)省了很多查詢時(shí)間,是值得借鑒的,故此推薦給小伙伴們使用。
最后推薦一下收藏已久的 Oracle 五大學(xué)習(xí)網(wǎng)站,如有需要的小伙伴們可前去圍觀:
網(wǎng)站一、 https://www.oracle.com/technetwork/index.html,簡(jiǎn)稱 OTN,全世界最大的開發(fā)者社區(qū),涵蓋很多 Oracle 的學(xué)習(xí)資源,內(nèi)容是英文的;
網(wǎng)站二、 http://www.itpub.net/, 國(guó)內(nèi)專業(yè)的 IT 技術(shù)論壇社區(qū);
網(wǎng)站三、http://www.chinaunix.net , 中國(guó)最大的 Linux/Unix 技術(shù)社區(qū)網(wǎng)站, 此外對(duì)編程、數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)安全等也涉獵頗多;
網(wǎng)站四、http://www.eygle.com,云和恩墨創(chuàng)始人、Oracle ACED 蓋國(guó)強(qiáng)老師的個(gè)人網(wǎng)站,提供很多優(yōu)質(zhì)的關(guān)于 Oracle 的文章和資料,值得收藏與學(xué)習(xí);
網(wǎng)站五、http://yangtingkun.net , Oracle 的那些事兒,Oracle 百科全書楊廷琨老師個(gè)人網(wǎng)站, ITPUB Oracle數(shù)據(jù)庫(kù)管理版版主 ,人稱"楊長(zhǎng)老",值得收藏與學(xué)習(xí)。
每天進(jìn)步一點(diǎn),一年后的進(jìn)步將會(huì)很大,遠(yuǎn)遠(yuǎn)大于 “1”;每天退步,即使退步一點(diǎn)點(diǎn),一年后幾乎退步為 "0"。每天加油,讓我們一起努力做更好的自己,今天就到這里了,祝小伙伴們中秋、國(guó)慶開心愉快,闔家團(tuán)圓!
Oracle 12c 及以上版本補(bǔ)丁更新說明及下載方法(收藏版)
Oracle 11.2.0.4 RAC 最新補(bǔ)丁下載(11.2.0.4.200714)
11g RAC 在線存儲(chǔ)遷移實(shí)現(xiàn) OCR 磁盤組完美替換
我的 OCM 之路|書寫無悔青春,追夢(mèng)永不止步
Oracle 19c 之多租戶 PDB 連接與訪問(三)
案例:RMAN 備份控制文件報(bào)錯(cuò) ORA-00230
Oracle 12C 最新補(bǔ)丁下載與安裝操作指北
DBA 常用的軟件工具有哪些(分享篇)?
Oracle 相關(guān)認(rèn)證證書查詢及真?zhèn)伪鎰e
Oracle 每日一題系列合集
點(diǎn)亮在看,你最好看!
總結(jié)
以上是生活随笔為你收集整理的shell sqlplus执行sql文_如何通过 Shell 监控异常等待事件和活跃会话的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows服务和进程的区别和联系
- 下一篇: 王者荣耀孙尚香的攻略有哪些