DB2 事务日志满 解决办法 增大日志空间&不写日志

https://blog.csdn.net/ft4272161/article/details/79242156

 

首先 transaction log size 的大小 什么才是最合理的?

针对所在数据库,现在或将来 做一个正常的dml 事物 此时没有其他事物影响 ,如果log full 就证明 size 太小,需要增大.

如果 一个大事物持久占据大部分的log 空间 ,导致一个 平常正常的小事物 都会包log full 这时 需要分析 大事物是否合理,否则干掉得了!

 

在删除一个表里8万多条数据的时候报了如下错误:

SQL0964C The transaction log for the database is full,用db2 ? sql0964c查帮助,确定是事务日志满。

解决方法

增大每个事务日志文件大小,增加主日志文件数量和第二事务日志数量

db2 update db cfg for <dbname> using LOGPRIMARY 50

db2 update db cfg for <dbname> using LOGSECOND 20

db2 update db cfg for <dbname> using LOGFILSIZ 10240

重启数据库,再删除。成功。

 

IBM的解答

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 delete 大表不写日志操作

1.update command options using c off  -- //关闭自动提交 

2.alter table MARPT.RPT_DIM_U_ORG_INX_M_CURR_CUS_PRO_TBK  activate not logged initially //设置不记日志 

3.delete from MARPT.RPT_DIM_U_ORG_INX_M_CURR_CUS_PRO_TBK -- 删除数据

4.commit//手动提交 

5.update command options using c on//打开自动提交

相关操作说明;

1.alter table testdeletetab ACTIVATE  NOT  LOGGED  INITIALLY,设置表操作不记日志,这条命令只在一个事务里有效,遇到commit之后就失效了,这个很需要关注,因为有的时候我们的连接都是设置的自动提交,所以虽然设置了不记日志,但是并没有起到作用。

2.可以通过相关的命令查看当前命令参数

db2 list command options

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值