有网友问我为什么他们的库每一分种就生成了1G的日志, 这种问题需要查SQL语句, 但如何找出那个SQL语句生成了过量的日志呢? OTop可以轻松地用"-o"选项来显示最近系统中生成日志最多的SQL语句(使用"-o REDO"选项), 命令如下:

otop -u system/manager@prod -o redo -q

    运行一分钟后按Control+C退出程序运行, 在运行otop的目录中生成一个文件, 检查文件内容, 发现以下信息(以下信息只显示Top Session中的一部份信息):

--VAL/S----PCT----OldPrev-----OldCur----NewPrev-----NewCur
  2225K  83.20 1425443843 1425443843 1425443843 1425443843
  449K  16.80  981151561  981151561 1425443843 2738583441

--VAL/S----PCT----OldPrev-----OldCur----NewPrev-----NewCur
  2248K  97.08 1425443843 1425443843 1425443843 1425443843
    67K  2.92 1425443843 2738583441 1321102934 1321102934
......

    根据OldPrev/OldCur/NewPrev/NewCur四个列的中的SQL_HASH_VALUE, 找出其相应的SQL语句, 其中一条是"UPDATE SEQ$ ...", 另一条是"SELECT ...NEXTVAL FROM DUAL", 这说明有一个会话在过度地使用序列来生成数值, 于是我建议管理员取两个时间点的USER_SEQUENCE中的记录, 看一下那一个序列的取值最多, 将那个序列的Cache属性设为100, 到这样我就下班了.

    后来再问了一下那一个网友, 原来是有一个后台job程序的问题, 进入死循环不停地取序列的下一个值, 改了后就好了, 那位网友也学会了使用otop, 看来他以后可以用otop查找更多的问题了.