我就在这里
分类:
2007-11-28 16:42:11
许多 iseries 开发人员正开始使用 sql 代替专有的非 sql 接口来创建他们的数据库对象。本文将向您展示怎样一种通过 db2 universal database for iseries 的模式来分类相关数据库对象。
简介
许多 iseries™ 开发人员正开始使用 sql 代替专有的非 sql 接口来创建他们的数据库对象。这种 sql 的用法使许多
iseries 开发人员为怎样最好地管理同 iseries sql 接口混杂在一起的模式和日志对象而费尽心思。此外,由于 os/400®
的日志记录不同于其他 db2 udb 服务器使用的日志记录机制,ibm® db2® universal database™ (udb)
开发人员在第一次使用 iseries 时也面临着相似的难题。
在 db2 udb for iseries 中,使用模式来对相关数据库对象进行分组。一个 db2 udb for iseries 模式实际上是一个 db2 对象与 os/400 对象的集合。执行 create schema 语句,将创建以下对象(请参阅 图 1):
该模式中的这些对象提供了容器,用于存储相关的 db2 对象和日志对象,在恢复对这些 db2 对象所作的数据库变更时必需用到这些日志对象。
图 1. 空模式的 iseries navigator 视图
库
库是对象的“逻辑”容器,是存储对象的地方。在这个容器中 db2 对象的名称必须是唯一的。db2
视图是作为模式的一部分创建的,是一组描述表、视图、索引、包、过程、函数、触发器和约束的视图。这些视图建立在库 qsys 和 qsys2
中目录表的基本集合上,仅包括了该模式包含的对象的信息。
日志和日志接收器对象
db2 udb for iseries 通过一个称为 日志记录的过程记录了表的变更。os/400 日志通过发送信息至日志接收器来记录数据库对象的变更。这样,日志接收器类似于 db2 udb 的日志文件。当表被创建到模式中时,它被自动记录到 db2 udb for iseries 执行 create schema
语句期间所创建的日志对象中。
即使 db2 自动为表对象开始进行日志记录,用户仍需要负起管理日志和日志接收器对象的责任。您可以想象得到,这些包含有数据库变更的日志接收器会变得相当大,所以除 非您有无限的磁盘空间,否则不要选择忽略这些自动创建的日志接收器对象。然而,也不能任意地删除日志接收器对象来节省磁盘空间。此外,即使能够停止为表进 行的日志记录,我也不建议您这么做,因为访问无日志记录的对象的应用程序不能指定隔离级别,也不能发出提交和回滚。
绝大多数 iseries 客户将日志接收器作为数据库备份和恢复处理的核心部分使用。一种方法是每周保存一次表备份介质的完整副本,而每天晚上只将对表(也就是,日志接收器)所做 的变更保存到备份介质中,并且每周重复这个过程。一旦日志接收器经过备份,日志接收器对象就可以被删除了。在 iseries 信息中心的 backup and recovery guide能找到更多保存和删除日志接收器对象时所采用的正确步骤的相关信息。iseries 信息中心的在线版本,可以在 找到。
让系统自动删除日志接收器对象也是可能的,可以通过在 chgjrn cl
命令上指定 dltrcv(*yes)
或在 iseries navigator 界面上设置 xyz 选项(请参阅 图 2)来做到这一点。然而,只有在阅读了 backup and recovery guide 并理解了该选项的行为之后,才可以使用该选项。
图 2. 日志界面
随着您使用时间的增加,您将注意到在 db2 udb for iseries 选项中会出现数个日志接收器对象。这是因为 db2 udb for iseries 在 chgjrn cl
命令上使用了系统管理的接收器(system-managed receiver)选项(例如, mngrcv(*yes)
)来创建日志对象。 图 2中的图形日志管理界面,通过在“receivers managed by:”部分上选择 system单选按钮,指示一个系统管理日志接收器。通过指定该选项,每当系统重启(也就是,系统 ipl)及连接的接收器达到其大小阈值时,db2 udb 将自动创建一个新的日志接收器。当前的日志接收器被拆离,并创建一个新的接受器。
当日志接收器被拆离时很容易对其进行备份。同样,接收器必须在被拆离后才可以删除。因此您能够看得出该选项是怎样使管理日志接收器更为方便的。管理 日志性能的主题超出了本文的范围,不过您可以参考红皮书 striving for optimal journal performance(sg24-6486)。
由于 db2 udb for iseries 没有表空间的概念,并且自动跨磁盘条带化和均衡 db2 对象,因此从管理员的观点来说,日志和日志接收器对象将成为唯一需要空间管理的模式对象。仅有的另一个空间管理任务是确保系统上留有足够的可用磁盘空间。
移动模式
当把模式移动到一新系统或另一模式时(例如,从测试环境移到生产环境),由 db2 udb
自动创建的日志和日志接收器对象也是需要处理的关键组件。当表被移动到一个新模式时(通过复制或恢复操作),它仍和原来模式的日志相关联 -
它不会自动开始使用新模式中的日志。因此,在模式之间移动表时,为该 db2 表重设日志是一个必需的步骤。
将模式移动到不同的模式或系统的首选方法是重新运行原始的 sql 创建脚本。如果 sql 创建脚本不可用,通过在 iseries navigator 中使用“generate sql”任务,采用逆向工程能得到它。在模式对象上单击鼠标右键并选择“generate sql”任务为模式中所有的对象构建一个 sql 创建脚本。因为表对象是在新的模式中创建的,它们会自动被记录进新的日志中。
很多时候重新创建所有的 db2 对象是不可行的,因为这些源对象含有大量数据。在这里另一种可以使用的方法是保存并恢复该模式,然后手工重设后来的日志信息。假设我有一个称为 abc 的模式,带有两个表 department 和 employee,以下是使用保存和恢复方法将模式 abc 移动到模式 xyz 内时所需遵循的步骤。
savlib abc accpth(*yes)
请记住模式的 os/400 容器是一个库。如果模式中有索引存在的话,选项 accpth(*yes)
保存实际的索引树对象 - 那将会消除必须在恢复操作中重新构建的索引。
sql: create schema xyz
这将会创建目标模式对象,并带有自动创建的日志和系统目录视图。
rstlib abc option(*new) rstlib(xyz)
*new 选项仅会恢复在 xyz 模式中尚不存在的 abc 对象。这种恢复本质上恢复所有东西,但不包括 db2 udb 自动创建的对象(如:日志、日志接收器和目录视图)。
因为 os/400 日志的 cl 命令仅接受简短的 db2 对象标识,因此我们将在这一步中记录 db2 udb for iseries 对象的简短名称(请参阅文章 db2 udb for iseries 长标识符和短标识符)。
endjrnpf *all abc/qsqjrn
新模式 xyz 中的 db2 对象目前同原始模式相关联。通过终止所有表的日志记录来消除这种关联。如果用户将模式中的其他对象(比如索引)显式地记录进日志,那就必须终止并重启这些对象的日志记录。举例来说,已记入日志的索引要通过 endjrnap
和 strjrnap cl
命令终止并重启。
endjrnpf
命令不同, strjrnpf
通常不支持 *all
选项。因此对每个 db2 表对象都需要执行该命令,以使它们同 xyz 的日志和日志接收器对象相关联。
注:如果使用 chgjrn cl
命令或 iseries navigator 改变了日志对象使其不同于缺省设置。则需要在 xyz 模式的日志对象上进行相应的定制。
结束语
现在您应对构成 db2 udb for iseries 模式对象的对象及这些 os/400 对象是如何互相联系的有了一个清晰的理解。此外,随着时间的推移,这里讨论的管理和移动模式对象的首选方法也应使您能更有效地使用 db2 udb for iseries。