Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

解决DB2日志满问题的一种方法

Posted on 2008-12-25 15:03 Prayer 阅读(1072) 评论(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   日志因此重新可用。   
    
 

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理