使用 db2pd 命令进行监视和故障诊断

db2pd 命令用于排除故障,因为它可以快速、即时地从内存集返回信息。 Db2® 内存集的即时信息。

概述

该工具不需要获得任何锁存器或使用任何引擎资源就可以收集信息。 因此,在 db2pd 收集信息时,有可能(并且预计)会检索到正在更改的信息;这样,数据可能不是十分准确。 如果遇到正在更改的内存指针,可使用信号处理程序来防止 db2pd 异常结束。 这可能会导致输出中出现诸如以下的消息:“正在更改的数据结构已强制终止命令”。 虽然如此,该工具对于故障诊断却非常有用。 在不锁存的情况下收集信息有两个好处:检索速度更快并且不会争用引擎资源。

如果要在出现特定 SQLCODE、ZRC 代码或 ECF 代码时捕获关于数据库管理系统的信息,那么可以使用 db2pdcfg -catch 命令完成此操作。 捕获到错误时,将启动 db2cos(调出脚本)。 db2cos 脚本可以动态地进行更改,以便运行解决问题所需的任何 db2pd 命令、操作系统命令或任何其他命令。 模板 db2cos 脚本文件位于 UNIX 和 Linux®上的 sqllib/bin 中。 在 Windows 操作系统上, db2cos 位于 $DB2PATH\bin 目录中。

添加新节点时,可以使用带有可选 oldviewappsdetail 参数的 db2pd -addnode 命令来监视数据库分区服务器 (即添加节点) 上的操作进度,以获取更详细的信息。

要获取当前处于活动状态或者曾处于活动状态但由于某种原因而被取消激活的事件监视器的列表,请运行 db2pd -gfw 命令。 此命令还将返回关于每个快速写程序 EDU 的目标的统计信息和信息(事件监视器将数据写入那些目标)。

示例

为了提高可读性,从 db2cmd 命令输出摘录了示例中显示的结果文本。

示例 1:诊断锁定等待

如果运行 db2pd -db databasename -locks -transactions -applications -dynamic,那么结果将类似于:
Locks:
TranHdl Lockname                   Type Mode Sts Owner Dur HldCnt Att    ReleaseFlg
3       00020002000000040000000052 Row  ..X  G   3     1   0      0x0000 0x40000000
2       00020002000000040000000052 Row  ..X  W*  2     1   0      0x0000 0x40000000
对于使用 -db 数据库名称选项指定的数据库,开头的结果会显示该数据库的锁定。 此结果表明,TranHdl 2 正在等待 TranHdl 3 挂起的锁定。
Transactions:
AppHandl [nod-index] TranHdl Locks State Tflag      Tflag2     Firstlsn       Lastlsn        Firstlso       Lastlso        LogSpace SpaceReserved TID            AxRegCnt GXID
11       [000-00011] 2       4     READ  0x00000000 0x00000000 0x000000000000 0x000000000000 0x000000000000 0x000000000000 0        0             0x0000000000B7 1        0
12       [000-00012] 3       4     WRITE 0x00000000 0x00000000 0x00000002AC04 0x00000002AC04 0x000000FA000C 0x000000FA000C 113      154           0x0000000000B8 1        0
您会发现 TranHdl 2 与 AppHandl 11 相关联,而 TranHdl 3 与 AppHandl 12 相关联。
Applications:
AppHandl [nod-index] NumAgents CoorPid Status        C-AnchID C-StmtUID L-AnchID L-StmtUID Appid

12       [000-00012] 1         1073336 UOW-Waiting   0        0         17       1         *LOCAL.burford.060303225602
11       [000-00011] 1         1040570 UOW-Executing 17       1         94       1         *LOCAL.burford.060303225601
我们可以看到 AppHandl 12 最近一次运行动态语句 17 和 1。 AppHandl 11 当前正在运行动态语句 17 和 1 以及最近一次运行的语句 94 和 1。
;
Dynamic SQL Statements:
AnchID StmtUID NumEnv NumVar NumRef NumExe Text
 17     1       1      1      2      2      update pdtest set c1 = 5
 94     1       1      1      2      2      set lock mode to wait 1
您会发现,文本列显示与锁定超时相关联的 SQL 语句。

示例 2:使用 -wlocks 参数来捕获正在等待的所有锁定

如果运行 db2pd -wlocks -db pdtest,那么将生成类似如下的结果。 这些结果表明,第一个应用程序(AppHandl 47)正在对表执行插入,并且第二个应用程序(AppHandl 46)正在对该表执行选择:
venus@boson:/home/venus =>db2pd -wlocks -db pdtest

Database Partition 0 -- Database PDTEST -- Active -- Up 0 days 00:01:22

Locks being waited on :
AppHandl TranHdl    Lockname                   Type    Mode Conv Sts CoorEDU    AppName  AuthID   AppID
47       8          00020004000000000840000652 Row     ..X       G   5160       db2bp    VENUS    *LOCAL.venus.071207213730
46       2          00020004000000000840000652 Row     .NS       W   5913       db2bp    VENUS    *LOCAL.venus.071207213658

示例 3:显示锁定的表名和模式名称

您可以使用 db2pd -locks showlocks 命令显示应用程序持有的锁的表名和模式名。 可使用此信息来诊断包含应用程序锁定的表和模式。 TableNm 列和模式名称中显示的表名会显示在 SchemaNm 列中,如以下输出中所示:
Database Member 0 -- Database PDTEST -- Active -- Up 0 days 00:00:10 -- Date 2012-11-06-10.57.18.025767

Locks:
Address            TranHdl    Lockname                   Type         Mode Sts Owner      Dur HoldCount  Att        ReleaseFlg rrIID TableNm   SchemaNm 
0x00002AAAFFFA5F68 3          02000400000020000000000062 MdcBlockLock ..X  G   3          1   0          0x00200000 0x40000000 0     T1        YUQZHANG 02000400000020000000000062 SQLP_MDCBLOCK (obj={2;4}, bid=d(0;32;0), x0000200000000000)
0x00002AAAFFFA7198 3          41414141414A4863ADA1ED24C1 PlanLock     ..S  G   3          1   0          0x00000000 0x40000000 0     N/A       N/A      41414141414A4863ADA1ED24C1 SQLP_PLAN ({41414141 63484A41 24EDA1AD}, loading=0)
还可使用 db2pd -wlocks detail 命令来显示正在等待的锁定的表名、模式名称和应用程序节点,如以下输出中所示。
Database Member 0 -- Database PDTEST -- Active -- Up 0 days 00:00:35 -- Date 2012-11-06-11.11.32.403994

Locks being waited on :
AppHandl [nod-index] TranHdl    Lockname                    Type       Mode Conv Sts CoorEDU  AppName AuthID   AppID                        TableNm  SchemaNm AppNode 
19       [000-00019] 3          02000400000000000000000054  TableLock  ..X       G   18       db2bp   YUQZHANG *LOCAL.yuqzhang.121106161112 PDTEST   YUQZHANG hotel71 
21       [000-00021] 15         02000400000000000000000054  TableLock  .IS       W   45       db2bp   YUQZHANG *LOCAL.yuqzhang.121106161114 PDTEST   YUQZHANG hotel71 

示例 4:使用 -apinfo 参数来捕获有关锁定所有者和锁定等待者的详细运行时信息

以下样本输出的生成条件与示例 2 相同:
venus@boson:/home/venus =>db2pd -apinfo 47 -db pdtest

Database Partition 0 -- Database PDTEST -- Active -- Up 0 days 00:01:30

Application :
  Address :                0x0780000001676480
  AppHandl [nod-index] :   47       [000-00047]
  Application PID :        876558
  Application Node Name :  boson
  IP Address:              n/a
  Connection Start Time :  (1197063450)Fri Dec  7 16:37:30 2007
  Client User ID :         venus
  System Auth ID :         VENUS
  Coordinator EDU ID :     5160
  Coordinator Partition :  0
  Number of Agents :       1
  Locks timeout value :    4294967294 seconds
  Locks Escalation :       No
  Workload ID :            1
  Workload Occurrence ID : 2
  Trusted Context :        n/a
  Connection Trust Type :  non trusted
  Role Inherited :         n/a
  Application Status :     UOW-Waiting
  Application Name :       db2bp
  Application ID :         *LOCAL.venus.071207213730

  ClientUserID :           n/a
  ClientWrkstnName :       n/a
  ClientApplName :         n/a
  ClientAccntng :          n/a

  List of inactive statements of current UOW :
    UOW-ID :          2
    Activity ID :     1
    Package Schema :  NULLID
    Package Name :    SQLC2G13
    Package Version :
    Section Number :  203
    SQL Type :        Dynamic
    Isolation :       CS
    Statement Type :  DML, Insert/Update/Delete
    Statement :       insert into pdtest values 99


venus@boson:/home/venus =>db2pd -apinfo 46 -db pdtest

Database Partition 0 -- Database PDTEST -- Active -- Up 0 days 00:01:39

Application :
  Address :                0x0780000000D77A60
  AppHandl [nod-index] :   46       [000-00046]
  Application PID :        881102
  Application Node Name :  boson
  IP Address:              n/a
  Connection Start Time :  (1197063418)Fri Dec  7 16:36:58 2007
  Client User ID :         venus
  System Auth ID :         VENUS
  Coordinator EDU ID :     5913
  Coordinator Partition :  0
  Number of Agents :       1
  Locks timeou	t value :    4294967294 seconds
  Locks Escalation :       No
  Workload ID :            1
  Workload Occurrence ID : 1
  Trusted Context :        n/a
  Connection Trust Type :  non trusted
  Role Inherited :         n/a
  Application Status :     Lock-wait
  Application Name :       db2bp
  Application ID :         *LOCAL.venus.071207213658

  ClientUserID :           n/a
  ClientWrkstnName :       n/a
  ClientApplName :         n/a
  ClientAccntng :          n/a

  List of active statements :
   *UOW-ID :          3
    Activity ID :     1
    Package Schema :  NULLID
    Package Name :    SQLC2G13
    Package Version :
    Section Number :  201
    SQL Type :        Dynamic
    Isolation :       CS
    Statement Type :  DML, Select (blockable)
    Statement :       select * from pdtest

示例 5:在考虑锁定问题时使用调出脚本

要使用调出脚本,请查找 db2cos 输出文件。 该文件的位置由数据库管理器配置参数 diagpath 控制。 输出文件的内容将随您在 db2cos 脚本文件中输入的命令不同而有所变化。 db2cos 脚本文件包含 db2pd -db sample -locks 命令时提供的输出示例如下所示:
Lock Timeout Caught
Thu Feb 17 01:40:04 EST 2006
Instance DB2
Database: SAMPLE
Partition Number: 0
PID: 940
TID: 2136
Function: sqlplnfd
Component: lock manager
Probe: 999
Timestamp: 2006-02-17-01.40.04.106000
AppID: *LOCAL.DB2...
AppHdl:
...
Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:06:53
Locks:
Address    TranHdl Lockname                   Type Mode Sts Owner Dur HldCnt Att Rlse
0x402C6B30 3       00020003000000040000000052 Row  ..X  W*  3     1   0      0   0x40

在输出中,W* 指示发生超时的锁定。 在本例中,已发生锁定等待。 当锁定转换为更高级的方式时,也会发生锁定超时。 这由输出中的 C* 指示。

可以使用 db2cos 文件中的其他 db2pd 命令所提供的输出将结果映射至事务、应用程序、代理程序甚至 SQL 语句。 可以缩小输出范围或使用其他命令来收集需要的信息。 例如,可以使用 db2pd -locks wait 参数以便只打印处于等待状态的锁定。 另外,还可以使用 -app-agent 参数。

示例 6:将应用程序映射至动态 SQL 语句

db2pd -applications -dynamic 命令报告动态 SQL 语句的当前和最后一个锚点标识和语句唯一标识。 这允许直接从应用程序映射至动态 SQL 语句。

Applications:
Address            AppHandl [nod-index] NumAgents  CoorPid  Status
0x00000002006D2120 780      [000-00780] 1          10615    UOW-Executing

C-AnchID C-StmtUID  L-AnchID L-StmtUID  Appid
163      1          110      1          *LOCAL.burford.050202200412

Dynamic SQL Statements:
Address            AnchID StmtUID NumEnv NumVar NumRef NumExe Text
0x0000000220A02760 163    1       2      2      2      1      CREATE VIEW MYVIEW
0x0000000220A0B460 110    1       2      2      2      1      CREATE VIEW YOURVIEW

示例 7:监视内存使用情况

当您尝试了解内存使用情况时,db2pd -memblock 命令非常有用,如以下样本输出所示:

All memory blocks in DBMS set.

Address            PoolID   PoolName   BlockAge   Size(Bytes) I LOC   File
0x0780000000740068 62       resynch    2          112         1 1746  1583816485
0x0780000000725688 62       resynch    1          108864      1 127   1599127346
0x07800000001F4348 57       ostrack    6          5160048     1 3047  698130716
0x07800000001B5608 57       ostrack    5          240048      1 3034  698130716
0x07800000001A0068 57       ostrack    1          80          1 2970  698130716
0x07800000001A00E8 57       ostrack    2          240         1 2983  698130716
0x07800000001A0208 57       ostrack    3          80          1 2999  698130716
0x07800000001A0288 57       ostrack    4          80          1 3009  698130716
0x0780000000700068 70       apmh       1          360         1 1024  3878879032
0x07800000007001E8 70       apmh       2          48          1 914   1937674139
0x0780000000700248 70       apmh       3          32          1 1000  1937674139
...

接下来是已排序的“性能池”输出:

Memory blocks sorted by size for ostrack pool:
PoolID     PoolName   TotalSize(Bytes)     TotalCount LOC   File
57         ostrack    5160048              1          3047  698130716
57         ostrack    240048               1          3034  698130716
57         ostrack    240                  1          2983  698130716
57         ostrack    80                   1          2999  698130716
57         ostrack    80                   1          2970  698130716
57         ostrack    80                   1          3009  698130716
Total size for ostrack pool: 5400576 bytes

Memory blocks sorted by size for apmh pool:
PoolID     PoolName   TotalSize(Bytes)     TotalCount LOC   File
70         apmh       40200                2          121   2986298236
70         apmh       10016                1          308   1586829889
70         apmh       6096                 2          4014  1312473490
70         apmh       2516                 1          294   1586829889
70         apmh       496                  1          2192  1953793439
70         apmh       360                  1          1024  3878879032
70         apmh       176                  1          1608  1953793439
70         apmh       152                  1          2623  1583816485
70         apmh       48                   1          914   1937674139
70         apmh       32                   1          1000  1937674139
Total size for apmh pool: 60092 bytes
...

最后一部分输出对整个内存集的内存使用者进行排序:

All memory consumers in DBMS memory set:
PoolID     PoolName   TotalSize(Bytes)     %Bytes TotalCount %Count LOC   File
57         ostrack    5160048              71.90  1          0.07   3047  698130716
50         sqlch      778496               10.85  1          0.07   202   2576467555
50         sqlch      271784               3.79   1          0.07   260   2576467555
57         ostrack    240048               3.34   1          0.07   3034  698130716
50         sqlch      144464               2.01   1          0.07   217   2576467555
62         resynch    108864               1.52   1          0.07   127   1599127346
72         eduah      108048               1.51   1          0.07   174   4210081592
69         krcbh      73640                1.03   5          0.36   547   4210081592
50         sqlch      43752                0.61   1          0.07   274   2576467555
70         apmh       40200                0.56   2          0.14   121   2986298236
69         krcbh      32992                0.46   1          0.07   838   698130716
50         sqlch      31000                0.43   31         2.20   633   3966224537
50         sqlch      25456                0.35   31         2.20   930   3966224537
52         kerh       15376                0.21   1          0.07   157   1193352763
50         sqlch      14697                0.20   1          0.07   345   2576467555
...

您还可以在 UNIX 和 Linux 操作系统上报告专用内存的内存块。 例如,如果运行 db2pd -memb pid=159770,那么将生成类似如下的结果:

All memory blocks in Private set. 

PoolID     PoolName     BlockAge   Size(Bytes) I LOC   File 
88         private      1          2488        1 172   4283993058
88         private      2          1608        1 172   4283993058
88         private      3          4928        1 172   4283993058
88         private      4          7336        1 172   4283993058
88         private      5          32          1 172   4283993058
88         private      6          6728        1 172   4283993058
88         private      7          168         1 172   4283993058
88         private      8          24          1 172   4283993058
88         private      9          408         1 172   4283993058
88         private      10         1072        1 172   4283993058
88         private      11         3464        1 172   4283993058
88         private      12         80          1 172   4283993058
88         private      13         480         1 1534  862348285 
88         private      14         480         1 1939  862348285 
88         private      80         65551       1 1779  4231792244
Total set size: 94847 bytes

Memory blocks sorted by size:
PoolID     PoolName   TotalSize(Bytes)     TotalCount LOC   File      
88         private    65551                1          1779  4231792244
88         private    28336                12         172   4283993058
88         private    480                  1          1939  862348285 
88         private    480                  1          1534  862348285 
Total set size: 94847 bytes

示例 8:确定哪个应用程序耗尽表空间

通过使用 db2pd -tcbstats 命令,可以确定对表执行的插入操作次数。 以下示例显示用户定义的全局临时表(称为 TEMP1)的样本信息:

TCB Table Information:
TbspaceID TableID PartID MasterTbs MasterTab TableName  SchemaNm ObjClass DataSize  LfSize LobSize XMLSize
3         2       n/a    3         2         TEMP1      SESSION  Temp     966       0      0       0 

TCB Table Stats:
TableName Scans UDI PgReorgs NoChgUpdts Reads FscrUpdates Inserts Updates Deletes OvFlReads OvFlCrtes 
TEMP1     0     0   0        0          0     0           43968   0       0       0         0         

然后,可以使用 db2pd -tablespaces 命令获取表空间 3 的信息。 样本输出如下所示:

Tablespace 3 Configuration:
Type Content PageSz ExtentSz Auto Prefetch BufID BufIDDisk FSC RSE NumCntrs MaxStripe LastConsecPg Name
DMS  UsrTmp  4096   32       Yes  32       1     1         On  Yes 1        0         31           TEMPSPACE2

Tablespace 3 Statistics:
TotalPgs UsablePgs UsedPgs PndFreePgs FreePgs HWM  State      MinRecTime NQuiescers
5000     4960      1088    0          3872    1088 0x00000000 0          0          

Tablespace 3 Autoresize Statistics:
AS  AR  InitSize    IncSize     IIP MaxSize     LastResize      LRF
No  No  0           0           No  0           None            No  

Containers:
ContainNum Type    TotalPgs   UseablePgs StripeSet  Container 
0          File    5000       4960       0          /home/db2inst1/tempspace2a
MinRecTime 列返回一个值,此值为 UTC 时区格式的 UNIX 时间戳记。 要将值转换为 GMT 时区格式,可以使用 Db2 时间戳记函数。 例如,如果 MinRecTime 返回值 1369626329,那么要将此值转换为 GMT 格式,请运行以下语句:
db2 "values timestamp('1970-01-01-00.00.00') + 1369626329 seconds"
此查询将返回 GMT 值 2013-05-27-03.45.29.000000。

可查看是否在“已启用可回收空间 (RSE)”列中启用了可回收空间功能。 FreePgs 列表明空间已耗尽。 因为可用页数值下降,所以可用空间减少。 另请注意,FreePgs 值加上 UsedPgs 值将等于 UsablePgs 值。

在了解这一点之后,可以通过运行 db2pd -db sample -dyn 来确定正在使用表 TEMP1 的动态 SQL 语句:

Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:13:06

Dynamic Cache:
Current Memory Used           1022197
Total Heap Size               1271398
Cache Overflow Flag           0
Number of References          237
Number of Statement Inserts   32
Number of Statement Deletes   13
Number of Variation Inserts   21
Number of Statements          19

Dynamic SQL Statements:
AnchID StmtUID  NumEnv  NumVar  NumRef  NumExe  Text
78         1        2       2       3       2       declare global temporary table temp1 (c1 char(6)) not logged
253    1        1       1       24      24      insert into session.temp1 values('TEST')

最后,可以通过运行 db2pd -db sample -app 将以上输出中的信息映射到应用程序输出,以便确定应用程序。

Applications:
AppHandl [nod-index] NumAgents  CoorPid Status      C-AnchID C-StmtUID  
501      [000-00501] 1          11246   UOW-Waiting 0        0          

L-AnchID L-StmtUID  Appid
253      1          *LOCAL.db2inst1.050202160426

可以使用用于标识动态 SQL 语句的锚点标识(AnchID)值来标识相关联的应用程序。 结果表明,最后一个锚点标识(L-AnchID)值与锚点标识(AnchID)值相同。 一次运行 db2pd 产生的结果将在下一次运行 db2pd 时使用。

db2pd -agent 的输出将指示应用程序读取的行数(Rowsread 列)和写入的行数(Rowswrtn 列)。 这些值将显示应用程序已完成的部分及尚未完成的部分,如以下样本输出所示:
AppHandl [nod-index] AgentPid  Priority  Type  DBName
501      [000-00501] 11246     0         Coord SAMPLE

State       ClientPid  Userid   ClientNm Rowsread   Rowswrtn   LkTmOt
Inst-Active 26377      db2inst1 db2bp    22         9588       NotSet

您可以将运行 db2pd -agent 命令生成的 AppHandlAgentPid 的值映射到运行 db2pd -app 命令生成的 AppHandlCoorPiid 的相应值。

如果您怀疑内部临时表占满了表空间,那么这些步骤会稍有不同。 但是,仍然可以使用 db2pd -tcbstats 来标识具有最大插入数目的表。 以下是隐式临时表的样本信息:

TCB Table Information:
Address            TbspaceID TableID PartID MasterTbs MasterTab TableName          SchemaNm ObjClass    DataSize  ...     
0x0780000020CC0D30 1         2       n/a    1         2         TEMP (00001,00002) <30>     <JMC Temp   2470      ...
0x0780000020CC14B0 1         3       n/a    1         3         TEMP (00001,00003) <31>     <JMC Temp   2367      ...
0x0780000020CC21B0 1         4       n/a    1         4         TEMP (00001,00004) <30>     <JMC Temp   1872      ...

TCB Table Stats:
Address            TableName          Scans   UDI   PgReorgs   NoChgUpdts Reads   FscrUpdates Inserts ... 
0x0780000020CC0D30 TEMP (00001,00002) 0       0     0          0          0       0           43219   ...
0x0780000020CC14B0 TEMP (00001,00003) 0       0     0          0          0       0           42485   ...
0x0780000020CC21B0 TEMP (00001,00004) 0       0     0          0          0       0           0       ...

在此示例中,使用命名约定 TEMP (TbspaceID, TableID) 的表中有大量插入。 这些是隐式临时表。 SchemaNm 列中的值的命名约定为 AppHandl 的值与 SchemaNm 的值并置,这使得它能够标识正在工作的应用程序。

然后,您可以将该信息映射到 db2pd -tablespaces 的输出以查看表空间 1 的已用空间。 请注意以下输出中的表空间统计信息中的 UsedPgsUsablePgs 值之间的关系:

Tablespace Configuration:
Id Type Content PageSz ExtentSz Auto Prefetch BufID BufIDDisk FSC RSE NumCntrs MaxStripe LastConsecPg Name
1  SMS  SysTmp  4096   32       Yes  320      1     1         On  Yes 10       0         31           TEMPSPACE1

Tablespace Statistics:
Id TotalPgs   UsablePgs  UsedPgs    PndFreePgs FreePgs    HWM    State      MinRecTime NQuiescers
1  6516       6516       6516       0          0          0      0x00000000 0          0

Tablespace Autoresize Statistics:
Id AS  AR  InitSize    IncSize     IIP MaxSize     LastResize  LRF
1  No  No  0           0           No  0           None        No

Containers:
...

然后,可以使用命令 db2pd -app 标识应用程序句柄 30 和 31(因为它们出现在 -tcbstats 输出中):

Applications:
AppHandl [nod-index] NumAgents  CoorPid    Status          C-AnchID C-StmtUID  L-AnchID   L-StmtUID  Appid
31       [000-00031] 1          4784182    UOW-Waiting     0        0          107        1          *LOCAL.db2inst1.051215214142
30       [000-00030] 1          8966270    UOW-Executing   107      1          107        1          *LOCAL.db2inst1.051215214013

最后,将以上输出中的信息映射到通过运行 db2pd -dyn 命令获取的动态 SQL 输出:

Dynamic SQL Statements:
AnchID StmtUID    NumEnv     NumVar     NumRef     NumExe     Text
107    1          1          1          43         43         select c1, c2 from test group by c1,c2

示例 9:监视恢复

如果运行命令 db2pd -recovery,那么输出将显示多个计数器,这些计数器可用于验证是否正在执行恢复,如以下样本输出所示。 Current LogCurrent LSO 值提供日志位置。 CompletedWork 值是迄今为止已完成的字节数。

Recovery:
Recovery Status     0x00000401
Current Log         S0000005.LOG
Current LSN         0000001F07BC
Current LSO         000002551BEA
Job Type            ROLLFORWARD RECOVERY
Job ID              7
Job Start Time      (1107380474) Wed Feb  2 16:41:14 2005
Job Description     Database Rollforward Recovery
Invoker Type        User
Total Phases        2
Current Phase       1

Progress:
Address            PhaseNum Description StartTime                CompletedWork  TotalWork
0x0000000200667160 1        Forward     Wed Feb  2 16:41:14 2005 2268098 bytes  Unknown
0x0000000200667258 2        Backward    NotStarted               0 bytes        Unknown

示例 10:确定事务正在使用的资源量

如果运行命令 db2pd -transactions,那么输出会显示锁定数、第一个日志序号 (LSN)、最后一个 LSN、第一个 LSO、最后一个 LSO、已使用的日志空间量和保留的空间。 该输出还显示应用程序落实的总次数以及应用程序回滚的总次数。 知道应用程序落实和回滚的总次数对于了解事务行为会有用。 以下是 db2pd -transactions 命令的样本输出。

Transactions:
Address            AppHandl [nod-index] TranHdl  Locks  State  Tflag
0x000000022026D980 797      [000-00797] 2        108    WRITE  0x00000000
0x000000022026E600 806      [000-00806] 3        157    WRITE  0x00000000
0x000000022026F280 807      [000-00807] 4        90     WRITE  0x00000000

Tflag2     Firstlsn       Lastlsn        Firstlso        Lastlso
0x00000000 0x0000001A4212 0x0000001C2022 0x000001072262  0x0000010B2C8C
0x00000000 0x000000107320 0x0000001S3462 0x000001057574  0x0000010B3340
0x00000000 0x0000001BC00C 0x0000001X2F03 0x00000107CF0C  0x0000010B2FDE
LogSpace   SpaceReserved  TID            AxRegCnt   GXID
4518       95450          0x000000000451 1          0
6576       139670         0x0000000003E0 1          0
3762       79266          0x000000000472 1          0

Total Application commits   : 23
Total Application rollbacks : 39

示例 11:监视日志使用情况

命令 db2pd -logs 对于监视数据库的日志使用情况很有用。 通过使用Pages Written 值 (如以下样本输出中所示) ,您可以确定日志使用率是否在增加:

Logs:
Current Log Number            2
Pages Written                 846
Cur Commit Disk Log Reads     0
Cur Commit Total Log Reads    0
Method 1 Archive Status       Success
Method 1 Next Log to Archive  2
Method 1 First Failure        n/a
Method 2 Archive Status       Success
Method 2 Next Log to Archive  2
Method 2 First Failure        n/a
Log Chain ID                  0
Extraction Status             n/a
Current Log to Extract        n/a
Current LSO                   28672000
Current LSN                   0x00000022F032

Address             StartLSN         StartLSO       State      Size  Pages  Filename
0x000000023001BF58  0x00000022F032   0x000001B58000 0x00000000 1000  1000   S0000002.LOG
0x000000023001BE98  0x000000000000   0x000001F40000 0x00000000 1000  1000   S0000003.LOG
0x0000000230008F58  0x000000000000   0x000002328000 0x00000000 1000  1000   S0000004.LOG
通过使用此输出,可以标识两类问题:
  • 如果最近的日志归档失败,那么 Archive Status 将设置为值 Failure。 如果存在正在进行的归档故障,那么将完全阻止对日志进行归档, Archive Status 设置为值 First Failure
  • 如果日志归档正在非常缓慢地进行,那么 Next Log to Archive 值将低于 Current Log Number 值。 如果归档速度非常慢,那么可能表明活动日志的空间已耗尽,这将导致无法在数据库中进行任何数据更改。
注: S0000003.LOG 和 S0000004.LOG 尚未包含任何日志记录,因此 StartLSN 为 0x0

示例 12:查看综合系统列表

如果不使用显示以下样本输出的 db2pd -sysplex 命令,那么报告综合系统 (sysplex) 列表的唯一方法是使用 DB2 跟踪。

Sysplex List:
Alias:         HOST
Location Name: HOST1
Count:         1

IP Address      Port       Priority   Connections Status     PRDID
 1.2.34.56      400        1          0           0

示例 13:生成堆栈跟踪

您可以针对 Windows 操作系统使用 db2pd -stack all 命令或针对 UNIX 操作系统使用 -stack 命令,以对当前数据库分区中的所有进程生成堆栈跟踪。 如果您怀疑某个进程或线程正在循环或正被挂起,那么可能要反复使用此命令。

您可以通过发出命令 db2pd -stack eduid来获取特定引擎可分派单元 (EDU) 的当前调用堆栈,如以下示例中所示:

  Attempting to dump stack trace for eduid 137.
  See current DIAGPATH for trapfile.

如果需要所有 Db2 进程的调用堆栈,请使用命令 db2pd -stack all,例如 (在 Windows 操作系统上):

  Attempting to dump all stack traces for instance.
  See current DIAGPATH for trapfiles.

如果您正在使用具有多个物理节点的分区数据库环境,那么可以使用命令 db2_all "; db2pd -stack all"从所有分区获取信息。 但是,如果分区是同一机器上的所有逻辑分区,那么使用 db2pd -alldbp -stacks 时的速度会更快。

您还可以使用 dumpdir 参数将 db2sysc 进程的 db2pdb -stacks 命令输出重定向到特定目录路径。 可以使用 timeout 参数仅在特定持续时间内重定向输出。 例如,要将 db2sysc 进程中所有 EDU 的堆栈跟踪的输出重定向至 /home/waleed/mydir 并持续 30 秒,请发出以下命令:

db2pd -alldbp -stack all dumpdir=/home/waleed/mydir timeout=30

示例 14:查看数据库分区的实例内存统计信息

db2pd -dbptnmem 命令显示 DB2 服务器当前消耗的内存量,并在较高级别显示使用这些内存的服务器区域。 实例内存使用量不仅包括实际系统耗用/落实的内存,还包括已配置但可能未使用/落实的限额。 因此, Db2 实例的内存使用情况统计信息无法与操作系统监视工具报告的内存使用情况统计信息直接进行比较。

以下示例显示在 AIX® 机器上运行 db2pd -dbptnmem 的输出:

Database Partition Memory Controller Statistics

Controller Automatic: Y
Memory Limit:   122931408 KB
Current usage:     651008 KB
HWM usage:         651008 KB
Cached memory:     231296 KB
这些数据字段和列的描述如下:
控制器自动
指示内存控制器设置。 设置为“Y”(instance_memory 配置参数设置为 AUTOMATIC)时,仅当产品许可证包含内存限制时,才会强制实施计算的限制。 设置为“N”时,会强制实施声明的限制。
内存限制
如果强制实施了实例内存限制,那么 instance_memory 配置参数的值是可以耗用的实例内存的上限。
当前使用率
服务器当前耗用的实例内存量。
HWM 使用量
自激活数据库分区(在 db2start 命令运行时)以来消耗的内存高水位标记(HWM)或实例内存使用量峰值。
高速缓存的内存
当前使用量中可能已重新声明的内存量。 这适用于以下情况:实例内存使用量将达到强制实施的限制,或者可能需要降低一个或多个使用者的高速缓存使用量,以允许其他某个使用者的高速缓存使用量增长。

以下是在 AIX 操作系统上运行 db2pd -dbptnmem 的样本输出的延续:

Individual Memory Consumers:
Name           Mem Used (KB)   HWM Used (KB)   Cached (KB)
===========================================================
APPL-DBONE       160000          160000        159616 
DBMS-name         38528           38528          3776 
FMP_RESOURCES     22528           22528             0 
PRIVATE           13120           13120           740 
FCM_RESOURCES     10048           10048             0 
LCL-p606416         128             128             0 
DB-DBONE         406656          406656         67200
将列出 Db2 服务器中实例内存的所有已注册 使用者 以及他们所使用的实例内存总量。 各列的描述为如下所示:
姓名
实例内存使用者的简短专有名称,如以下名称:
APPL-dbname
为数据库 dbname 耗用的应用程序内存
DBMS-名称
全局数据库管理器内存需求
FMP_RESOURCES
db2fmps 进行通信所需的内存
PRIVATE
其他专用内存需求
FCM_RESOURCES
快速通信管理器资源
LCL-pid
用于与本地应用程序进行通信的内存段
数据库-dbname
为数据库 dbname 耗用的数据库内存
使用的内存(KB)
当前分配给使用者的实例内存量
使用的 HWM(KB)
使用者已耗用的高水位标记(HWM)或实例内存峰值
已高速缓存(KB)
在“使用的内存 (KB)”中,可能已为此使用者重新声明的实例内存量。

示例 15:监视索引重组的进度

DB2 V9.8 FP3 及更高版本的修订包中,索引重组的进度报告具有以下特征:
  • db2pd -reorgs index 命令报告分区索引的索引重组进度(FP1 引入了仅对非分区索引的提供支持)。
  • db2pd -reorgs index 命令支持在分区级别(也就是在单个分区的重组期间)监视索引重组。
  • 非分区索引和分区索引的重组进度在不同的输出中报告。 一个输出显示非分区索引的重组进度,以下输出显示了每个表分区上分区索引的重组进度;在每个输出中仅报告一个分区的索引重组统计信息。
  • 将首先处理分分区索引,然后以串行方式处理分区索引。
  • db2pd -reorgs index 命令在分区索引的输出中显示以下附加信息:
    • MaxPartition-正在处理的表的分区总数。 对于分区级别重组,MaxPartition将始终具有值 1 ,因为仅重组单个分区。
    • PartitionID-正在处理的分区的数据分区标识。
以下示例显示使用 db2pd -reorgs index 命令(该命令报告带有 2 个分区的范围分区表的索引重组进度)获取的输出:
注: 第一个输出报告非分区索引的索引重组统计信息。 以下输出报告了每个分区上分区索引的索引重组状态。
Index Reorg Stats:
Retrieval Time: 02/08/2010 23:04:21
TbspaceID: -6       TableID: -32768
Schema: ZORAN    TableName: BIGRPT
Access: Allow none
Status: Completed
Start Time: 02/08/2010 23:03:55   End Time: 02/08/2010 23:04:04
Total Duration: 00:00:08
Prev Index Duration:  -
Cur Index Start: -
Cur Index: 0            Max Index: 2            Index ID: 0
Cur Phase: 0          ( -     )   Max Phase: 0
Cur Count: 0                      Max Count: 0
Total Row Count: 750000
Retrieval Time: 02/08/2010 23:04:21
TbspaceID: 2        TableID: 5
Schema: ZORAN    TableName: BIGRPT
PartitionID: 0      MaxPartition: 2
Access: Allow none
Status: Completed
Start Time: 02/08/2010 23:04:04   End Time: 02/08/2010 23:04:08
Total Duration: 00:00:04
Prev Index Duration:  -
Cur Index Start: -
Cur Index: 0            Max Index: 2            Index ID: 0
Cur Phase: 0          ( -     )   Max Phase: 0
Cur Count: 0                      Max Count: 0
Total Row Count: 375000
Retrieval Time: 02/08/2010 23:04:21
TbspaceID: 2        TableID: 6
Schema: ZORAN    TableName: BIGRPT
PartitionID: 1      MaxPartition: 2
Access: Allow none
Status: Completed
Start Time: 02/08/2010 23:04:08   End Time: 02/08/2010 23:04:12
Total Duration: 00:00:04
Prev Index Duration:  -
Cur Index Start: -
Cur Index: 0            Max Index: 2            Index ID: 0
Cur Phase: 0          ( -     )   Max Phase: 0
Cur Count: 0                      Max Count: 0
Total Row Count: 375000

示例 16:显示耗费处理器时间最多的几个 EDU 并显示 EDU 堆栈信息

如果发出带有 -edus 参数选项的 db2pd 命令,那么输出将列出所有引擎可分派单元 (EDU)。 可以在您指定的详细程度级别(例如,在实例级别或成员级别)返回 EDU 的输出。 仅在 Linux 和 UNIX 操作系统上,还可以指定 interval 参数子选项,以便生成所有 EDU 的两个快照,并以您指定的时间间隔分隔。 指定 interval 参数时,输出中的两个附加列指示处理器用户时间增量 (USR DELTA列) 和处理器系统时间增量 (SYS DELTA列)。

在以下示例中,将在 5 秒的时间间隔内给出处理器用户时间和处理器系统时间的增量:

$ db2pd -edus interval=5

Database Partition 0 -- Active -- Up 0 days 00:53:29 -- Date 06/04/2010 03:34:59

List of all EDUs for database partition 0

db2sysc PID: 1249522
db2wdog PID: 2068678

EDU ID    TID  Kernel TID EDU Name                        USR        SYS       USR DELTA  SYS DELTA
===================================================================================================
6957      6957 13889683   db2agntdp (SAMPLE  ) 0          58.238506  0.820466  1.160726   0.014721
6700      6700 11542589   db2agent (SAMPLE) 0             52.856696  0.754420  1.114821   0.015007
5675      5675 4559055    db2agntdp (SAMPLE  ) 0          60.386779  0.854234  0.609233   0.014304
3088      3088 13951225   db2agntdp (SAMPLE  ) 0          80.073489  2.249843  0.499766   0.006247
3615      3615 2887875    db2loggw (SAMPLE) 0             0.939891   0.410493  0.011694   0.004204
4900      4900 6344925    db2pfchr (SAMPLE) 0             1.748413   0.014378  0.014343   0.000103
7986      7986 13701145   db2agntdp (SAMPLE  ) 0          1.410225   0.025900  0.003636   0.000074
2571      2571 8503329    db2ipccm 0                      0.251349   0.083787  0.002551   0.000857
7729      7729 14168193   db2agntdp (SAMPLE  ) 0          1.717323   0.029477  0.000998   0.000038
7472      7472 11853991   db2agnta (SAMPLE) 0             1.860115   0.032926  0.000860   0.000012
3358      3358 2347127    db2loggr (SAMPLE) 0             0.151042   0.184726  0.000387   0.000458
515       515  13820091   db2aiothr 0                     0.405538   0.312007  0.000189   0.000178
7215      7215 2539753    db2agntdp (SAMPLE  ) 0          1.165350   0.019466  0.000291   0.000008
6185      6185 2322517    db2wlmd (SAMPLE) 0              0.061674   0.034093  0.000169   0.000100
6442      6442 2756793    db2evmli (DB2DETAILDEADLOCK) 0  0.072142   0.052436  0.000092   0.000063
4129      4129 15900799   db2glock (SAMPLE) 0             0.013239   0.000741  0.000064   0.000001
2         2    11739383   db2alarm 0                      0.036904   0.028367  0.000009   0.000009
4386      4386 13361367   db2dlock (SAMPLE) 0             0.015653   0.001281  0.000014   0.000003
1029      1029 15040579   db2fcms 0                       0.041929   0.016598  0.000010   0.000004
5414      5414 14471309   db2pfchr (SAMPLE) 0             0.000093   0.000002  0.000000   0.000000
258       258  13656311   db2sysc 0                       8.369967   0.263539  0.000000   0.000000
5157      5157 7934145    db2pfchr (SAMPLE) 0             0.027598   0.000177  0.000000   0.000000
1543      1543 2670647    db2fcmr 0                       0.004191   0.000079  0.000000   0.000000
1286      1286 8417339    db2extev 0                      0.000312   0.000043  0.000000   0.000000
2314      2314 14360813   db2licc 0                       0.000371   0.000051  0.000000   0.000000
5928      5928 3137537    db2taskd (SAMPLE) 0             0.004903   0.000572  0.000000   0.000000
3872      3872 2310357    db2lfr (SAMPLE) 0               0.000126   0.000007  0.000000   0.000000
4643      4643 11694287   db2pclnr (SAMPLE) 0             0.000094   0.000002  0.000000   0.000000
1800      1800 5800175    db2extev 0                      0.001212   0.002137  0.000000   0.000000
772       772  7925817    db2thcln 0                      0.000429   0.000072  0.000000   0.000000
2057      2057 6868993    db2pdbc 0                       0.002423   0.001603  0.000000   0.000000
2828      2828 10866809   db2resync 0                     0.016764   0.003098  0.000000   0.000000

要仅提供有关耗费处理器时间最多的几个 EDU 的信息以及要减少返回的输出数量,您可以进一步包括 top 参数选项。 在以下示例中,将仅返回前 5 个 EDU,时间间隔为 5 秒。 还将返回堆栈信息,可以单独在由 DUMPDIR 指定的目录路径(缺省为 diagpath)中找到此信息。

$ db2pd -edus interval=5 top=5 stacks

Database Partition 0 -- Active -- Up 0 days 00:54:00 -- Date 06/04/2010 03:35:30

List of all EDUs for database partition 0

db2sysc PID: 1249522
db2wdog PID: 2068678

EDU ID    TID            Kernel TID     EDU Name                USR          SYS         USR DELTA    SYS DELTA
===============================================================================================================
3358      3358           2347127        db2loggr (SAMPLE) 0     0.154906     0.189223    0.001087     0.001363
3615      3615           2887875        db2loggw (SAMPLE) 0     0.962744     0.419617    0.001779     0.000481
515       515            13820091       db2aiothr 0             0.408039     0.314045    0.000658     0.000543
258       258            13656311       db2sysc 0               8.371388     0.264812    0.000653     0.000474
6700      6700           11542589       db2agent (SAMPLE) 0     54.814420    0.783323    0.000455     0.000310


$ ls -ltr
total 552
drwxrwxr-t    2 vbmithun build         256 05-31 09:59 events/
drwxrwxr-t    2 vbmithun build         256 06-04 03:17 stmmlog/
-rw-r--r--    1 vbmithun build       46413 06-04 03:35 1249522.3358.000.stack.txt
-rw-r--r--    1 vbmithun build       22819 06-04 03:35 1249522.3615.000.stack.txt
-rw-r--r--    1 vbmithun build       20387 06-04 03:35 1249522.515.000.stack.txt
-rw-r--r--    1 vbmithun build       50426 06-04 03:35 1249522.258.000.stack.txt
-rw-r--r--    1 vbmithun build      314596 06-04 03:35 1249522.6700.000.stack.txt
-rw-r--r--    1 vbmithun build       94913 06-04 03:35 1249522.000.processObj.txt

示例 17:显示代理程序事件指标

db2pd 命令支持返回代理程序的事件指标。 如果您需要确定某个代理程序在特定时间段是否更改了状态,那么将事件选项与 -agents 参数一起使用。 返回的 AGENT_STATE_LAST_UPDATE_TIME(记号值)列显示上次由代理程序处理的事件已更改。 结合以前获得的 AGENT_STATE_LAST_UPDATE_TIME(记号值)值,您可以确定某个代理程序是否已移动到新任务,或在较长的时间段内它是否继续处理相同的任务。

db2pd -agents event
Database Partition 0 -- Active -- Up 0 days 03:18:52 -- Date 06/27/2011 11:47:10

Agents:
Current agents:      12
Idle agents:         0
Active coord agents: 10
Active agents total: 10
Pooled coord agents: 2
Pooled agents total: 2

AGENT_STATE_LAST_UPDATE_TIME(Tick Value)         EVENT_STATE  EVENT_TYPE  EVENT_OBJECT  EVENT_OBJECT_NAME
2011-06-27-14.44.38.859785(5622972377924968075)  IDLE         WAIT        REQUEST       n/a 

示例 18:显示扩展数据块移动状态

您可以通过发出 db2pd -extentmovement -db dbName 命令来显示表空间的扩展数据块移动状态。
$ db2pd -extentmovement -db PDTEST

Database Member 0 -- Database PDTEST -- Active -- Up 0 days 00:04:33 -- Date 2012-10-26-11.19.52.056414

Extent Movement:
Address            TbspName Current Last Moved Left TotalTime            
0x00002AAB356D4BA0 DAVID    1168    1169 33    426  329636