分析DB2活动日志满的原因及解决DB2日志满方法与避免方案

日志使用

下图显示了并发事务条件下,日志使用的示意

有3个并发的程序Process 1、Process 2、Process 3。每一个程序都有两个事务。蓝块代表SQL语句,红块代表commit操作,绿块代表rollback操作。每一个向下的箭头都代表日志缓冲区的数据被刷新到日志磁盘上(默认是每一次提交操作都会导致日志缓冲被刷新到磁盘上)。

在T1时刻,事务A commit,日志缓冲区被刷新到磁盘上。
在T2时刻,事务B commit,日志缓冲区被刷新到磁盘上,此时日志X使用完,但由于X中的事务C还没有提交,所以X此时还是活动日志。

在上图中,如果事务C一直没有提交操作,那么日志X将永远是首个活动日志(oldest transaction log),后续的日志也是活动日志,其他应用最终会导致日志满。

活动日志

如果一个日志中包含有未提交的事务,那么这个日志就是活动日志(也有其他情况,比如虽然所有事务已经提交,但对应的更改还没有持久化到磁盘上)。

首个活动日志(First Active Log)

第一个活动日志,首个活动日志之后的日志(也就是编号比首个活动日志大的日志)都是活动日志,可以通过数据库的snapshot查看first active log, current active log, 以及 last active log.

$ db2 get snapshot for db on sample | grep -i "File number"
File number of first active log      = 0
File number of last active log       = 2
File number of current active log     = 0
File number of log being archived     = Not applicable

日志满原因

DB2总的可用活动日志的最大空间是有限制的,当达到限制之后,就会发生日志满的问题,限制为(LOGPRIMARY + LOGSECOND) * LOGFILSIZ * 4KB

日志满的原因无非两种:

1.) 一个小事务hold住了首个活动日志,一直没有提交,导致首个活动日志一直是活动状态,不被释放。这个跟堵车类似,一辆车因发动机故障(事务没有提交)堵住路口(占用首个活动日志),即使后面的车都没有问题(后续事务正常提交),也无法通过路口,且会越积越多,最终导致整个路都堵满车(日志满)。

2.) 有个事务非常大,迅速用尽了所有的日志。

日志满的表现:

首先应用会报出SQL0964C错误:

$ db2 "insert into test select * from test"
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0964C The transaction log for the database is full. SQLSTATE=57011

其次,db2diag.log中会有以下报错

2017-03-09-17.24.50.315000+480 E3234873F644     LEVEL: Error
PID   : 8532         TID : 13028     PROC : db2syscs.exe
INSTANCE: DB2INST1       NODE : 000      DB  : SAMPLE
APPHDL : 0-453        APPID: *LOCAL.DB2INST1.170309092321
AUTHID : MIAOQINGSONG     HOSTNAME: ADMINIB-PR7US3I
EDUID  : 13028        EDUNAME: db2agent (SAMPLE)
FUNCTION: DB2 UDB, data protection services, sqlpgResSpace, probe:2860
MESSAGE : ADM1823E The active log is full and is held by application handle
     "0-441". Terminate this application by COMMIT, ROLLBACK or FORCE
     APPLICATION.

日志满的临时处理:

1. 可以通过增加LOGSECOND来临时增加可用的日志大小(修改时需要加上immediate选项使之立即生效);增加LOGPRIMARY并没有用,因为需要重启数据库才能生效。

2. force掉hold住首个活动日志的的应用,在force之前,可以抓取snapshot,看一下这个应用的状态:

$ db2 get snapshot for database on sample | grep -i oldest
Appl id holding the oldest transaction   = 441

$ db2 get snapshot for application agentid 441

      Application Snapshot

Application handle             = 441
Application status             = UOW Waiting         <<--应用状态为UOW Waiting
Status change time             = 2017-03-09 17:23:15.068895
Application code page           = 1386
Application country/region code      = 86
DUOW correlation token           = *LOCAL.DB2INST1.170309092244
Application name              = db2bp.exe
Application ID               = *LOCAL.DB2INST1.170309092244

..

Connection request start timestamp     = 2017-03-09 17:22:44.963163 <<--应用连库时间
Connect request completion timestamp    = 2017-03-09 17:22:45.961157
Application idle time           = 4 minutes 7 seconds

..

UOW log space used (Bytes)         = 664
Previous UOW completion timestamp     = 2017-03-09 17:22:45.961157
Elapsed time of last completed uow (sec.ms)= 0.000000
UOW start timestamp            = 2017-03-09 17:23:02.770477 <<--当前事务开始时间
UOW stop timestamp             =              <<--当前事务结束时间为空,说明还没有commit
UOW completion status           =

..

Statement type               = Dynamic SQL Statement
Statement                 = Close
Section number               = 201
Application creator            = NULLID
Package name                = SQLC2K26
Consistency Token             =
Package Version ID             =
Cursor name                = SQLCUR201
Statement member number          = 0
Statement start timestamp         = 2017-03-09 17:23:15.067789
Statement stop timestamp          = 2017-03-09 17:23:15.068893
Elapsed time of last completed stmt(sec.ms)= 0.000024
Total Statement user CPU time       = 0.000000
Total Statement system CPU time      = 0.000000
..
Dynamic SQL statement text:
select * from t1

<<--一个事务中可能有多条SQL,这个只表示当前正在执行或者最后执行过的SQL,并不能表示就是这条SQL导致了日志满,这里抓取到的是一条SELECT语句,SELECT语句不占用日志。

$ db2 "force application (441)"
DB20000I The FORCE APPLICATION command completed successfully.
DB21024I This command is asynchronous and may not be effective immediately.

日志满的避免:

1.)根据抓取到的应用的snapshot,找应用开发人员查看为何不肯提交,这才是避免问题再次出现的根本办法。
2.)从DB2管理层面,可以设置数据库配置参数max_log和num_log_span
3.)可以写脚本,以固定的间隔抓取database snapshot中的Appl id holding the oldest transaction, 如果长时间不发生变化(比如2天),就Force掉。

补充说明:

查看每个应用使用的日志大小:

$ db2 "select application_handle,UOW_LOG_SPACE_USED,UOW_START_TIME FROM TABLE(MON_GET_UNIT_OF_WORK(NULL,-1)) order by UOW_LOG_SPACE_USED" 

也可以通过db2pd -db <dbname> -transactions 查看每个正在使用的日志的情况

重点关注的参数有:

ApplHandl
The application handle of the transaction.
SpaceReserved
The amount of log space that is reserved for the transaction.
LogSpace
The total log space that is required for the transaction, including the used space and the reserved space for compensation log records.

通过对DB2活动日志满原因的分析我们就可以找到解决此问题的方法同时避免此问题的再次出现

您可能感兴趣的文章:

  • 解决db2事务日志已满及日志磁盘空间已满问题办法详解
  • DB2 常用命令小结
  • 比较SQL Server与Oracle、DB2
  • DB2数据库的备份和恢复
  • DB2优化(简易版)
  • IBM DB2 日常维护汇总(一)
  • DB2数据库的安装
  • DB2常用傻瓜问题1000问(一)
  • DB2数据同步方面的经验
  • DB2常用傻瓜问题1000问(四)
  • DB2个人版(Linux)安装
  • DB2编程序技巧 (十)
  • IBM DB2 日常维护汇总(二)
  • DB2常用傻瓜问题1000问(二)
  • DB2常用傻瓜问题1000问(五)
  • IBM DB2 日常维护汇总(六)
  • DB2 UDB V8.1管理学习笔记(二)
  • IBM DB2 日常维护汇总(三)
  • DB2编程序技巧 (八)
(0)

相关推荐

  • DB2数据库的安装

    正在看的db2教程是:DB2数据库的安装.这是在IBM RS6000 操作系统为AIX安装的,HP9000上雷同 1. 注册为具有超级用户权限的用户(root)  2. 将 标有"DB2通用数据库企业版"的软件光盘插入驱动器  3. 输入如下命令,以创建一个目录来安装该 CD-ROM:   # mkdir -p /cdrom 其中 cdrom 表示 CD-ROM 安装目录.  输入如下命令,来分配 CD-ROM 文件系统:  # smitty storage  4. 选择文件系统  5

  • DB2常用傻瓜问题1000问(五)

    正在看的db2教程是:DB2常用傻瓜问题1000问(五).大家在应用DB2的时候可能会遇到一些看似简单的问题,特别对新手来说,我在此简单的总结一下,发布给大家,希望对大家能有所帮助,同时也欢迎大家一起探讨,共同发展,共同进步!以下主要以DB27.X为基础的.以下的字符为小写. 本文对DB2高手来说是不用看的. DB2函数 135.AVG() 返回一组数值的平均值. SELECTAVG(SALARY)FROMBSEMPMS; 136.CORR(),CORRELATION() 返回一对数值的关系系数

  • IBM DB2 日常维护汇总(三)

    正在看的db2教程是:IBM DB2 日常维护汇总(三). 26.DB2实例的服务器的默认端口是? 50000 服务器名称为DB2CDB2 27.DB2UDB服务器端的认证类型有? SERVER SERVER_ENCRYPT CLIENT DCE DCE_SERVER_ENCRYPT KERBEROS KRB_SERVER_ENCRYPT 28.DB2客户端的认证类型有? SERVER SERVER_ENCRYPT DCS DCS_ENCRYPT CLIENT DCE 29.DB2中有哪几种类型

  • IBM DB2 日常维护汇总(一)

    正在看的db2教程是:IBM DB2 日常维护汇总(一).: 1.DB2产品的级别有那些? 企业版的NTERPRISEEDITION 工作组版WORKGROUPEDITION 企业扩展版ENTERPRISEEXTENDEDEDITION 个人版的PERSONALEDITION 卫星版的SATELLITEEDITION 微型版的EVERYPLACE 2.可以连接到DB2数据库的产品有哪些? DB2客户端 DB2CONNECT DB2DATAPROPAGATOR DB2NET.DATA DB2DAT

  • IBM DB2 日常维护汇总(六)

    正在看的db2教程是:IBM DB2 日常维护汇总(六). 91.如何创建DB2的概要表? DB2的概要表功能类似于ORACLE的实体化视图! 语法为: CREATESUMMARYTABLETABLE_NAMEAS(FULLSELECT)... 例如: 定义一个可以刷新的概要表: CREATESUMMARYTABLETABLE_NAMEAS(SELECT*FROMTABLE_NAME1WHERECOL1='AAA') DATAINITIALLYDEFERREDREFRESHDEFERRED 其中

  • DB2数据库的备份和恢复

    正在看的db2教程是:DB2数据库的备份和恢复.最近,我恢复了一个数据库.其中的辛苦不予言表,我想写出自己用到的一些语句,和遇到相同问题的xdjm共勉. 首先谈db2数据库的备份,我用的是backup命令. db2 backup database 数据库名(我的库是jsdb) 忘了说了,在backup之前需要停止你要备份的数据库,我用了db2stop force(之所以用force参数是因为这样好停懒省事:)和db2start.这样就保证可以成功backup了. 备份完成后db2会告诉你一个时间

  • IBM DB2 日常维护汇总(二)

    正在看的db2教程是:IBM DB2 日常维护汇总(二).    10.AIX下用哪个命令来安装DB2? INSTALLP命令 11.同一操作系统下可以安装多个DB2数据库? 可以的 12.如何停止实例? DB2STOP 13.如何启动实例? DB2START 14.如何修改注册项的值? DB2SET可以修改 如: 设定当前实例的一个参数 DB2SETPARAMETER=VALUE 设定一个全局级的参数 DB2SETPARAMETER=VALUE-G(小写) 查看能在配置文件注册表中设置的所有变

  • DB2常用傻瓜问题1000问(一)第1/2页

    正在看的db2教程是:DB2常用傻瓜问题1000问(一).大家在应用DB2的时候可能会遇到一些看似简单的问题,特别对新手来说,我在此简单的总结一下,发布给大家,希望对大家能有所帮助,同时也欢迎大家一起探讨,共同发展,共同进步! 以下主要以DB27.X为基础的.以下的字符为小写. 本文对DB2高手来说是不用看的. 1.DB2产品的级别有那些? 企业版的NTERPRISEEDITION 工作组版WORKGROUPEDITION 企业扩展版ENTERPRISEEXTENDEDEDITION 个人版的P

  • DB2个人版(Linux)安装

    正在看的db2教程是:DB2个人版(Linux)安装.DB2个人版(Linux)安装 cowboy(zizhao_chen@yahoo.com)  the fe of swust  2003-10-23 关键字:  db2 linux 安装 摘要:  本文简略的介绍了db2 pe在linux系统上的安装过程. 目录:  DB2 PE简介  或者安装文件  准备安装环境  完成安装  测试  结论  资源 DB2 PE简介 DB2 Personal Edition(DB2 PE)是在低价位的商用硬

  • DB2常用傻瓜问题1000问(四)第1/2页

    正在看的db2教程是:DB2常用傻瓜问题1000问(四). 100.如何删除序列? DROPSEQUENCESEQUENCE_NAME 101.DB2支持导入(IMPORT)的文件格式有? 有:DEL,ASC,IXF,WSF等 102.DB2支持导出(EXPORT)的文件格式有? 有:DEL,IXF,WSF等. 不支持ASC格式. 103.DB2支持载入(LOAD)的文件格式有? 有:DEL,ASC,IXF等. 不支持WSF格式. 104.DB2支持DB2MOVE的文件格式有? 有:IXF等.

  • DB2编程序技巧 (八)

    正在看的db2教程是:DB2编程序技巧 (八).4.2 创建Database create database head using codeset IBM-eucCN territory CN; 这样可以支持中文. 4.3 手工做数据库远程(别名)配置 db2  catalog tcpip  node   node1  remote   172.28.200.200 server  50000 db2  catalog db    head   as     test1 at  node   n

  • DB2数据同步方面的经验

    正在看的db2教程是:DB2数据同步方面的经验.规划方案:  假定您将使用一个生成报告的应用程序.此应用程序需要存在于 SAMPLE 数据库的 DEPARTMENT 表中的数据.您不想使用直接来自源表的数据,而想将更改复制到只能由生成报告的应用程序读取的目标表中.为了便于管理,您要将目标表与源表保存在同一机器上.也可以是已编目导本地机器的网络上的其它数据库. 数据复制方案实施步骤:  开始之前 1. 首先确定在将要实施复制计划的机器上已经安装db2,已经建立实例. 2. 确定您将要用户复制的源

  • 比较SQL Server与Oracle、DB2

    开发数据库应用,选择一个好的数据库是非常重要的.本文从一些方面比较了SQL Server与Oracle.DB2三种数据库,为你选择数据库提供一些参考. 开放性 SQL Server 只能在Windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的.Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业.而且Windows平台的可靠性,安全性和伸缩性是非常有限的.它不象Unix那样久经考验,尤其是在处理大数据量的关键业务时. Oracle 能在所有主

  • DB2常用傻瓜问题1000问(二)第1/2页

    正在看的db2教程是:DB2常用傻瓜问题1000问(二).大家在应用DB2的时候可能会遇到一些看似简单的问题,特别对新手来说,我在此简单的总结一下,发布给大家,希望对大家能有所帮助,同时也欢迎大家一起探讨,共同发展,共同进步! 以下主要以DB27.X为基础的.以下的字符为小写. 本文对DB2高手来说是不用看的. 所有字符为小写. 51.安装DB2默认的事例名称是? 在WINDOWS或OS/2中默认的是DB2 在LINUX或UNIX环境下默认的是DB2INST1 52.安装后的默认帐户是? 在WI

  • DB2 常用命令小结

    1. 打开命令行窗口 #db2cmd 2. 打开控制中心 # db2cmd db2cc 3. 打开命令编辑器 db2cmd db2ce =====操作数据库命令===== 4. 启动数据库实例 #db2start 5. 停止数据库实例 #db2stop 如果你不能停止数据库由于激活的连接,在运行db2stop前执行db2 force application all就可以了 /db2stop force 6. 创建数据库 #db2 create db [dbname] 7. 连接到数据库 #db2

  • DB2 UDB V8.1管理学习笔记(二)

    正在看的db2教程是:DB2 UDB V8.1管理学习笔记(二).表空间类型分为SMS和DMS,分别是system management space, database management space. SMS使用方便,简单,无需手工创建和维护数据存储文件.DMS需要手动指定container和存储数据的文件名,并保证有足够磁盘空间可用.  对于一个数据库,至少存在一个page size为4K的系统临时表空间,可以额外建立具有更大page size的用户临时表空间,系统会自动进行使用. 无法用

  • DB2编程序技巧 (十)

    正在看的db2教程是:DB2编程序技巧 (十).4.11 db2环境变量 db2 重装后用如下方式设置db2的环境变量,以保证sp可编译 将set_cpl 放到AIX上, chmod +x set_cpl, 再运行之 set_cpl的内容 db2set DB2_SQLROUTINE_COMPILE_COMMAND="xlc_r  -g \ -I$HOME/sqllib/include SQLROUTINE_FILENAME.c \ -bE:SQLROUTINE_FILENAME.exp -e S

  • DB2优化(简易版)

    正在看的db2教程是:DB2优化(简易版).预备-monitors ON db2 "update monitor switches using  lock ON sort ON bufferpool ON uow ON  table ON statement ON" 打开监视开关,获取需要的性能信息 最简单而最见成效的-Bufferpool 缓冲池是内存中的一块存储区域,用于临时读入和更改数据库页(包含表行或索引项).缓冲池的用途是为了提高数据库系统的性能.从内存访问数据要比从磁盘访问

  • 解决db2事务日志已满及日志磁盘空间已满问题办法详解

    事务日志满指当前事务无法写入到活动日志中(主日志文件和辅助日志文件已全部用完或者没有足够当前事务写入的空间) 日志磁盘空间已满指辅助日志文件还未使用完,磁盘空间已经满了. db2数据库事务日志文件分为主日志文件和辅助日志文件,主日志文件已分配空间,辅助日志文件使用时再分配. 查看事务日志配置(mid为数据库名称): db2 get db cfg for mid 运行结果: 日志文件大小(4KB)                         (LOGFILSIZ) = 1024 主日志文件的数

随机推荐