日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell sqlplus执行sql文_如何通过 Shell 监控异常等待事件和活跃会话

發布時間:2023/12/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell sqlplus执行sql文_如何通过 Shell 监控异常等待事件和活跃会话 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者 | JiekeXu

來源 |?JiekeXu之路(ID: JiekeXu_IT)

轉載請聯系授權 |?(微信ID:xxq1426321293)

大家好,我是 JiekeXu,分開這么久很高興又和大家見面了,今天分享下如何通過 Shell 監控異常等待事件和活躍會話。本文首發于微信公眾號【JiekeXu之路】,歡迎點擊上方藍字關注我吧!

前幾天有網友在墨天輪平臺上問到“如何寫一個定時任務監控用戶會話連接數”的問題,由于當時比較忙,回答的比較簡單也比較匆忙。最近也因為公司新項目老是加班,運維保障,安裝 RAC、搭建 DG 、故障處理等等,占據了很大個人時間,休息充電的時間難免減少了很多,今日利用閑暇時間,來繼續說一說監控會話相關的這個話題。

通常我們平時都是通過運行 SQL 語句直接查詢 V$SESSION 視圖得到結果,然后直接輸出到屏幕上,具體的 SQL 如下:

--- 查看用戶會話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;---?查看活躍會話數select inst_id,status,count(*) from gv$session where?type<>?'BACKGROUND'?group?by?inst_id,status?order?by?3;

今天主要是通過 Shell 循環等手段來實現:

[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 中需要用 “\” 轉義 “$” 符號,grep -A5 EVENT 這個只是過濾掉 SQLPlus 登陸退出的提示,以便更友好的輸出結果。?每隔 5 秒運行此腳本,便可以輸出異常的等待事件到屏幕上,通過 While True 循環然后等待 5 s 繼續執行達到監控效果,如下是我的測試環境執行結果:

[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

當然如果異常等待事件較多,或者這里不止一條 SQL 語句,執行結果輸出到屏幕上不是一個很好的選擇,便可以使用上面注釋掉的一行 SQL 將結果輸入到?wait_history_$DATE.log 文件,然后查查此文件即可。

watch 命令

下面在看一下使用?watch 命令的效果,watch 是一個非常實用的命令,基本所有的 Linux 發行版都帶有這個小工具,如同名字一樣,watch 可以幫你監測一個命令的運行結果,省得你一遍遍的手動運行。其后跟?-n 或 --interval 參數, watch 缺省每 2 秒運行一下程序,可以用-n或 -interval 來指定間隔的時間。

watch -n 1 /usr/bin/sh cat_user_session.sh

由于這里是測試用例,沒有更多的連接,效果不太明顯。異常等待事件和活動會話均不明顯,下面通過一生產環境 ADG 備庫來演示一下。

監控異常等待事件案例分享

監控 ADG 備庫活動會話和異常等待事件,每隔 10?秒鐘記錄一次,將結果保存到日志文件中,并定期清理歷史日志文件。

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---- 申明環境變量后存放一些要查的 SQL,并將結果存入 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 '--數據庫異常等待事件-----------------'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 '--數據庫連接數-----------------'select inst_id,status,count(*) from gv\$session where type <> 'BACKGROUND' group by inst_id,status order by 1;exit;EOF

session_history_$DATE.log 日志每天生成一個,時間長久不利于管理,故需要清理,然后使用?cleartmplog.sh?定期清理,腳本如下:

JIEKEDB1:/app/soft$cat?cleartmplog.shfind /app/soft -name "session_history*" -mtime +7 -exec rm -rf {} \;

最后,每 10 秒運行一次,這里還有一點小技巧,crontab?里顯示的是分時日月周,并沒有秒級別的設置,這里便借助 sleep 10?來達到 10 秒運行一次的效果。

min hour day month week command分鐘?????小時??????日??????月???????周??????動作(任務命令)????0-59 0-23 1-31 1-12 0-7 命令或腳本(寫絕對路徑)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 秒則會顯示 SQL 查詢結果,但是有 SQLPlus 登入登出信息,顯示的格式不是很友好,腳本可以繼續優化。我這里是 AIX 6.1 ADG 備庫上的信息,部分 Shell 命令在操作系統上不好用,但 Linux 系統則沒有問題,希望看到的小伙伴們可以在嘗試一下。

當備庫發生性能問題時,便可以通過此日志記錄當時會話信息,異常等待事件,便可以分析性能問題,大大的提供了分析資料,節省了很多查詢時間,是值得借鑒的,故此推薦給小伙伴們使用。

最后推薦一下收藏已久的 Oracle 五大學習網站,如有需要的小伙伴們可前去圍觀:

網站一、 https://www.oracle.com/technetwork/index.html,簡稱 OTN,全世界最大的開發者社區,涵蓋很多 Oracle 的學習資源,內容是英文的;

網站二、 http://www.itpub.net/, 國內專業的 IT 技術論壇社區;

網站三、http://www.chinaunix.net , 中國最大的 Linux/Unix 技術社區網站, 此外對編程、數據庫、網絡安全等也涉獵頗多;

網站四、http://www.eygle.com,云和恩墨創始人、Oracle ACED 蓋國強老師的個人網站,提供很多優質的關于 Oracle 的文章和資料,值得收藏與學習;

網站五、http://yangtingkun.net , Oracle 的那些事兒,Oracle 百科全書楊廷琨老師個人網站, ITPUB Oracle數據庫管理版版主 ,人稱"楊長老",值得收藏與學習。

每天進步一點,一年后的進步將會很大,遠遠大于 “1”;每天退步,即使退步一點點,一年后幾乎退步為 "0"。每天加油,讓我們一起努力做更好的自己,今天就到這里了,祝小伙伴們中秋、國慶開心愉快,闔家團圓!

Oracle 12c 及以上版本補丁更新說明及下載方法(收藏版)

Oracle 11.2.0.4 RAC 最新補丁下載(11.2.0.4.200714)

11g RAC 在線存儲遷移實現 OCR 磁盤組完美替換

我的 OCM 之路|書寫無悔青春,追夢永不止步

Oracle 19c 之多租戶 PDB 連接與訪問(三)

案例:RMAN 備份控制文件報錯 ORA-00230

Oracle 12C 最新補丁下載與安裝操作指北

DBA 常用的軟件工具有哪些(分享篇)?

Oracle 相關認證證書查詢及真偽辨別

Oracle 每日一題系列合集

點亮在看,你最好看!

總結

以上是生活随笔為你收集整理的shell sqlplus执行sql文_如何通过 Shell 监控异常等待事件和活跃会话的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。