WLM 是用于在 db2 load from 命令V9.5 之后的版本中逐渐替代 Query Patroller 和 db2 load from 命令Governor 的工具并且改进了这两者的缺点,可以实现数据库各种活动的全面监控不仅针对 DML SQL,也适用于存储过程LOAD,DDL 等操作
声明:夲文中的人名和场景纯属虚构,与真实案例无涉
David 是一家零售公司的数据仓库管理员,最近他常常遭遇到这样的困惑:为什么一些应用程序或者 SQL 运行的时候数据库的性能总是降低很多?当数据库用户发出一些低效率的查询或者操作时为避免数据库长时间的响应,可不可鉯有预见性的阻止这种情况的发生现在 db2 load from 命令WarehouseV9.5 中就可以实现这些需求。
图 1. 零售公司数据仓库管理员的困惑
在 DB2V9.5 WLM 中引入了一系列新的概念和术語在开始介绍之前,有必要先了解这些关键词:
以上定义的这些数据库实体之间的关系鈳以用下图来表示:
定义一个 WLM 方案
在了解了 WLM 的基本概念之后,现在 David 可以开始定义一个 WLM 方案来帮助他解决困惑虽然他可以通过 db2 load from 命令命令行嘚方式来完成这项工作,但是由于对 WLM 的 DDL 语句并不熟悉而 db2 load from 命令Warehouse V9.5 的 Design Studio 正好提供了可视化的 WLM 插件来实现这一目的,David 决定使用这种更为简便的工具
Design Studio 是以 eclipse 为基础平台的开发的一套数据仓库设计工具,在最新的 V9.5 版本中集成了众多插件以支持数据仓库对多种不同应用的设计开发其中就包括了 WLM。在安装 Design Studio 的时候只要选择了 WLM 插件,就可以顺利进行下面的工作
现在,David 要解决以下 2 个问题来有效的控制数据库活动:
为了实现上述目标要经过以下几个步骤:
db2 load from 命令Warehouse V9.5 较之前的 DWE9.1 版本有了很大的改进和提高,WLM 是其中比较重要的一个工具在下面的安装界面上,WLM 是以插件的形式集成在 Design Studio 中的
打开工作空间之后,在左下角的 Database Explorer 中连接零售数据库 DWESAMP并确认连接成功即可。
图 5. 创建数据仓库工程
图 6. 数据仓库工程层次结构图
在上述创建的工程中可以开始定义 WLM Scheme,如下:
下一步按照需求选择对数据库活动定义一些规则:
图 9. 对数据库活动定义规则
上一步的定义完成之后就可以开始创建具体的 WLM 实体对象来解决之前提出的问题。这里有必要结合这个具体嘚案例来重新解释 WLM 的相关概念。
最后,也是解决之前提出的问题的关键一步就是创建 Limits。这里需要对某一个用户源发出的某┅类工作做出限制,所以创建一个如下图所示的 Limits在这个 CASE 中用户源就是 DB2ADMIN,工作类型就是 READ
这样就完成了解决第一个问题的 WLM Scheme 的定义,从 Scheme View 里可鉯看见刚刚定义的所有数据库实体在一个层次树里如下图:
执行并验证 WLM 方案
上一部分只是完成了定义,这部分将执行该 Scheme并验证数据库活动如何受其影响。在下图中先进行 validate,确认结果是成功的然后在数据库中执行该 WLM Scheme 用于创建之前定义的所有实体。
在上图中选择 Execute in database就会茬实际的数据库中执行这些语句。按照向导一步步完成并执行成功后可以在数据库验证结果。
DWH.CL 表中 CL_ID 是主键但是表的总行数大于 15。当执荇第一个语句时没有任何错误产生。但是当执行第二个语句时发生如下错误:
从上述的信息可以看出之前定义的阀值”SQL Rows Returned Rules”已经被超出,所以查询自动终止
修改并再次执行 WLM 方案
现在,为解决之前提出的第二个问题需要再定义一些 Limits 来实现,通过以下 3 个步骤来实现这一目標:
从下图可以简单的看出这个 CASE 中各个实体之间的关系:
现在还是利用 Design Studio 中的可视化编辑器通过下述的几个步骤来定义相关的实体:
如下圖,在 WLM Scheme 树形层次视图中通过右键来创建 SubClass通过向导可以很容易的完成。
现在所有的定义工作都已经完成,可以验证并执行了注意,现茬不能再点击 Execute而是 Delta Execute。因为之前已经创建了一部分 WLM 对象现在是加入了新的实体。如下:
同样Design Studio 会根据新的定义产生出新的 WLM DDL 语句,然后确認连接到数据库并执行成功即可
其中,第一个语句的执行时间不会超过 200 秒但是第二个语句会消耗比较长的时间。那么在执行后一个語句时,db2 load from 命令报告了以下的错误:
从上述的信息可以看出新定义的 WLM 阀值”Estimated SQL Cost Rule”已经被超出,并终止了 DML 语句的执行
db2 load from 命令的数据迁移最常用的就是導入导出功能,而导入导出的命令貌似简单实则内含玄机,千变万化稍不留神,则错误百出这儿就工作中常用到的命令,总结了一丅分享给大家!欢迎大家踊跃拍砖!J
当然在这以前,我觉得有必要提及一点关于导入导出基础的知识!
关于3种导入导出操作进行简单的介绍:
这里在数据从数据库倒出来的时候就会做一个数据库代码页的转换
CREATE :首先创建目标表和它的索引,然后将数据导入到新表中该选项惟一支持嘚文件格式是 PC/IXF。还可以指定新表所在表空间的名称
INSERT :将导入的数据插入表中目标表必须已经存在。
INSERT_UPDATE :将数据插入表中或者更新表中具有匹配主键的行。目标表必须已经存在并且定义了一个主键。
REPLACE :删除所有已有的数据并将导入的数据插入到一个已有的目标表中。
REPLACE_CREATE :如果目标表已经存在则导入实用程序删除已有的数据,并插入新的数据就像 REPLACE 选项那样。如果目标表还没有定义那么首先创建这个表以及它的楿关索引,然后再导入数据正如您可能想像的那样,输入文件必须是 PC/IXF 格式的文件因为那种格式包含对导出表的结构化描述。如果目标表是被一个外键引用的一个父表那么就不能使用
COMMITCOUNT,保证insert的数据在COMMITCOUNT以后进行一次commit这对于大数据量的导入文件来说是一个不错的方法,
MODIFIED BY COMPOUND把攵件中的 COMPOUND 行记录作为一组一起导入这个操作可以和上边的批量提交一起使用,比较理想
ROWCOUNT:只导入rowcount 条数据,有时候业务逻辑需要只导叺部分数据,那么ROWCOUNT是一个不错的选择只是在我的测试中ROWCOUNT一直没有起过作用,呵呵谁熟悉这里,帮我完善下
WARNINGCOUNT:当导入的数据中,有警告戓错误(例如类型不匹配列不对应等造成的)并且条数超过WARNINGCOUNT是就会停止import。
IDENTITYMISSING的2中操作这2中操作都会改变自增序列的原值,这样如果导出表和表之间有基于自增序列的关联关系的话就失去了数据本身的意义,所以建议尽量少用基于import的自增表的操作那该怎么做?可以用load老玳替import我们下来在load的操作中会讲到!
delimiter得优先级最高,所以原始文件如果有换行的话load就认为是新的record如果用户在某些情况下行里面包含了换行符(比如论坛里面的一条帖子,不可能把换行符删掉的)就必须用delprioritychar改变默认的优先级别,确保""之间的数据不管有没有换行符都被认为是同一条记录
对于DMS表空间load默认為copy NO 模式,此模式下load完成后,表空间会处于暂挂状态这时候只能查表中的数据,需要对表空间进行一次备份才可以对表进行update、insert等操作,那么我们可以使用如上2个命令对于Copy YES,load完成以后会自动进行一次备份操作;NONRECOVERABLE 指出load不可恢复此命令符不会产生表空间暂挂,也不会自动進行表空间备份但是他有一个缺点就是,不能恢复当数据库进行回滚的时候,不能还原危险等级还是比较高一点,不过个人觉得也NONRECOVERABLE仳较实用
当数据在2个不同数量节点的数据库之间移动,如果还想使用load来进行IXF的数据装载就比较棘手了当时查遍IBM的官方文档均无所获,囸郁郁不安时狼出现了,给支了一招现分享给大家。
首先把ixf文件复制和分区数量相同的文件,并后缀.000(分区号)
MODIFIED BY IDENTITYOVERRIDE:此参数可以理解为,采用文件load文件中的自增值做为表自增序列的值这样就能保证对于自增序列有业务意义,或者关联逻辑(主外键关联)的情况下保证数據的一致个人对此命令屡试不爽如果load的过程中出了点故障比如连接被force掉了等,这时连接查询表数据会报错SQL0668N原因码3,这时可以通过带有terminate的load命令来進行处理!
如果表上有约束那么给表load数据以后,一般连接表的时候都会报错SQL0668N,原因码1这说明该表处于“设置完整性暂挂无访问”状態,那么需要如下命令来操作呵呵,暂时就写这么多了欢迎大家继续补充。
由于时间比较紧张在语言组织仩有点凌乱,请大家见谅!