Posted on 2008-12-25 15:03
Prayer 阅读(1073)
评论(0) 编辑 收藏 引用 所属分类:
DB2
环境:
产品:DB2 UDB
平台:跨平台
版本:8
问题描述:
DB2 使用的活动日志的最大空间是由下面公式:
(logprimary + logsecond) * logfilsiz * 4096
计算出的大小来决定的(logprimary,logsecond,logfilsiz是数据库配置参数)。若该空
间已全部被分配,而应用仍试图请求更多活动日志空间时,就会发生日志满的情况,此时,
用户的更新、删除或插入操作都会使 DB2DIAG.LOG 中写入以下信息:
SQL0964C 数据库的事务日志已满。
DB2 活动日志满通常是由于存在大量未提交事务的数据,使得活动日志的空间不能及时释放
,使新的事务无法申请到可用日志空间,而最终报出 SQL0964C 的错误所致。为使应用程序
成功运行,而不是被回滚,通常会考虑根据情况选择增大以上公式中的某些数据库参数,以
增大活动日志空间来解决这一问题。
但还有另外一种原因,即在日志空间并未用尽的情况下,当某个占有最旧活动日志的应用长
时间未作提交操作,阻止了日志的 LSN 的分配,造成日志空间无法使用,同样会引发这一日
志满的报错。对于这种情况,可以提交该交易或利用 FORCE 命令来终止此应用程序,以便释
放它所占用的日志空间,使 LSN 可以继续分配,空闲的日志空间可用。这里就提供了由这一
原因导致日志满问题的解决方法。
解答:
首先检查 DB2 诊断日志文件 db2diag.log,在其中查找类似如下信息:
2003-01-16-02.53.54.935308 Instance:db2inst1 Node:016
PID:144252(db2agntp (SAMPLE) 16) Appid:*.*
data_protection sqlpgrsp Probe:50 Database:SAMPLE
Log Full -- active log held by appl. handle 787273
End this application by COMMIT, ROLLBACK or FORCE APPLICATION.
:
:
由此,可以找到最早持有日志空间的应用程序,其句柄为 787273。如果使用 DB2 的快照工
具,通过从快照的输出中查找类似以下信息:
Appl id holding the oldest transaction = 787273
同样可以找到这个应用程序的句柄。这时使用以下命令可以在无需断开数据库其它应用程序
的连接的情况下强行终止该应用程序:
db2 force application (787273)
DB20000I FORCE APPLICATION 命令成功完成。
DB21024I 该命令为异步的,可能不会立即生效。
根据提示,由于该命令是异步操作,可再次使用:
db2 list applications
验证应用是否已被真正停止,如果输出中已没有该应用,它所占有的日志空间会因应用程序
被回滚而立即释放,而 DB2 日志因此重新可用。