Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104909804
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909805
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909806
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909807
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909808
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909809
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909810
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909811
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909812
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909813
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909804
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909815
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909816
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909817
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909818
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909819
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909820
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909821
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909822
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909823
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909824
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909825
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909826
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909827
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909828
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909819
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909830
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909831
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909832
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909833
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909834
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909835
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909836
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909837
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909838
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909839
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909840
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909841
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909842
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909843
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909834
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909845
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909846
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909847
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909848
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909849
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909850
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909851
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909852
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909853
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909854
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 4 部分: 监控 DB2 活动(3)-sdccf-ChinaUnix博客
  • 博客访问: 104909855
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:25:07

developerWorks



捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44342) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44341) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44340) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44339) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44338) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44337) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44336) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44335) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44333) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44332) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44331) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44330) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44328) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44327) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44326) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44325) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44324) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44323) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44322) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44321) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44320) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44319) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44318) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44317) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44316) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44315) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44314) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44312) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44311) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44310) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44309) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44308) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44307) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44306) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44304) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44303) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44302) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44299) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44296) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44295) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44294) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44293) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44292) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


捕获事件监控数据

通过上面的内容,您已经看到,快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。



事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。







您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

 CREATE EVENT MONITOR [Name]
FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS  |
    CONNECTIONS  | 
    STATEMENTS   |
    TRANSACTIONS  , ...]
WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]
[MANUALSTART | AUTOSTART]

其中:

  • Name 表示指派给所创建的事件监控器的名称。
  • EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。
  • GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。
  • TableName 表示为所有事件监控数据将写入的数据库表指派的名称。
  • PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。
  • DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

 CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。







若您在创建事件监控器时,指定了 AUTOSTART 选项,监控器将于包含事件监控器的数据库启动时自动启动。(在使用 ACTIVATE DATABASE 命令激活或第一个与数据库的连接建立起来时,数据库就会启动。)若您使用了 MANUALSTART 选项或未指定任何选项(在这种情况下,默认使用 MANUALSTART),则得到的事件监控器在启动之前不会收集任何监控数据。事件监控器可通过执行 SET EVENT MONITOR SQL 语句启动(和停止)。该语句的基本语法是:

SET EVENT MONITOR [MonitorName] STATE <=> [MonitorState]

其中,MonitorName 表示状态将被更改的事件监控器的名称,MonitorState 表示将被设置的特定事件监控器的状态。要启动事件监控器(也就是说,将其置于 “活动” 状态),您必须为 MonitorState 参数指定 1 值。要停止事件监控器(也就是说,将其置于 “非活动” 状态),则需指定 0 值。

假设您希望启动一个名为 CONN_EVENTS 的事件监控器,该事件监控器在创建时使用了 MANUALSTART 选项。可通过以下语句完成这一任务:

SET EVENT MONITOR CONN_EVENTS STATE 1

另一方面,如果您希望停止 CONN_EVENTS 事件监控器,可执行以下语句:

SET EVENT MONITOR CONN_EVENTS STATE 0

另外一种启动和停止事件监控器的方法是:在 Control Center 中高亮显示恰当的事件监控器名称,并在 Event Monitors 菜单选择一个活动(Start Event Monitoring 或 Stop Event Monitoring)。

SQL 函数 EVENT_MON_STATE 可用于确定任何为一个数据库定义的事件监控器的当前状态。此函数必须在一个查询中使用,如下所示:

SELECT EVENT_MON_STATE('CONN_EVENTS') FROM SYSIBM.SYSDUMMY1

(在本示例中,表 SYSIBM.SYSDUMMY1 是一个空表,通常是作为占位符使用的。)

启动之后,事件监控器即安静地在后台运行,等待该监控器设计用于监控的事件或事务之一发生。当此类事件或事务出现时,事件监控器将收集所有恰当的监控数据,并将其写入监控器的输出目标位置(表、目录或命名管道)。事件或事务本身控制收集监控数据的时机,DBA 不需执行任何额外的操作(这与使用快照监控器的情况不同)。







有时,记录生成频率较低的事件监控器(例如为监控 DATABASE 事件而设计的监控器)可包含某些位于内存中的事件监控数据,这些数据尚未写入事件监控器的目标位置(由于仅存在一条部分事件记录)。为检查事件监控器的活动内部缓冲区的内容,可执行 FLUSH EVENT MONITOR SQL 语句。该语句的基本语法是:

FLUSH EVENT MONITOR [MonitorName] 

其中,MonitorName 表示您希望强制其将活动内部缓冲区的内容写入目标位置的事件监控器(以名称表示)。

要强制一个名为 CONN_EVENTS 的事件监控器将其活动内部缓冲区的内容写入目标位置,可执行 FLUSH EVENT MONITOR 语句,如下所示:

FLUSH EVENT MONITOR CONN_EVENTS

默认情况下,已写入事件监控器目标位置的记录会过早地记录到事件监控器的日志中,并被指派给一个部分记录标识符。但若您在执行 FLUSH EVENT MONITOR 语句时指定了 BUFFER 选项,则仅将事件监控器活动内部缓冲区中显示的监控数据写入事件监控器的目标位置。不会将任何部分记录记入事件监控器日志。

务必注意,刷新事件监控器,计数器并不会重置。因而在事件监控器被正常触发时,即便 FLUSH EVENT MONITOR 语句尚未执行,应该生成的事件监控记录依然会生成。







在上文中,您已经了解到事件监控数据可写入以下三个位置之一:

  1. 文件。事件监控器输出可写入一个或多个文件。有两个参数控制可用空间容量(MAXFILESIZE and MAXFILES),一旦达到空间容量极限,事件监控器将自动刷新所有事件,并自行停止。两个参数的默认设置均为 NONE,这表示没有任何空间容量限制。
  2. 管道。事件监控器输出可写入命名管道。必须供管道的名称,但在创建事件监控器时,命名管道本身不必存在。但在事件监控器被激活时,命名管道必须已存在。
  3. 表。事件监控器输出可写出到数据库中已有的一个或多个表。事件监控器中的各监控元素映射到同名表中。各单独事件的数据将被插入适当的表中,作为单独的一行。

有时,您可能希望查看一个事件监控器已收集到的数据。若收集到的数据写入命名管道,则通常由管道接收端的应用程序负责显示接收到的监控数据。若收集到的数据写入表或一组文件中,您可使用 Event Analyzer 及事件监控器生产力工具这两种特殊实用工具之一来查看数据。

Event Analyzer 是一种 GUI 工具,要激活此工具,在 Control Center 中高亮显示所需事件监控器,并从 Event Monitors 菜单中选择恰当的活动即可;也可执行 db2eva 命令。激活之后,Event Analyzer 将使您深入研究及查看特定事件监控器捕获的信息。图 1 展示了 Event Analyzer 在首次被激活时的典型外观。



Event Analyzer

Event Analyzer 仅可用于查看收集并存储在数据库表中的事件监控数据。要查看写入文件(和命名管道)中的事件监控数据,您必须使用基于文本的事件监控器生产力工具,此工具将从事件监控器数据文件或命名管道中检索信息,并生成一份格式化的报告。(事件监控器文件和命名管道包含逻辑数据分组的二进制流,必须首先予以格式化,然后才能显示。)

为激活事件监控器生产力工具,可执行 db2evmon 命令。该命令的基本语法如下所示:

db2evmon -db [DatabaseAlias] -evm [MonitorName]

其中,DatabaseAlias 表示定义了要显示其数据的事件监控器的数据库(按别名形式表示);MonitorName 表示要显示其数据的事件监控器的名称。

或:

db2evmon -path [MonitorTarget]

其中,MonitorTarget 表示指定事件监控器已收集的数据所存储的位置(目录或命名管道)。

例如,要格式化并显示名为 CONN_EVENT 的事件监控器收集到的所有数据,且此事件监控器是在名为 SAMPLE 的数据库中定义的,可执行以下命令(假设监控数据写入一个文件):

db2evmon -db SAMPLE -evm CONN_EVENTS

假设使用以下 SQL 语句创建了名为 CONN_EVENTS 的事件监控器:

CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO FILE 'C:\MONDATA' AUTOSTART

再假设已经有一个应用程序建立了与 SAMPLE 数据库的连接(这致使事件监控器开始捕获并生成监控数据),那么在使用事件监控器生产力工具来检查数据时,生成的输出结果形式如下。



                    
Reading C:\mondata\00000000.EVT ...

--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONN_EVENTS
  Server Product ID: SQL09000
  Version of event monitor data: 8
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: DB2
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:40.086671
  Event Monitor Start time:   06/22/2006 00:56:40.662668
--------------------------------------------------------------------------

3) Connection Header Event ...
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2bp.exe
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.086671

4) Connection Event
  Appl Handle: 55
  Appl Id: *LOCAL.DB2.060622045634
  Appl Seq number: 00003

  Record is the result of a flush: FALSE

  Application Status: SQLM_DISCONNECTPEND

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 1
  Rollback SQL statements: 0
  Dynamic SQL statements: 1
  Static SQL stmts: 1
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 0
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 1
  Package Cache Inserts: 0
  Section Lookups: 1
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Other Memory
     Current size (bytes): 458752
     High water mark (bytes): 720896
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Heap
     Current size (bytes): 196608
     High water mark (bytes): 196608
     Configured size (bytes): 1245184

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.496766

5) Connection Header Event ...
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2taskd
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.650597

6) Connection Header Event ...
  Appl Handle: 56
  Appl Id: *LOCAL.DB2.060622045640
  Appl Seq number: 00001
  DRDA AS Correlation Token: *LOCAL.DB2.060622045634
  Program Name    : db2stmm
  Authorization Id: RSANDERS
  Execution Id    : RSANDERS
  Codepage Id: 1252
  Territory code: 0
  Client Process Id: 1992
  Client Database Alias: SAMPLE
  Client Product Id: SQL09000
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: rsanders-lxp
  Connect timestamp: 06/22/2006 00:56:40.640740

7) Connection Event
  Appl Handle: 57
  Appl Id: *LOCAL.DB2.060622045641
  Appl Seq number: 00001

  Record is the result of a flush: FALSE

  Application Status: SQLM_COMMIT_ACT

 Lock Statistics:
  Lock Waits: 0
  Total time waited on locks (milliseconds): 0
  Deadlocks: 0
  Lock escalations: 0
  X lock escalations: 0
  Lock timeouts: 0

 Sort Statistics:
  Sorts: 0
  Total sort time (milliseconds): 0
  Sort overflows: 0

 Hash Statistics:
  Hash Joins: 0
  Hash Loops: 0
  Hash Join Small Overflows: 0
  Hash Join Overflows: 0

 Buffer Pool Statistics:
  Buffer pool data logical page reads: 0
  Buffer pool data physical page reads: 0
  Buffer pool temporary data logical page reads: 0
  Buffer pool temporary data physical page reads: 0
  Buffer pool data page writes: 0
  Buffer pool index logical page reads: 0
  Buffer pool index physical page reads: 0
  Buffer pool temporary index logical page reads: 0
  Buffer pool temporary index physical page reads: 0
  Buffer pool index page writes: 0
  Buffer pool xda logical page reads: 0
  Buffer pool xda physical page reads: 0
  Buffer pool temporary xda logical page reads: 0
  Buffer pool temporary xda physical page reads: 0
  Buffer pool xda page writes: 0
  Buffer pool read time (milliseconds): 0
  Buffer pool write time (milliseconds): 0
  Time spent waiting for a prefetch: 0 milliseconds
  Unread prefetch pages: 0

 Workspace Statistics:
  Shared workspace high water mark: 0
  Total shared workspace overflows: 0
  Total shared workspace section lookups: 0
  Total shared workspace section inserts: 0
  Private workspace high water mark: 0
  Total private workspace overflows: 0
  Total private workspace section lookups: 0
  Total private workspace section inserts: 0

 Direct I/O Statistics:
  Sectors read directly: 0
  Sectors written directly: 0
  Direct read requests: 0
  Direct write requests: 0
  Direct read time: 0
  Direct write time: 0

 SQL Statement counts
  Commit SQL statements: 0
  Rollback SQL statements: 0
  Dynamic SQL statements: 0
  Static SQL stmts: 0
  Failed SQL statements: 0
  Select SQL statements: 0
  Xquery statements: 0
  Data Definition Language SQL statements: 0
  Update/Insert/Delete SQL statements: 0

 Internal counts
  Internal auto rebinds: 0
  Internal rows deleted: 0
  Internal rows updated: 0
  Internal rows inserted: 0
  Internal commits: 1
  Internal rollbacks: 0
  Internal rollbacks due to deadlock: 0

 Row counts
  Rows deleted: 0
  Rows inserted: 0
  Rows updated: 0
  Rows selected: 0
  Rows read: 0
  Rows written: 0
  Binds/Precompiles: 0
  Rejected block cursor requests: 0
  Accepted block cursor requests: 0

 Package Cache Statistics
  Package Cache Lookups: 0
  Package Cache Inserts: 0
  Section Lookups: 0
  Section Inserts: 0

 Catalog Cache Statistics
  Catalog Cache Overflows: 0
  Catalog Cache High Water Mark: 0
  Catalog Cache Lookups: 0
  Catalog Cache Inserts: 0

 CPU times
  User CPU time: 0.000000 seconds
  System CPU time: 0.000000 seconds

 Memory usage:

   Memory Pool Type:  Application Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 1245184

   Memory Pool Type:  Other Memory
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 2145386496

   Memory Pool Type:  Application Control Heap
     Current size (bytes): 65536
     High water mark (bytes): 65536
     Configured size (bytes): 655360

 Disconnection Time: 06/22/2006 00:56:47.514160

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:56:53.123490
  Event Monitor Start time:   06/22/2006 00:56:53.522110
--------------------------------------------------------------------------

--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00002\
  First connection timestamp: 06/22/2006 00:57:36.727014
  Event Monitor Start time:   06/22/2006 00:57:37.223404
--------------------------------------------------------------------------







事件监控器应仅用于监控特定事件或简单工作负载。事件监控器设计用于提供能帮助诊断数据库/应用程序的问题或异常行为的特定信息。

与快照不同,事件监控器对性能有极严重的影响。这是由各事件对象写出的信息导致的。此外,SQL 语句事件监控器对性能的影响更加严重,原因在于每次执行查询时给数据库引擎带来的所有那些额外的工作:DB2 Database Manager 不能简单地执行查询,还必须生成并记录与该查询相关的所有特征以及运行时信息。若此类信息要写入文本文件,则执行速度会更慢。

至于文件,在创建将数据写入文件的事件监控器时,限制文件大小是个好办法,这样可以控制事件监控器输出占用的磁盘空间。否则,若您正在监控一个大容量的 OLTP 系统,输出将很快发展为数百兆字节。

事件监控器最常见的用途之一就是捕获死锁信息。(死锁事件监控器不会写出大量数据,并且触发得不是那么频繁,因此在使用这种监控器时,不设置文件大小限制是可以接受的。)如果不使用事件监控器,想准确确定死锁循环中涉及到哪些锁和应用程序几乎是不可能的。死锁事件监控器将在死锁循环发生时,收集所有应用程序及其锁的相关信息。借助于这些信息,即可准确监控到导致死锁循环的那条 SQL 语句,也可更改此语句以补救这一问题。不要忘记,DB2 标记为导致死锁的原因的应用程序就是死锁循环中包含的最后一个应用程序 —— 而导致死锁的实际原因很有可能是更早时由另一应用程序启动的事务。务必确保检查涉及到的所有锁和应用程序,从而正确地确定出问题的根源。

事件监控器的常见用途之二就是跟踪 SQL 语句处理。SQL 语句事件监控器非常有用,因为它可捕获动态和静态 SQL 语句。若应用程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么这种特性非常关键。在使用事件监控器捕获关于执行的每一条 SQL 语句的信息时,各语句的属性(例如读取、选择、删除的行数等)将被记录下来,若捕获了快照,则这些内容不会作为整体的一部分展示出来。此外,由于执行时间桢和启动与停止时间也被记录下来,对于事务、一个应用程序执行的 SQL 将怎样影响其他应用程序的 SQL 执行的详细分析即可进行。但由于所生成的信息容量以及运行 SQL 语句监控器带来的性能开销,此类监控应仅用于短期测试或问题判断,不应该用于实际生产环境中。

阅读(44291) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~