为了加快数据的装载速度,许多DBA们喜欢使用load工具进行数据的迁移和装载,但是load工具带来便利性的同时也为我们带来一些问题,今天就着重介绍一下当我们再使用Load工具时遇到问题后的解决办法。
众所周知,load过程分为4个阶段:load/build/delete/index copy。load阶段是将源文件parser成物理数据存储的格式,直接装入到页中,而不通过db2引擎,load阶段会检查表定义,违背定义的数据不会装入到表中。build阶段建议索引(如果装入表有索引的话),会检查唯一性约束,违背了唯一性的数据会在delete阶段删除。index copy阶段将index数据从指定的临时表空间拷贝到初始的表空间里,index copy只适应于allow read access场景。load的4个阶段会记录在messages文件里。而db2 load如果不加nonrecoverable可能导致table space变为backup pending等状态。
本文主要介绍 DB2 LOAD 命令所提供的 COPY NO/COPY YES/NONRECOVERABLE 选项,以及与之相关的注册表变量的使用方法等。
由于 LOAD 最小化了日志的记录,因启用了前滚恢复的数据库在恢复在线备份时需要归档日志的特性,对于这种数据库的 LOAD 操作,为避免执行 LOAD 操作后,表在使用 ROLLFORWARD 命令前滚归档日志的过程中因缺少日志而被置为非正常状态,DB2 为 LOAD 命令提供了如下选项:
·COPY NO(缺省)
·COPY YES
·NONREVERABLE
1. 进行一次数据库的全备份:
首先对已启用前滚恢复模式的 SAMPLE 数据库进行一次全备份:
E:\TEST>db2 backup db sample
备份成功。此备份映像的时间戳记是:20051230174105
这时看到在当前目录下产生了一个 SAMPLE.0 的子目录,表明产生的是一个数据库全备份。下面将对这些现象逐个予以举例说明:
2. 关于 COPY NO的备份暂挂:
在 LOAD 操作结束时,将表所在的表空间置于“备份暂挂”状态,此时虽然其中的表可以进行 SELECT 操作,但不能进行 UPDATE 和 DELETE 操作。为使该表状态恢复正常,除去备份暂挂状态,必须手动对其表空间执行一个 BACKUP 命令。由于该选项为缺省选项,如果 LOAD 命令中未指明,则默认为使用该选项,如:
E:\TEST>db2 connect to sample
E:\TEST>db2 load from staff.del of del insert into staff
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0020
详细解释:
备份暂挂:
E:\TEST>db2 select count(*) from staff
1
-----------
70
1 条记录已选择。
E:\TEST>db2 update staff set id=335 where id=340
DB21034E 该命令被当作 SQL 语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0290N 不允许存取表空间。 SQLSTATE=55039
在手动对 USERSPACE1 表空间进行一次备份操作后,表空间状态将正常,再次尝试更新操作就会成功:
E:\TEST>db2 backup db sample tablespace (userspace1)
备份成功。此备份映像的时间戳记是:20051230184841
命令完成后可以在当前目录下看到产生了一个 SAMPLE.3 的子目录,表明产生的是一个表空间级的备份。
E:\TEST>db2 connect to sample
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0000
详细解释:
正常
3. 关于 COPY NO的复原暂挂:
而所产生这份关于表空间的备份可在数据库因前滚操作将表空间置为“复原暂挂”状态时用于将表空间状态恢复为正常,并恢复 LOAD 操作对该表的修改。如当前滚数据库超过LOAD时间点后,表空间将被置为复原暂挂状态:
E:\TEST>db2 restore db sample taken at 20051230174105
DB20000I RESTORE DATABASE 命令成功完成。
E:\TEST>db2 rollforward db sample to end of logs and stop
SQL1271W 已恢复数据库 "SAMPLE",但在节点 "0"上有一个或多个表空间脱机
E:\TEST>db2 connect to sample
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0100
详细解释:
复原暂挂
此时可利用这一表空间级的备份进行恢复操作:
E:\TEST>db2 restore db sample tablespace (userspace1) taken at 20051230184841
DB20000I RESTORE DATABASE 命令成功完成。
E:\TEST>db2 connect to sample
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0080
详细解释:
前滚暂挂:
E:\TEST>db2 rollforward db sample to end of logs and stop tablespace (userspace1)
前滚状态
输入数据库别名 = sample
节点数已返回状态 = 1
节点号 = 0
前滚状态 = 未暂挂
下一个要读取的日志文件 =
已处理的日志文件 = -
上次落实的事务 = 2005-12-30-10.47.10.000000
DB20000I ROLLFORWARD 命令成功完成。
E:\TEST>db2 connect to sample
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0000
详细解释:
正常
E:\TEST>db2 update staff set id=335 where id=340
DB20000I SQL 命令成功完成。
可见表空间状态已正常,表也可执行更新操作了。
4. 关于 COPY YES:
在 LOAD 操作结束时,DB2 自动对表所在的表空间进行一次备份操作,因而 LOAD 结束后,表所在的表空间不会再处于“备份暂挂”状态,而为“正常”状态。但由于要进行备份操作,所以这种 LOAD 操作的时间会较没有备份的长。如:
E:\TEST>db2 connect to sample
E:\TEST>db2 load from staff.del of del insert into staff copy yes to .
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0000
详细解释:
正常
E:\TEST>db2 select count(*) from staff
1
-----------
105
1 条记录已选择。
此时可在当前目录下看到一个 SAMPLE.4 的子目录,表明产生的是一个由 LOAD 操作生成的备份,而这份备份将在数据库进行前滚恢复操作时用于重新创建 LOAD 操作对数据库的修改。如:
E:\TEST>db2 restore db sample taken at 20051230174105
DB20000I RESTORE DATABASE 命令成功完成。
E:\TEST>db2 rollforward db sample to end of logs and stop
前滚状态
输入数据库别名 = sample
节点数已返回状态 = 1
节点号 = 0
前滚状态 = 未暂挂
下一个要读取的日志文件 =
已处理的日志文件 = S0000002.LOG - S0000003.LOG
上次落实的事务 = 2005-12-30-11.48.26.000000
DB20000I ROLLFORWARD 命令成功完成。
E:\TEST>db2 connect to sample
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0000
详细解释:
正常
E:\TEST>db2 select count(*) from staff
1
-----------
105
1 条记录已选择。
这表明在 SAMPLE.4 下的备份被用于了前滚恢复操作,而重新创建了 LOAD 操作对数据库插入的记录。
5. 关于 NONRECOVERABLE:
该选项会将 LOAD 操作标志为不可恢复,即数据库不能通过后续的前滚操作而被恢复。LOAD 操作结束后,数据库既不会处于“备份暂挂”状态,也不会产生任何的备份。
E:\TEST>db2 connect to sample
E:\TEST>db2 load from staff.del of del insert into staff nonrecoverable
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0000
详细解释:
正常
虽然 LOAD 之后表空间和表的状态都正常,但如果今后需要执行前滚命令恢复数据库时,前滚操作将跳过 LOAD 事务的处理,而将 LOAD 的表标记为无效,是对表的任何操作都不能进行。如:
E:\TEST>db2 restore db sample taken at 20051230174105
DB20000I RESTORE DATABASE 命令成功完成。
E:\TEST>db2 rollforward db sample to end of logs and stop
前滚状态
输入数据库别名 = sample
节点数已返回状态 = 1
节点号 = 0
前滚状态 = 未暂挂
下一个要读取的日志文件 =
已处理的日志文件 = S0000002.LOG - S0000003.LOG
上次落实的事务 = 2005-12-30-12.19.55.000000
DB20000I ROLLFORWARD 命令成功完成。
E:\>db2 connect to sample
E:\TEST>db2 list tablespaces
表空间标识 = 2
名称 = USERSPACE1
类型 = 系统管理空间
内容 = 任何数据
状态 = 0x0000
详细解释:
正常
E:\>db2 select * from staff
ID NAME DEPT JOB YEARS SALARY COMM
------ --------- ------ ----- ------ --------- ---------
SQL1477N 不能存取表 "LIWENLI.STAFF"。 SQLSTATE=55019
这表明该表已不可操作,此时只有将表删除,重新构建,或使用 LOAD 操作时间点之后所做的数据库全备份或表空间备份来恢复该表。
5. 关于注册表变量 DB2_LOAD_COPY_NO_OVERRIDE 的介绍:
另外 DB2 还提供了一个注册表变量:DB2_LOAD_COPY_NO_OVERRIDE,可将 LOAD 的缺省选项 COPY NO 设置为 NONRECOVERABLE 或 COPY YES。具体使用方法举例为:
设置为 COPY YES 的方法:
E:\TEST>db2set DB2_LOAD_COPY_NO_OVERRIDE="COPY YES TO E:\TEST"
E:\TEST>db2 terminate
E:\TEST>db2set
DB2_LOAD_COPY_NO_OVERRIDE=COPY YES TO E:\TEST
E:\TEST>db2 load from staff.del of del insert into staff
SQL27966W DB2_LOAD_COPY_NO_OVERRIDE 注册表变量值 "COPY YES TO E:\TEST" 将覆盖在 Load 中指定的 COPY NO 参数。
设置为 NONRECOVERABLE 的方法:
E:\TEST>db2set DB2_LOAD_COPY_NO_OVERRIDE=NONRECOVERABLE
E:\TEST>db2 terminate
E:\TEST>db2set
DB2_LOAD_COPY_NO_OVERRIDE=NONRECOVERABLE
E:\TEST>db2 load from staff.del of del insert into staff
SQL27966W DB2_LOAD_COPY_NO_OVERRIDE 注册表变量值 "NONRECOVERABLE" 将覆盖在Load 中指定的 COPY NO 参数。
通过上述对 LOAD 的 COPY NO,COPY YES 和 NONRECOVERABLE 参数,以及 DB2 注册表变量 DB2_LOAD_COPY_NO_OVERRIDE 的详细和举例说明,到此我们已经掌握了它们的功能和使用方法。由于 LOAD 操作几乎不记日志的特性,在对启用了前滚恢复的数据库实现 LOAD 操作时应注意从中选择适当的选项,以保证执行了 LOAD 操作的表的可用性.
阅读(11325) | 评论(0) | 转发(0) |