可以使用DB2 / z加载/卸载更改数据和模式吗?

时间:2012-06-15 06:39:05

标签: schema db2 mainframe migrate

我正在尝试使用JCL找到一种在大型机上使用DB2迁移表的有效方法。当我们更新我们的应用程序以使模式发生更改时,我们需要迁移数据库以匹配。

我们过去所做的基本上是创建一个新表,从旧表中选择,删除原始表并将新表重命名为原始表。

毋庸置疑,当表格很大(并且其中一些非常大)时,这不是一个非常高性能的解决方案。

对于后面的DB2版本,我知道你可以做一些简单的事情,比如改变列类型,但我们有迁移工作需要对数据做更复杂的事情。

例如,考虑我们要将两列合并为一列(firstname + lastname -> fullname)的情况。不要紧,这样做不一定是个好主意,只是理所当然地认为这是我们需要做的事情。可能存在任意复杂的数据转换,基本上你可以用select语句做任何事情。

我的问题是这个。 DB2 unload实用程序可用于将表中的所有数据提取到几个数据集(用于重新加载数据的load JCL和数据本身)。是否有一种简单的方法(或任何方式)来按下unload的输出,以便在重新加载数据时进行这些任意更改?

我认为我可以以某种方式修改load JCL成员和数据成员来实现这一点,但我不确定它会有多容易。

或者,更好的是,unload/load进程本身可以做到这一点而无需直接按摩成员吗?

有没有人有这方面的经验,或者有关于描述如何做到这一点的红皮书或红皮书(或任何其他来源)的指示?

与<{1}}相比,其他有不同(更好,更明显)的方法吗?

2 个答案:

答案 0 :(得分:1)

  

我假设我可以以某种方式修改加载JCL成员和数据成员来实现这一点,但我不确定它会有多容易。

我相信你已经在你的问题中提供了答案。至于“那将是多么容易”的问题,这将取决于你修改的性质。

SORT实用程序(DFSORT,SyncSort等)现在具有非常复杂的数据操作功能。我们使用这些来移动数据,将一个值替换为另一个值,组合字段,拆分字段等,尽管与您描述的内容不同。

您可以使用load控制语句执行类似操作,但这可能不值得。这取决于您的更改程度。如果您需要重复修改,则可能值得花时间尝试自动修改load控制语句。如果修改都是“一次性”,那么手动解决方案可能更为便利。

答案 1 :(得分:1)

正如您所注意到的,从旧表到新表的选择将具有非常差的性能。这里表现不佳通常是由于插入目标表(索引构建和RI执行)的成本相对较高。 SELECT本身通常不是性能问题。这就是为什么当需要从头开始填充大表时,通常会推广LOAD实用程序,可以更有效地构建索引并延迟RI。

UNLOAD实用程序允许不受限制地使用SELECT。如果可以使用标量和/或列函数SELECT数据来构建与新表列定义兼容的结果集,则可以使用UNLOAD进行数据转换。在SYSIN中为UNLOAD实用程序指定SELECT语句。类似的东西:

 //SYSIN DD *
 SELECT CONCAT(FIRST_NAME, LAST_NAME) AS "FULLNAME"
 FROM OLD_TABLE
 /*

生成的SYSRECxx文件将包含一个列,该列是两个标识列的串联(CONCAT函数的结果),SYSPUNCH将包含一个 FULLNAME的兼容列定义 - 新表的已转换列名。您需要做的就是在SYSPUNCH中编辑新的表名(这将默认为TBLNAME)并加载它。尽量不要使用SYSRECxx数据或SYSPUNCH列定义 - 这里的傻瓜可能会变得丑陋。

运行LOAD实用程序时使用REPLACE选项 创建新表(我认为默认是LOAD RESUME,它在这里不起作用)。通常在运行LOAD时关闭RI是个好主意,这样可以提高性能 省去了解LOAD工作需要运行的顺序。完成后,您需要验证 RI并建立指数。

LOAD实用程序记录在案here