作者 | 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 监控异常等待事件和活跃会话相关推荐

  1. 如何通过 Shell 监控异常等待事件和活跃会话

    前几天有网友在墨天轮平台上问到"如何写一个定时任务监控用户会话连接数"的问题,由于当时比较忙,回答的比较简单也比较匆忙.最近也因为公司新项目老是加班,运维保障,安装 RAC.搭建 ...

  2. shell sqlplus执行sql文_各主流数据库非交互执行

    声明:    文章初衷仅为攻防研究学习交流之用,严禁利用相关技术去从事一切未经合法授权的入侵攻击破坏活动,因此所产生的一切不良后果与本文作者及该公众号无任何关联    另外,这只是一个个人性质的公众号 ...

  3. sqlplus 执行sql文件_详解sqlplus设定行大小、页大小、字符列格式、数字列格式、清屏...

    概述 sqlplus虽然是DBA们最为经常使用的Oracle客户端工具,但是它在输出结果格式化上不是很好,如折行.分页不好等,所以一般启动sqlplus后多少都要做些设置,如linesize.page ...

  4. java逐行读取文件内容执行sql语句_[11/100] 文件和异常

    最近学习效率很低,居然还开始熬夜玩耍了.好好干啊,技术差就要多付出啊. 操作模式 选择操作模式 读写文本文件 1.读取 import timedef main():f = Nonetry:# 一次性读 ...

  5. linux shell脚本执行sql语句建表建库

    linux shell脚本执行sql语句建表建库 1. 创建sql脚本 2. 创建shll脚本 1. 创建sql脚本 创建contract_ddl.sql -- 创建数据库contract_user ...

  6. Linux shell脚本执行SQL

    Linux shell脚本执行SQL 1. 创建.sh文件:[root@user]# mkdir /shell.sh (创建到当前所在目录pwd查看目录) 2. 编辑shell.sh文件:[root@ ...

  7. beeline执行sql文件_【SparkSQL】介绍、与Hive整合、Spark的th/beeline/jdbc/thriftserve2、shell方式使用SQL...

    目录 一.Spark SQL介绍 SQL on Hadoop框架: 1)Spark SQL 2)Hive 3)Impala 4)Phoenix Spark SQL是用来处理离线数据的,他的编程模型是D ...

  8. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  9. Oracle 在Sqlplus 执行sql脚本文件。

    首先在随便1个地方建立1个sql语句的文件. 例如: 执行命令为: sqlplus loginID/passwd@serverIP/servcie_name @path/file.name 例如: 见 ...

最新文章

  1. 古巴雪茄高希霸世纪1.2.3.4.5.6.半世纪7款雪茄的区别?
  2. parquet文件格式——本质上是将多个rows作为一个chunk,同一个chunk里每一个单独的column使用列存储格式,这样获取某一row数据时候不需要跨机器获取...
  3. 在DataFrame中新建列赋值后全部为NaN(转)
  4. 小孔子文章管理系统V2.0发布测试
  5. php做游戏登录服务器,游戏登陆服务器php简单实现
  6. Windows Server 2016补丁更新机制
  7. java swagger ui 教程_java集成Swagger的步骤详解
  8. Linux下的特殊权限SetUID
  9. adb shell 命令详解
  10. 解决Linux下使用QQ的问题
  11. HTML5调整图像垂直边距,77.通过vspace和hspace属性可以分别调整图像的垂直边距和水平边距。()()...
  12. was cached in the local repository, resolution will not be reattempted until the update interval of
  13. Windows又又又更新?Win 12开发将于下个月开始
  14. 微生物群落的circos图怎么画_微生物群落分析
  15. 身份证复印件一定要加签注 否则可能吃大亏!
  16. 免费全平台直播推流软件OBS Studio应用
  17. js 万年历农历转阳历 方法_JavaScript实现公历转农历功能示例
  18. 2018世界人工智能蓝皮书:看中国到底有多强!
  19. Java --- 线程同步和异步的区别
  20. 浙大pat 1017

热门文章

  1. Python入门知识点总结
  2. Open SAP 上 SAP Fiori Elements 公开课第一单元学习笔记
  3. Cannot find package module @sap/cds/common
  4. 如何成批导入数据到 kitten编程猫 类型为列表的变量中
  5. SAP UI5里input field live search的实现例子
  6. SAP Spartacus split view里每个元素宽度的计算方式
  7. Angular 指令ngTemplateOutlet的运行原理单步调试
  8. SAP Fiori应用里出现http request错误的原因分析
  9. SAP Cloud for Customer Sales Lead明细页面视图的UI模型
  10. 使用OData服务创建SAP C4C的Lead数据,必须指定Account字段