[故障&答疑] 数据库日志空间满-- SQL0964C错误

本文介绍了DB2数据库中出现SQL0964C错误的原因及解决办法,包括如何通过调整业务逻辑减少错误发生的概率,以及在日志空间未完全用尽的情况下如何强制释放日志空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

数据库运行时如果报SQL0964C的错误,那么一般和数据日志有关,先看图15-3所示的案例。

(点击查看大图)图15-3  数据库日志已满

DB2使用的活动日志的最大空间是由公式
  • (logprimary + logsecond) * logfilsiz * 4096
计算出的大小来决定的(logprimary、logsecond、logfilsiz是数据库配置参数)。在DB2中,一个长事务最多可以使用不超过256GB日志(DB2 V5是2GB,DB2 V7是32GB,DB2 V8是256GB)

若该空间已全部被分配,而应用仍试图请求更多活动日志空间时,就会发生日志满的情况。此时,用户的更新、删除或插入操作都会使DB2DIAG.LOG中写入以下信息:
SQL0964C数据库的事务日志已满。

SQL0964C错误明数据库日志已满,DB2活动日志满通常是由于存在大量未提交事务的数据,使得活动日志的空间不能及时释放,使新的事务无法申请到可用日志空间,而最终报出SQL0964C的错误所致。要解决这些问题,您可以增加日志文件或日志个数。这种错误一般是批量插入、删除或更新时报的错误。所以最好是能够调整业务逻辑,分批次删除、更新或插入。这样做会降低日志报错的概率。

但还有另外一种原因,即在日志空间并未用尽的情况下,当某个占有最旧活动日志的应用长时间未作提交操作,阻止了日志的LSN的分配,造成日志空间无法使用,同样会引发这一日志满的报错。对于这种情况,可以提交该交易或利用FORCE命令来终止此应用程序,以便释放它所占用的日志空间,使LSN可以继续分配,空闲的日志空间可用。这里就提供了由这一原因导致日志满问题的解决方法。

首先检查DB2诊断日志文件db2diag.log,在其中查找如下类似信息:
  • 2008-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日志因此重新可用。

 

转载于:https://www.cnblogs.com/jskingli/archive/2012/01/31/2332703.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值