案例背景
客户的一套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;

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




