ITPub博客

首页 > 数据库 > 数据库开发技术 > load操作报日志满的问题分析与现象还原实验

load操作报日志满的问题分析与现象还原实验

数据库开发技术 作者:flywiththewind 时间:2016-07-29 10:09:21 0 删除 编辑
转自:http://www.db2china.net/home/space.php?uid=44525&do=blog&id=30571

load操作报日志满的问题分析与现象还原实验

       在日常迁移跑批中,load操作使用很少的日志,因此我们经常使用,某些场合或多并发load对日志量有多大影响,可能不能很好的解释,本文从生产中的一个问题开始,通过问题得分析和现象还原,讨论load操作对日志的影响。

现象描述:
       生产环境中,LINUX上有一台数据库服务器(DB2 V9.1)在做跑批操作(手动方式),通过cursor+load方式迁移表数据(导入表和原表都是同一个数据库),迁移表原数据在400多G,表压缩后为170G,无索引,load导入大概30分钟时报错,事务日志满(日志大小为25G,日志所在的文件系统容量充足)。

当时分析:
       个人以前的理解是load不会检查not null 和参考完整性约束,在删除阶段只会检查违背了唯一性约束的行。如果有违背了参考完整性约束的在load完会使表置于set intergrity pending状态。load在建索引和删除索引时肯定会记录日志。 load记录少量日志(少量日志在哪阶段产生说不清楚),曾经有个资深DBA说在没有索引时,load不会记录日志。当问题出现时,短时间没有很好的理由解释问题现象,素手无策。重新执行load跑批任务,执行成功。

事后分析:
       Load不是一点日志都不记录,只是不记录数据变化,但会记录相关操作及描述信息。即使没有索引,不需要索引复制重建也会使用一些日志。在当前日志量下,如果只有一个或多个load并发情况下执行,不会出现日志满的情况,如果在做load操作时,又有其他用户执行大量update或insert,delete操作,会记录大量日志,填充活动日志,使load的日志成为lowtranlsn,形成长事务日志,而不能释放日志空间,如果起始时活动日志已经在高位,最终可能导致load日志满。

       为了更好的解释问题,做以下两个实验还原生产中的现象,通过现象可以更深入了解当时的问题。
第一个实验,模拟多用户并发下,有大量的update或insert,delete操作,这些操作会记录很多日志。选取insert作为本实验操作,并发数为2个。主要观察日志的变化。
第二个实验,模拟多用户并发下,load操作导致的长事物使日志撑满(load的日志成为lowtranlsn,为activate log不能释放日志空间,因无法分配新的日志使日志撑满)

       生产中,跑批表数据量在400多G,日志大小为25G。为真实模拟生产现状,测试场景中数据量缩小1000倍,数据量在500多M,日志大小为25M.日志文件大小缩小100倍为256个页,配置为归档日志。表页大小为8K。

D:\Program Files\IBM\SQLLIB\BIN>db2 get db cfg|findstr /i log
 目录高速缓存大小 (4KB)                (CATALOGCACHE_SZ) = (MAXAPPLS*5)
 日志缓冲区大小 (4KB)                          (LOGBUFSZ) = 256
 日志文件大小 (4KB)                          (LOGFILSIZ) = 256
 主日志文件的数目                           (LOGPRIMARY) = 5
 辅助日志文件的数目                          (LOGSECOND) = 20
 已更改的至日志文件的路径                   (NEWLOGPATH) =
 日志文件路径                                            = D:\DB2\NODE0000\SQL00001\LOGSTREAM0000\
 溢出日志路径                          (OVERFLOWLOGPATH) =
 镜像日志路径                            (MIRRORLOGPATH) =
 首个活动日志文件                                        = S0001292.LOG
 磁盘上已满的块日志                    (BLK_LOG_DSK_FUL) = NO
 非记录块操作                          (BLOCKNONLOGGED) = NO
 事务使用的最大主日志空间的百分比        (MAX_LOG)= 0
 1 个活动 UOW 的活动日志文件的数目        (NUM_LOG_SPAN) = 0
 第一个日志归档方法                        (LOGARCHMETH1) = DISK:d:\DB2\

实验1(模拟大数据量,日志记录情况):

场景(1.1):单独做insert操作,观察log的变化,调整insert的行数,使日志使用率达到90以上,便于下一场景测试。

第一个窗口,建表,执行insert操作,插入150000条记录,表达小为5.21M,667个数据页。
   
D:\Program Files\IBM\SQLLIB\BIN>db2 connect to sample

   数据库连接信息
 数据库服务器         = DB2/NT64 10.1.0
 SQL 授权标识         = ADMINIST...
 本地数据库别名       = SAMPLE

D:\Program Files\IBM\SQLLIB\BIN>db2 drop table t1
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 create table t1 (id int,name char(20))
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 -c "begin atomic declare i int default 0; while (i<180000) do insert into t1 values('0' ||int(i), 'bb'  ||char(i) );set i=i+1; end while; end "
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 runstats on table ADMINISTRATOR.T1
DB20000I  RUNSTATS 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select card,fpages,fpages*8.0/1024.0 as sizeMB from syscat.tables where tabschema='ADMINISTRATOR'and tabname='T1'"

CARD                 FPAGES               SIZEMB
-------------------- -------------------- ---------------------------------
              150000                  667                      5.2109375000

在第一个窗口执行过程中,第二个窗口监控执行insert操作时,log的从开始到结束的变化。

D:\Program Files\IBM\SQLLIB\BIN>db2 connect to sample

   数据库连接信息
 数据库服务器         = DB2/NT64 10.1.0
 SQL 授权标识         = ADMINIST...
 本地数据库别名       = SAMPLE

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            26086400                    0           0                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            26070784                15616           0                    0
            
--注:上面15616为drop表和建表时产生的日志,此值记录为log的初始大小。            

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            17935193              8151207          31                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            13807641             12278759          47                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            10694369             15392031          59                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             6012137             20074263          76                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             4438841             21647559          82                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             1308457             24777943          94                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25494048               592352           2                    0

  1 条记录已选择。
  
  从本实验中可以看到5.21M的数据;insert操作用了24M的日志空间,是数据大小的4倍多。可见update或insert,delete操作对日志的杀伤力。
  
场景(1.2):单独load时,观察log的变化情况。

第一个insert过后一些secondlog仍没有释放,为测试更准确一些,重启实例,释放secondlog。

D:\Program Files\IBM\SQLLIB\BIN>db2pd -d sample -logs

Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:14:05 -- Date 2013-11-04 09:33:44

Logs:
Current Log Number            792
Pages Written                 149
Cur Commit Disk Log Reads     0
Cur Commit Total Log Reads    0
Method 1 Archive Status       Success
Method 1 Next Log to Archive  792
Method 1 First Failure        n/a
Method 2 Archive Status       n/a
Method 2 Next Log to Archive  n/a
Method 2 First Failure        n/a
Log Chain ID                  0
Current LSO                   892241218
Current LSN                   0x00000000008EF1C9

Address            StartLSN         StartLSO             State      Size       Pages      Filename
0x000007FFEBDF6BF0 00000000008EAD84 890589697            0x00000000 256        256        S0000791.LOG
0x000007FFEBDF7470 00000000008ED8F6 891633153            0x00000000 256        256        S0000792.LOG
0x000007FFEBDF5AF0 0000000000000000 892676609            0x00000000 256        256        S0000793.LOG
0x000007FFEBDF6370 0000000000000000 893720065            0x00000000 256        256        S0000794.LOG
0x000007FFEBDF8570 0000000000000000 894763521            0x00000000 256        256        S0000795.LOG
0x000007FFEBDF9670 0000000000000000 895806977            0x00000000 256        256        S0000796.LOG
0x000007FFEBDF7CF0 0000000000000000 896850433            0x00000000 256        256        S0000797.LOG
0x000007FFEBDFA770 0000000000000000 897893889            0x00000000 256        256        S0000798.LOG
0x000007FFEBDF8DF0 0000000000000000 898937345            0x00000000 256        256        S0000799.LOG
0x000007FFEBDF9EF0 0000000000000000 899980801            0x00000000 256        256        S0000800.LOG
0x000007FFEBDFB870 0000000000000000 901024257            0x00000000 256        256        S0000801.LOG
0x000007FFEBDFAFF0 0000000000000000 902067713            0x00000000 256        256        S0000802.LOG
0x000007FFEBDFC970 0000000000000000 903111169            0x00000000 256        256        S0000803.LOG

D:\Program Files\IBM\SQLLIB\BIN>db2stop force
2013-11-04 09:33:57     0   0   SQL1064N  DB2STOP 处理成功。
SQL1064N  DB2STOP 处理成功。

D:\Program Files\IBM\SQLLIB\BIN>db2start
2013-11-04 09:34:02     0   0   SQL1063N  DB2START 处理成功。
SQL1063N  DB2START 处理成功。

D:\Program Files\IBM\SQLLIB\BIN>db2 connect to sample

   数据库连接信息

 数据库服务器         = DB2/NT64 10.1.0
 SQL 授权标识         = ADMINIST...
 本地数据库别名       = SAMPLE

D:\Program Files\IBM\SQLLIB\BIN>db2pd -d sample -logs

Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:02:19 -- Date 2013-11-04 09:36:22

Logs:
Current Log Number            0
Pages Written                 0
Cur Commit Disk Log Reads     0
Cur Commit Total Log Reads    0
Method 1 Archive Status       n/a
Method 1 Next Log to Archive  793
Method 1 First Failure        n/a
Method 2 Archive Status       n/a
Method 2 Next Log to Archive  n/a
Method 2 First Failure        n/a
Log Chain ID                  0
Current LSO                   892676609
Current LSN                   0x00000000008EF1C9

Address            StartLSN         StartLSO             State      Size       Pages      Filename
0x000007FFF048B930 0000000000000000 892676609            0x00000000 256        256        S0000793.LOG
0x000007FFF048C1B0 0000000000000000 893720065            0x00000000 256        256        S0000794.LOG
0x000007FFF048CA30 0000000000000000 894763521            0x00000000 256        256        S0000795.LOG
0x000007FFF048D2B0 0000000000000000 895806977            0x00000000 256        256        S0000796.LOG
0x000007FFF048DB30 0000000000000000 896850433            0x00000000 256        256        S0000797.LOG

     第一窗口,使用之前用相同方法插入的表2(表结构和表数据与表1相同)大小为552M,70687个页。

D:\Program Files\IBM\SQLLIB\BIN>db2 runstats on table ADMINISTRATOR.T2
DB20000I  RUNSTATS 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select card,fpages,fpages*8.0/1024.0 as sizeMB from syscat.tables where tabschema='ADMINISTRATOR'a
nd tabname='T2'"

CARD                 FPAGES               SIZEMB
-------------------- -------------------- ---------------------------------
            15900000                70687                    552.2421875000

D:\Program Files\IBM\SQLLIB\BIN>db2 drop table t3
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 create table t3 (id int,name char(20))
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 declare c1 cursor  for select * from t2
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 load from c1 of cursor insert into t3 nonrecoverable

SQL1193I  实用程序正开始通过 SQL 语句 " select * from t2" 装入数据。

SQL3500W  在时间 "2013-11-04 09:39:13.532684",实用程序在开始 "LOAD"。

SQL3519W  开始装入一致点。输入记录计数 = "0"。

SQL3520W  “装入一致点”成功。

SQL3110N  实用程序已完成处理。从输入文件读了 "15900000" 行。

SQL3519W  开始装入一致点。输入记录计数 = "15900000"。

SQL3520W  “装入一致点”成功。

SQL3515W  在时间 "2013-11-04 09:39:33.206829",实用程序已经完成了 "LOAD"。

读取行数         = 15900000
跳过行数         = 0
装入行数         = 15900000
拒绝行数         = 0
删除行数         = 0
落实行数         = 15900000

D:\Program Files\IBM\SQLLIB\BIN>db2 runstats on table ADMINISTRATOR.T3
DB20000I  RUNSTATS 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select card,fpages,fpages*8.0/1024.0 as sizeMB from syscat.tables where tabschema='ADMINISTRATOR'
and tabname='T3'"

CARD                 FPAGES               SIZEMB
-------------------- -------------------- ---------------------------------
            15900000                70686                    552.2343750000

  1 条记录已选择。

第二个窗口监控load过程中日志的变化:

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            26070327                16073           0                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25864991               221409           0                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25825367               261033           1                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25628807               457593           1                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25527095               559305           2                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25480607               605793           2                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25389503               696897           2                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25578103               508297           1                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25578103               508297           1                    0

  1 条记录已选择。

实验证明552M的数据用了480.6K的日志((508297-16073)/1024),load操作在无索引下,也记录日志,且记录少量日志。

场景(1.3):模拟并发下存在大事务(insert和load同时执行时,日志的变化)。

重启实例,释放secondlog。

D:\Program Files\IBM\SQLLIB\BIN>db2 drop table t2
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 create table t2 (id int,name char(20))
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 drop table t1
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 create table t1 (id int,name char(20))
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2stop force
2013-11-04 10:34:09     0   0   SQL1064N  DB2STOP 处理成功。
SQL1064N  DB2STOP 处理成功。

D:\Program Files\IBM\SQLLIB\BIN>db2start
2013-11-04 10:34:15     0   0   SQL1063N  DB2START 处理成功。
SQL1063N  DB2START 处理成功。

D:\Program Files\IBM\SQLLIB\BIN>db2 connect to sample

   数据库连接信息

 数据库服务器         = DB2/NT64 10.1.0
 SQL 授权标识         = ADMINIST...
 本地数据库别名       = SAMPLE

D:\Program Files\IBM\SQLLIB\BIN>db2pd -d sample -logs

Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:01:09 -- Date 2013-11-04 10:35:24

Logs:
Current Log Number            0
Pages Written                 0
Cur Commit Disk Log Reads     0
Cur Commit Total Log Reads    0
Method 1 Archive Status       n/a
Method 1 Next Log to Archive  795
Method 1 First Failure        n/a
Method 2 Archive Status       n/a
Method 2 Next Log to Archive  n/a
Method 2 First Failure        n/a
Log Chain ID                  0
Current LSO                   894763521
Current LSN                   0x00000000008F0E6F

Address            StartLSN         StartLSO             State      Size       Pages      Filename
0x000007FFF048B930 0000000000000000 894763521            0x00000000 256        256        S0000795.LOG
0x000007FFF048C1B0 0000000000000000 895806977            0x00000000 256        256        S0000796.LOG
0x000007FFF048CA30 0000000000000000 896850433            0x00000000 256        256        S0000797.LOG
0x000007FFF048D2B0 0000000000000000 897893889            0x00000000 256        256        S0000798.LOG

第一个窗口,执行load操作:

D:\Program Files\IBM\SQLLIB\BIN>db2 drop table t1
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 drop table t2
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 create table t2 (id int,name char(20))
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 create table t1 (id int,name char(20))
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 declare c1 cursor  for select * from t3
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 load from c1 of cursor insert into t2 nonrecoverable
SQL3039W  可供 DATA BUFFER 的 LOAD 使用的内存禁止完全 LOAD
并行性。将使用装入并行性 "3"。

SQL1193I  实用程序正开始通过 SQL 语句 " select * from t3" 装入数据。

SQL3500W  在时间 "2013-11-04 10:49:27.376277",实用程序在开始 "LOAD"。

SQL3519W  开始装入一致点。输入记录计数 = "0"。

SQL3520W  “装入一致点”成功。

SQL0964C  数据库的事务日志已满。  SQLSTATE=57011

SQL0964C  数据库的事务日志已满。  SQLSTATE=57011


第二个窗口,执行insert操作:

D:\Program Files\IBM\SQLLIB\BIN>db2 -c "begin atomic declare i int default 0; while (i<150000) do insert into t1 values('0' ||int(i), '
bb'  ||char(i) );set i=i+1; end while; end "
DB21034E  该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0964C  数据库的事务日志已满。  SQLSTATE=57011

D:\Program Files\IBM\SQLLIB\BIN>

第三个窗口,监控日志变化:

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            14873331             11213069          42                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            11831507             14254893          54                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             7569163             18517237          70                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             6482915             19603485          75                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             3446635             22639765          86                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             2524363             23562037          90                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
              264955             25821445          98                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
              264955             25821445          98                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
              264955             25821445          98                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25337370               749030           2                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25337370               749030           2                    0

  1 条记录已选择。

实验(2):load操作导致的长事物使日志撑满,通过import的commitcount参数模拟短事务多并发情况下,load操作导致的长事务。

场景(2.1):首先单独执行带commitcount的import,观察log变化。建t1表,通过多次数值比较,插入450000条记录,export出数据,再import;

D:\Program Files\IBM\SQLLIB\BIN>db2 create table t1 (id int,name char(20))
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 -c "begin atomic declare i int default 0; while (i<150000) do insert into t1 values('0' ||int(i), '
bb'  ||char(i) );set i=i+1; end while; end "
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 -c "begin atomic declare i int default 0; while (i<150000) do insert into t1 values('0' ||int(i), '
bb'  ||char(i) );set i=i+1; end while; end "
DB20000I  SQL 命令成功完成。

db2 -c "begin atomic declare i int default 0; while (i<150000) do insert into t1 values('0' ||int(i), '
bb'  ||char(i) );set i=i+1; end while; end "
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 export to d:\test1.del of del select * from t1
SQL3104N  EXPORT 实用程序 正在开始将数据导出至文件 "d:\test.del"。

SQL3105N  Export 实用程序已经完成导出 "450000" 行。

导出的行数:450000

d:\test1.del大小12.9M,检查部分数据如下:。
100802,"bb100802            "
100803,"bb100803            "
100804,"bb100804            "
100805,"bb100805            "
100806,"bb100806            "
100807,"bb100807            "
100808,"bb100808            "
100809,"bb100809            "
100810,"bb100810            "
100811,"bb100811            "
100812,"bb100812            "
。。。。。。。。。

D:\Program Files\IBM\SQLLIB\BIN>db2 import from  d:\test.del of del commitcount 20000 insert into t4

。。。。。。。。。。。。。。。。

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "150000"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "152000"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "154000"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3110N  实用程序已完成处理。从输入文件读了 "155000" 行。

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "155000"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3149N  处理了输入文件中的 "155000" 行。已将 "155000" 行成功插入表中。拒绝了
"0" 行。

读取行数         = 155000
跳过行数         = 0
插入行数         = 155000
更新行数         = 0
拒绝行数         = 0
落实行数         = 155000

D:\Program Files\IBM\SQLLIB\BIN>db2 runstats on table ADMINISTRATOR.T1
DB20000I  RUNSTATS 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select card,fpages,fpages*8.0/1024.0 as sizeMB from syscat.tables where tabschema='ADMINISTRATOR'
and tabname='T1'"

CARD                 FPAGES               SIZEMB
-------------------- -------------------- ---------------------------------
              155000                  690                      5.3906250000

  1 条记录已选择。
  
第二个窗口监控日志的变化:

。。。。。。。。。。。。。。。。。。。。。
D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25127129               959271           3                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            24713457              1372943           5                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            24143233              1943167           7                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            23687785              2398615           9                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25172193               914207           3                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            24466729              1619671           6                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            24149265              1937135           7                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25245785               840615           3                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            24090425              1995975           7                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_l
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25846993               239407           0                    0

  1 条记录已选择。
  
       信息中心对commitcount n的解释:Performs a COMMIT after every n records are imported. When a number n is specified, import performs a COMMIT after every n records are imported.
       通过实验发现,commitcount 设置为20000时,每插入20000事务会提交一次,日志会自动释放提交的事务日志,log成波浪式起落,总体占用日志的空间不大,独立执行也不会产生长事务。

场景(2.2):模拟多并发情况下的,长事物导致日志满情况。

       打开3个窗口,第一个窗口执行load操作,第二个窗口指定带commitcount参数的import操作,模拟交易型短事务,第三个窗口进行监控,观察日志的变化。同时手工执行三个窗口具体信息如下:

第一个窗口,执行cursor+load操作,执行和结果如下所示:
D:\Program Files\IBM\SQLLIB\BIN>db2 runstats on table ADMINISTRATOR.T3
DB20000I  RUNSTATS 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select card,fpages,fpages*8.0/1024.0 as sizeMB from syscat.tables where tabschema='ADMINISTRATOR'
and tabname='T3'"

CARD                 FPAGES               SIZEMB
-------------------- -------------------- ---------------------------------
            15900000                70686                    552.2343750000

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 drop table t2
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 create table t2 (id int,name char(20))
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 declare c1 cursor  for select * from t3
DB20000I  SQL 命令成功完成。

D:\Program Files\IBM\SQLLIB\BIN>db2 load from c1 of cursor insert into t2 nonrecoverable
SQL3039W  可供 DATA BUFFER 的 LOAD 使用的内存禁止完全 LOAD
并行性。将使用装入并行性 "3"。

SQL1193I  实用程序正开始通过 SQL 语句 " select * from t3" 装入数据。

SQL3500W  在时间 "2013-11-04 14:41:28.527955",实用程序在开始 "LOAD"。

SQL3519W  开始装入一致点。输入记录计数 = "0"。

SQL3520W  “装入一致点”成功。

SQL0964C  数据库的事务日志已满。  SQLSTATE=57011

SQL0964C  数据库的事务日志已满。  SQLSTATE=57011


  1 条记录已选择。

第二个窗口,执行带commitcount参数的import,模拟多并发交易型短事务,执行和结果如下所示:
D:\Program Files\IBM\SQLLIB\BIN>db2 select count (*) from t1

1
-----------
     300000

  1 条记录已选择。


D:\Program Files\IBM\SQLLIB\BIN>db2 export to d:\test.del of del select * from t1

D:\Program Files\IBM\SQLLIB\BIN>db2 select count(*) from t4

1
-----------
          0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 import from  d:\test.del of del commitcount 10000 insert into t4
SQL3109N  实用程序正在开始从文件 "d:\test.del" 装入数据。

。。。。。。。。。。。。。。。。

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "230000"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "240000"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "250000"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "260000"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3186W  未将数据装入数据库,因为日志已满或者耗尽了锁定空间。返回了 SQLCODE
"-964"。将尝试落实,如果落实成功,那么操作将继续。

SQL0964C  数据库的事务日志已满。  SQLSTATE=57011

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "264467"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

。。。。。。。。。。。。。。。

SQL3186W  未将数据装入数据库,因为日志已满或者耗尽了锁定空间。返回了 SQLCODE
"-964"。将尝试落实,如果落实成功,那么操作将继续。

SQL0964C  数据库的事务日志已满。  SQLSTATE=57011

SQL3221W  ...开始 COMMIT WORK。输入记录计数 = "267958"。

SQL3222W  ...对任何数据库更改的 COMMIT 都成功。

SQL3321C  未将数据导入数据库,因为日志已满或者耗尽了锁定空间。恢复不成功。返回了
SQLCODE "-964"。

SQL0964C  数据库的事务日志已满。  SQLSTATE=57011

SQL3110N  实用程序已完成处理。从输入文件读了 "267967" 行。


第三个窗口,监控日志变化,结果如下所示:

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25350105               736295           2                    0

  1 条记录已选择。


D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            24536433              1549967           5                    0

  1 条记录已选择。


D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            22220953              3865447          14                    0

  1 条记录已选择。


D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            20607881              5478519          21                    0

  1 条记录已选择。


D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            19047281              7039119          26                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            18344920              7741480          29                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            16560033              9526367          36                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            15389329             10697071          41                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            13776169             12310231          47                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            12050297             14036103          53                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             8977209             17109191          65                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             7043601             19042799          72                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             5482241             20604159          78                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             3662153             22424247          85                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             2351881             23734519          90                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
             1244729             24841671          95                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
              617161             25469239          97                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
              265108             25821292          98                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
              265108             25821292          98                    0

  1 条记录已选择。

D:\Program Files\IBM\SQLLIB\BIN>db2 "select TOTAL_LOG_AVAILABLE,TOTAL_LOG_USED,int((float(total_log_used)/float(total_log_used+total_lo
g_available))*100.0) as Pct_Used,NUM_LOG_BUFFER_FULL from sysibmadm.snapdb"

TOTAL_LOG_AVAILABLE  TOTAL_LOG_USED       PCT_USED    NUM_LOG_BUFFER_FULL
-------------------- -------------------- ----------- --------------------
            25473772               612628           2                    0

  1 条记录已选择。

       本实验结果观察到,load长时间执行,形成长事务,导致activate log空间无法释放,同时有多并发情况下,日志不断填充。主日志无法rename no activate log,辅日志达到设置上限,从而导致日志空间满。

总结:
       本实验一共设置了两个场景,第一个场景是load过程中有大事务导致日志满。第二个场景模拟load过程中,load因记录日志,产生lowtranlsn,其他已提交的短事务也可能会产生日志满情况。
具体如下:
(1)insert、update、delete类操作会产生大于数据量几倍的日志量。对跑批系统如有类似大规模操作,可根据具体操作评估日志使用量。
(2)load时以数据页为单位,迁移数据页多少决定load时间;load在没有索引情况下也会产生少量日志,load导入过程中,日志会不断增加(主要记录头类等信息而非数据),应避免并发较大时,load操作产生lowtranlsn的activate log,如有事务日志不断填充,lowtranlsn的事务不释放日志,会使日志撑满。
(3)实验观察发现当日志不断增大时达到98%(日志监控采用int类型,具体数值可能不精确),不会再增长,数值滞留一段时间后回落到该操作之前的水平。达到98%时,数据库不再分配日志空间,事务产生回滚;可以得出:剩余2%日志为预留空间,不参与事务日志分配,回滚所需少量日志,在2%中分配。

赞同4

15 评论

评论
hp_leetaedong14hp_leetaedong14 IT支持,Salmon 中国
搞不懂db2。 为什么 lowtranlsn 的activate log不能rename?

只要 这个log cover的data change已经被 flush到disk,并且log已被归档,就可以rename啊。
2013-11-05 13:03
hp_leetaedong14hp_leetaedong14 IT支持,Salmon 中国
oracle 出现日志不够用的情况很少。 
有的话,通常也是 flush的速度太慢。
2013-11-05 13:10
zhendazhenda 数据库运维工程师,昆仑银行
hp_leetaedong14: 搞不懂db2。 为什么 lowtranlsn 的activate log不能rename?

只要 这个log cover的data change已经被 flush到disk,并且log已被归档,就可以rename啊。
这一部分是日志原理,归档日志里可能也有activate log,activate log 是不能rename,也不能跳过该日志编号,rename下一个日志。
2013-11-05 13:42
hp_leetaedong14hp_leetaedong14 IT支持,Salmon 中国
zhenda: 这一部分是日志原理,归档日志里可能也有activate log,activate log 是不能rename,也不能跳过该日志编号,rename下一个日志。
他不能rename, 最根本的是 在保护什么?

我查到一些资料 说是  lsn 不能分配。

我的理解:
不用rename。 归档的话,将旧的move到归档目录,然后直接创建一新的redo。
有需要 你可以 去归档目录 找啊。

只要是cover 的data flush 到disk了,那就是安全的,就可以覆盖。
2013-11-05 14:49
zhendazhenda 数据库运维工程师,昆仑银行
hp_leetaedong14: 他不能rename, 最根本的是 在保护什么?

我查到一些资料 说是  lsn 不能分配。

我的理解:
不用rename。 归档的话,将旧的move到归档目录,然后直接创建一新的redo。
rename讨论的不是归档日志。而是NEWLOGPATH路径下的主辅日志,当主辅日志处于活动状态是不能被覆盖及rename,及时这时该活动日志已归档。归档和rename是两回事。本文主要讨论load对日志的影响。
2013-11-05 15:07
hp_leetaedong14hp_leetaedong14 IT支持,Salmon 中国
不知道 是不是我没说清。

你给 案例,其实就是一个长事务holding the oldest transaction,持续分配redo,最后导致redo被撑满。不管是load 还是其它 的dml。 都会发生日志文件满的错误。


我的疑问是,假如这个 oldest transaction 所cover的data已经被 flush到了disk(oracle叫checkpoint),它就是安全的啊,为什么这个日志就不能 覆盖? 为什么不能 再分配空间?
2013-11-05 15:26
thuanqinthuanqin 其它,ibm
hp_leetaedong14: 不知道 是不是我没说清。

你给 案例,其实就是一个长事务holding the oldest transaction,持续分配redo,最后导致redo被撑满。不管是load 还是其它 的dml。 都会发
《数据库原理》书中关于日志的章节提到,checkpoint在一种情况下会的需要检查点前的日志,那就是检查点之前有日志包含未commit的事务数据的时候。假设某个checkpoint后用户想rollback了,那么没有checkpoint前的日志DB是没法rollback的。
这个是我的笔记:
undo/redo日志的非静止检查点:
1.写入日志记录<START CKPT(T1,...Tk)>,其中T1,...Tk是所有的活跃的事务,并刷新日志入磁盘。
2.将所有脏缓冲区(块)写到磁盘,脏缓冲区即包含一个或多个修改过的数据元素的缓冲区。和redo不同的是,我们刷新所有的脏缓冲区,而不仅仅刷新那些被提交事务写过的缓冲区。
3.写入日志记录<END CKPT>并刷新日志。
比如:
<START T1>
<T1,A,4,5>
<START T2>
<COMMIT T1>
<T2,B,9,10>
<START CKPT(T2)>  (这一步会把所有的脏页写入磁盘,那么T1其实就ok了(当然得看到下面的END CKPT才真的OK),T2的话磁盘上有脏数据)
<T2,C,14,15>
<START T3>
<T3,D,19,20>
<END CKPT>
<COMMIT T2>
<COMMIT T3>

如果崩溃发生在末尾,也就是说T2、T3的COMMIT已经能看到了,那么因为有END CKPT,所以T1就OK了。我们只需要从<START CKPT(T2)>开始重做T2、T3,甚至不需要去读<START CKPT(T2)>之前的日志,因为<START CKPT(T2)>把之前所有的数据都写如磁盘了。
如果崩溃发生在<COMMIT T3>记录写如磁盘之前。那么我们通过检查点可以知道T1是OK了,T2的话需要把C redo为15。至于<T2,B,9,10>这种看都不用看了,因为这些已经写入到磁盘了。同时,我们需要undo T3,如果T3在<START CKPT(T2)>里(这个例子里不在),那么就不得不看之前的日志了。

不过Oracle的Checkpoint是不是和我说的这个checkpoint的含义一样就不清楚了,应该差不多。
2013-11-05 21:43
hp_leetaedong14hp_leetaedong14 IT支持,Salmon 中国
没有checkpoint前的日志DB是没法rollback的。
===> 
确实,我回去后也再想了一下。
其实 active redo log理论上是可以覆盖的(前提是 该redo cover的data change 已经被flush到disk并且
该redo已归档)

但是,这样会有一个问题,当已经被覆盖且归档的redo中包含的uncommit的事务rollback的时候
就会有问题,因为它需要去读取归档日志,而归档日志 是不能保证 一直存在的,很有可能被人为删除。
这个时候就 出现 无法找到 before image的问题。

这就是你说的“没有checkpoint前的日志DB是没法rollback的。”。

DB2为了保护事务的ACID特性,才不让 覆盖这个redo。

另外 有一个问题,DB2关于事务的 transaction table 这些信息 是保存在哪里?
就是 一个事务 回滚的时候,由哪个日志的哪个偏移量开始去找它的before image?
2013-11-06 11:07
hongyehongyehongyehongye 数据库管理员,民生银行
The utility manager produces log records associated with a number of DB2? utilities, including the load utility.

The following log records mark the beginning or end of a specific activity during a load operation:

Setup phase
Load Start. This log record signifies the beginning of a load operation's setup phase.
Commit log record. This log record signifies the successful completion of the setup phase.
Abort log record. This log record signifies the failure of the setup phase. (Alternately, in a single partition database, if the Load setup phase fails prior to physically modifying the table, it will generate a Local Pending commit log record).
Load phase
Load Start. This log record signifies the beginning of a load operation's load phase.
Local Pending commit log record. This log record signifies the successful completion of the load phase.
Abort log record. This log record signifies the failure of the load phase.
Delete phase
Load Delete Start. This log record is associated with the beginning of the delete phase in a load operation. The delete phase is started only if there are duplicate primary key values. During the delete phase, each delete operation on a table record, or an index key, is logged.
Load Delete End. This log record is associated with the end of the delete phase in a load operation. This delete phase is repeated during the rollforward recovery of a successful load operation.
The following list outlines the log records that the load utility creates depending on the size of the input data:
Two log records are created for every table space extent allocated or deleted by the utility in a DMS table space.
One log record is created for every chunk of identity values consumed.
Log records are created for every data row or index key deleted during the delete phase of a load operation.
Log records are created that maintain the integrity of the index tree when performing a load operation with the ALLOW READ ACCESS and INDEXING MODE INCREMENTAL options specified. The number of records logged is considerably less than a fully logged insertion into the index.
2013-11-06 15:56
zhendazhenda 数据库运维工程师,昆仑银行
hongyehongye: The utility manager produces log records associated with a number of DB2? utilities, including the load utility.

The following log records mark the
谢谢,洪烨兄。这些秘籍在哪里掏的啊,很有帮助。
2013-11-07 09:09
thuanqinthuanqin 其它,ibm
hp_leetaedong14: 没有checkpoint前的日志DB是没法rollback的。
===> 
确实,我回去后也再想了一下。
其实 active redo log理论上是可以覆盖的(前提是 该redo cover的data change
Oracle的redo日志可以覆盖,因为它的undo放在了回滚段里o(∩_∩)o
2014-01-08 23:13
thuanqinthuanqin 其它,ibm
infocenter里有:Database administration > Data movement utilities and reference > Load utility > Failed or incomplete loads  吐槽一下,Infocenter要改名叫做knowlodgecenter了
2014-01-08 23:17
zhendazhenda 数据库运维工程师,昆仑银行
thuanqin: infocenter里有:Database administration > Data movement utilities and reference > Load utility > Failed or incomplete loads  吐槽一下,Infocente
谢谢thuanqin,最近学习oracle,推荐几本包括基础篇和升级篇。
2014-01-09 08:50
zhendazhenda 数据库运维工程师,昆仑银行
thuanqin: infocenter里有:Database administration > Data movement utilities and reference > Load utility > Failed or incomplete loads  吐槽一下,Infocente
回复吐槽,哈,以产品角度看是Infocenter手册,以使用者角度看是knowlodge,符合美国人严谨的思维。Infocenter确实让我们更进一步了解它,而又离不开它。
2014-01-09 09:23
thuanqinthuanqin 其它,ibm
OCA OCP Oracle Database 11g All-in-One Exam Guide Exams 1Z0-051  1Z0-052 1Z0-053
2014-01-09 10:00

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26224914/viewspace-2122718/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-08-30

  • 博文量
    146
  • 访问量
    207826