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 监控异常等待事件和活跃会话相关推荐
- 如何通过 Shell 监控异常等待事件和活跃会话
前几天有网友在墨天轮平台上问到"如何写一个定时任务监控用户会话连接数"的问题,由于当时比较忙,回答的比较简单也比较匆忙.最近也因为公司新项目老是加班,运维保障,安装 RAC.搭建 ...
- shell sqlplus执行sql文_各主流数据库非交互执行
声明: 文章初衷仅为攻防研究学习交流之用,严禁利用相关技术去从事一切未经合法授权的入侵攻击破坏活动,因此所产生的一切不良后果与本文作者及该公众号无任何关联 另外,这只是一个个人性质的公众号 ...
- sqlplus 执行sql文件_详解sqlplus设定行大小、页大小、字符列格式、数字列格式、清屏...
概述 sqlplus虽然是DBA们最为经常使用的Oracle客户端工具,但是它在输出结果格式化上不是很好,如折行.分页不好等,所以一般启动sqlplus后多少都要做些设置,如linesize.page ...
- java逐行读取文件内容执行sql语句_[11/100] 文件和异常
最近学习效率很低,居然还开始熬夜玩耍了.好好干啊,技术差就要多付出啊. 操作模式 选择操作模式 读写文本文件 1.读取 import timedef main():f = Nonetry:# 一次性读 ...
- linux shell脚本执行sql语句建表建库
linux shell脚本执行sql语句建表建库 1. 创建sql脚本 2. 创建shll脚本 1. 创建sql脚本 创建contract_ddl.sql -- 创建数据库contract_user ...
- Linux shell脚本执行SQL
Linux shell脚本执行SQL 1. 创建.sh文件:[root@user]# mkdir /shell.sh (创建到当前所在目录pwd查看目录) 2. 编辑shell.sh文件:[root@ ...
- 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 ...
- java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他
初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...
- Oracle 在Sqlplus 执行sql脚本文件。
首先在随便1个地方建立1个sql语句的文件. 例如: 执行命令为: sqlplus loginID/passwd@serverIP/servcie_name @path/file.name 例如: 见 ...
最新文章
- 古巴雪茄高希霸世纪1.2.3.4.5.6.半世纪7款雪茄的区别?
- parquet文件格式——本质上是将多个rows作为一个chunk,同一个chunk里每一个单独的column使用列存储格式,这样获取某一row数据时候不需要跨机器获取...
- 在DataFrame中新建列赋值后全部为NaN(转)
- 小孔子文章管理系统V2.0发布测试
- php做游戏登录服务器,游戏登陆服务器php简单实现
- Windows Server 2016补丁更新机制
- java swagger ui 教程_java集成Swagger的步骤详解
- Linux下的特殊权限SetUID
- adb shell 命令详解
- 解决Linux下使用QQ的问题
- HTML5调整图像垂直边距,77.通过vspace和hspace属性可以分别调整图像的垂直边距和水平边距。()()...
- was cached in the local repository, resolution will not be reattempted until the update interval of
- Windows又又又更新?Win 12开发将于下个月开始
- 微生物群落的circos图怎么画_微生物群落分析
- 身份证复印件一定要加签注 否则可能吃大亏!
- 免费全平台直播推流软件OBS Studio应用
- js 万年历农历转阳历 方法_JavaScript实现公历转农历功能示例
- 2018世界人工智能蓝皮书:看中国到底有多强!
- Java --- 线程同步和异步的区别
- 浙大pat 1017
热门文章
- Python入门知识点总结
- Open SAP 上 SAP Fiori Elements 公开课第一单元学习笔记
- Cannot find package module @sap/cds/common
- 如何成批导入数据到 kitten编程猫 类型为列表的变量中
- SAP UI5里input field live search的实现例子
- SAP Spartacus split view里每个元素宽度的计算方式
- Angular 指令ngTemplateOutlet的运行原理单步调试
- SAP Fiori应用里出现http request错误的原因分析
- SAP Cloud for Customer Sales Lead明细页面视图的UI模型
- 使用OData服务创建SAP C4C的Lead数据,必须指定Account字段