暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

案例一则,谁在这么频繁调用LOGMINER程序?

原创 szrsu 2024-09-03
536

案例背景

客户的一套oracle 11.2.0.4的数据库,根据他们的描述,说是自安装以来,alert一直有报错,但不影响使用,让帮忙分析一下什么原因。

分析问题

远程上去看了一下相关数据库的alert,其实也不算是什么报错,是LOGMINER的相关记录信息,记录的信息如下:

LOGMINER: summary for session# = 2147483905
LOGMINER: StartScn: 3936937 (0x0000.003c12a9)
LOGMINER: EndScn: 0 (0x0000.00000000)
LOGMINER: HighConsumedScn: 0
LOGMINER: session_flag: 0x0
LOGMINER: Read buffers: 8
LOGMINER: Memory LWM: limit 10M, LWM 8M, 80%
LOGMINER: Memory Release Limit: 0M
....................................
LOGMINER: summary for session# = 2147484417
LOGMINER: StartScn: 3936937 (0x0000.003c12a9)
LOGMINER: EndScn: 0 (0x0000.00000000)
LOGMINER: HighConsumedScn: 0
LOGMINER: session_flag: 0x0
LOGMINER: Read buffers: 8
LOGMINER: Memory LWM: limit 10M, LWM 8M, 80%
LOGMINER: Memory Release Limit: 0M

只不过是这些信息记录比较频繁,大约是30s就会记录一次。

为什么会产生这些?说明有程序调用了LOGMINER程序,只要调用了该LOGMINER程序,就会写入信息到alert日志。而且根据官方说明,这些信息无法屏蔽,具体可以查看文档说明,相关文档参考如下:

Alert.log Messages ‘LOGMINER: krvxpsr summary’ (Doc ID 1485217.1)

LOGMINER: Summary For Session# = nnn in 11g (Doc ID 1632209.1)

谁在使用?

既然无法屏蔽这些信息,那么怎么知道谁在使用它呢?(无法解决问题,那就解决提出问题的人,你说是不是呢,哈哈哈!!!)

从alert日志写得那么频繁看,手工去调用LOGMINER程序是不太可能了,排除掉这个原因,那就是第三方程序在调用了(如类似OGG、cdc软件了)。排查一下,并没有发现使用OGG,那就其他的CDC软件了。

那要怎么找到这个相关的LOGMINER会话,alert日志里面有用的信息不多, "LOGMINER: summary for session# = 2147484417"这里面的session# 并不是vsession里面的sid,你要通过它是无法找到相关的会话,这个session#指的是vlogmnr_session里面的SESSION_ID,如下所示:

col db_name for a20;
set linesize 400;
select SESSION_ID,SESSION_NAME,SESSION_STATE,DB_NAME,db_id,start_Scn, end_scn, processed_scn from v$logmnr_session;

SESSION_ID SESSION_NAME 		    SESSION_S DB_NAME			DB_ID  START_SCN    END_SCN PROCESSED_SCN
---------- -------------------------------- --------- -------------------- ---------- ---------- ---------- -------------
2147484417				    UNKNOWN				    0	       0	  0		0

但v$logmnr_session并没有记录相关的客户端信息,无法找到谁在调用它。
后面思考了一下,既然你用LOGMINER来挖掘日志,你挖掘完,是不是要查看挖掘后的数据,我们知道那个数据是保留在v$logmnr_contents,那是不是是需要去查询v$logmnr_contents这个视图?
要查看这个v$logmnr_contents数据,必须是前面已经执行了dbms_logmnr.start_logmnr(),否则是会报错的(要在同一个会话里面)。

所以我们只要找到哪些会话在调用v$logmnr_contents相关的sql,就能确定是哪个会话在执行,是不是就抓出那个捣蛋鬼了,于是有了下面的语句:

set linesize 400
col sql_text for a200
col machine for a25
col program for a25
col sample_time for a25
select b.sample_time, b.SESSION_ID, b.SESSION_SERIAL#, b.PROGRAM,b.MACHINE,substr(a.SQL_TEXT,1,150) sql_text
  from v$sql a, v$active_session_history b
 where b.SQL_ID = a.sql_id
   and a.sql_text like '%logmnr%'
   and b.SAMPLE_TIME>sysdate-3/1440;

image.png

上面信息显示一清二楚,把它发给客户,让他们去确认,看看WIN-V66D44CMLMG这台机器是哪个程序在搞鬼。
好了,案例分享到这了。该案例相对简单,只是为了表达一个观点,有时候无法直观获取你所要的信息,不妨换一个思路,也许“柳暗花明又一村”。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论