有些时候,Oracle 数据库产生了大量的归档日志(archive log),用户、DBA 可能都会很困惑,哪些表被写入了?如果没有什么有力的数据来辅助说明,怎么知道是 数据库自身的问题,还是用户的问题?
比较重量级的方法是,使用 logminer,来对 这个时间段产生的 archive log 进行解析。看看到底发生了什么。
其实还有一种比较轻量级的方法。我们可以对这个时间段产生的 archive log 进行dump, 然后借助 awk ,来进行排序,看看哪些 object,被频繁地记录到 archive log 中。
比如,我用这个命令,来对 arch1_77.dbf 进行 dump。
ALTER SYSTEM DUMP LOGFILE 'u01/oracle/myhome/dbs/arch1_77.dbf';
dump 所得到的内容,记录到了这个 session 的 trace 文件了。
如果想要确认 trace 文件的名字,我们可以用如下的方法。
SQL>oradebug setmypid SQL>oradebug tracefile_name
这样就会显示 trace file 名字。然后我们执行类似如下的名字( 假定得到的 trace 文件名字是 orcl12201_ora_3454.trc):
$ grep OBJ: orcl12201_ora_3454.trc |awk -F"OBJ:" '{print $2}'|awk '{print $1}' | sort |uniq -c |sort -n -r
我执行的结果如下:
-bash-4.1$ grep OBJ: orcl12201_ora_3454.trc |awk -F"OBJ:" '{print $2}'|awk '{print $1}' | sort |uniq -c |sort -n -r 329829 73875 319042 4294967295 46 73854 1 73858 1 73857 1 73856 1 73853 1 73852 1 73850 1 100 -bash-4.1$
要注意的是,这里列出来的 值,不一定有对应的 object,这一部分(比如下面的 329829 和 319042),可以忽略。就算一个数据库根本不忙,作出 dump ,也会产生同样的 这一两行。
通过上面的命令,可以发现,被记录最多的是 WRP$_REPORTS_TIME_BANDS , 接下来就要分析,为何有大量的对 WRP$_REPORTS_TIME_BANDS的写入动作(我这个只是给例子,其实还称不上大量写入),遇到具体问题时,请具体分析。
$ sqlplus / as sysdba SQL> select object_name from dba_objects where object_id in (329829,319042); no rows selected SQL> select object_name from dba_objects where object_id = 73854; OBJECT_NAME -------------------------------------------------------------------------------- SYS_LOB0000007379C00009$$ SQL> select object_name from dba_objects where object_id = 73585; OBJECT_NAME -------------------------------------------------------------------------------- WRP$_REPORTS_TIME_BANDS SQL> select object_name from dba_objects where object_id = 4294967295; no rows selected SQL> select object_name from dba_objects where object_id = 73875; OBJECT_NAME -------------------------------------------------------------------------------- TAB001 SQL>