供稿人:王君
本篇文章主要介绍如何提高复制数据库文件操作的性能的一些基本规则,以及如何防止复制文件时出错。
以下的内容介绍一些您在日常数据库文件复制的时候可以遵循的一些基本准则,以此来提高复制操作的性能。
在复制分布式文件时,您应该熟悉影响复制命令性能的各种因素。DB2 Multisystem 功能部件提供了对分布式文件或分布在多个 iSeries 服务器间的文件的支持。复制分布式文件时,应该熟悉影响复制命令的性能的各种因素。您应该了解复制至分布式文件以及从分布式文件进行复制时适用的限制。
1. 避免键控顺序访问路径
需要维护键控顺序访问路径的复制比从到达顺序访问路径复制或复制至到达顺序访问路径速度要慢。
若重组源文件以使其到达顺序与其键控顺序访问路径相同,则可改进复制性能。通过使用 FROMRCD 或 TORCD 参数来选择记录,从而不使用键控顺序访问路径,也可改进复制性能。
在目标文件上创建较少的逻辑访问路径。这样做可以改进复制性能,因为复制过程不需要更新许多访问路径。
文件中记录的长度越短,复制越快。
2. 指定较少的参数
通常,若指定较少的可选复制参数,则可以改进复制性能。 下列参数影响复制操作的性能:
- ERRLVL
- FMTOPT
- INCCHAR
- INCREL
- PRINT
- SRCOPT
使用 COMPRESS 功能不会显著影响性能。若想要删除目标文件中的记录,则应请求 COMPRESS(*NO),例如,当需要相对记录号相同时。
3. 检查记录格式级别标识
您也可以通过正确地设置 CPYF 命令中的记录格式级别标识,改善复制性能。
如果正在使用 CPYF 在两个想象上相同的文件之间移动数据,则记录格式级别标识应该相同以优化复制性能。如果记录格式级别标识不相同,则 CPYF 经历较长的代码路径来检查每个记录中的每个字段和列。如果不需要大量的检查,这会影响 CPYF 完成功能所需要的时间。
如果文件具有不同的属性,则两个文件的记录格式级别标识应该不同。如果它们不是不同的,则不执行字段和列级别检查,从而导致不正确的数据转换或根本不转换。注意,可以指定 FMTOPT(*NOCHK)来避免进行字段和列级别检查,而不管记录格式级别标识的值如何,尽管当指定 FMTOPT (*NOCHK) 时,数据的某些属性(如空值)将丢失。
4. 防止复制文件时出错
预先规划某些条件和情况可防止出现许多复制错误。
- 限制复制期间的可恢复错误
当复制至数据库文件或磁带文件或者从数据库文件或磁带文件复制时,可限制在复制结束之前接受的可恢复错误的数量。使用ERRLVL参数来指定此限制。
此参数适用于下列类型的错误:
CPF4826 介质错误
CPF5026 此成员的访问路径中有重复的键。(注:当在 CPYF 上指定 MBROPT (*UPDADD) 时,复制命令不会把 CPF5026 算作 ERRLVL 错误。)
CPF5027 记录正由另一个作业使用。(注:当在 CPYF 上指定 MBROPT (*UPDADD) 时,复制命令才将CPF5027 算作 ERRLVL 错误。)
CPF5029 数据或键转换错误
CPF502D 引用完整性约束违例
CPF502E 不能验证引用完整性约束
CPF5030 成员部分损坏
CPF5034 另一个成员的访问路径中有重复的键
CPF5036 读取的磁带块长度无效
CPF504B 数据链路错误
CPF504C 数据链路准备错误
CPF5097 在浮点键字段中不允许 *NAN(非数字)值
ERRLVL 参数指定所复制的每个标签对或每个成员允许的最大可恢复错误数。对 ERRLVL 指定的值指示在源文件和目标文件上所允许的错误总数,即为所复制的每个标签对或每个成员的错误的总和。每次出错时,运行以下进程:
该进程对那个标签对或成员的计数增加 1。
若指定了 TOFILE(*PRINT)、PRINT(*COPIED) 或 PRINT(*EXCLD),则将在所有复制列表上打印一条消息,该消息标识读或写的最后一个正确记录。
若指定了 PRINT(*ERROR),则打印错误记录。
复制继续执行。
若复制命令完整地复制了源文件成员而未超出限制,则过程将计数器复位为 0,并开始对下一个成员的复制。
若在复制成员期间超出了限制,则尽管还有记录或成员要复制,仍结束复制并发送一条消息。
对于数据库源文件,包括开放式查询文件,可恢复错误是:
- 在转换(映射)数据时发生的错误,以及
- 由磁盘(在辅助存储器中)上的坏扇 区引起的错误
对于磁带源文件,可恢复错误是:
- 无效的块长度,以及
- 从导致错误的设备上的磁带卷进行介 质读操作
对于物理目标文件,可恢复错误是:
- 在转换数据时发生的错误,以及
- 在找到多个相同的键时发生的错误
导致错误的任何记录将不复制至目标文件。对于写错误,该记录打印在 PRINT(*COPIED) 和 PRINT(*EXCLD) 打印输出上。之后有一条消息跟在此打印输出后面。这条消息指示实际上并未复制该记录。若指定了 PRINT(*ERROR),则命令将导致写错误的那些记录打印在 *ERROR 列表上。之后有一条消息指示发生了错误。对于读错误,没有要在复制打印输出(TOFILE(*PRINT)、PRINT(*COPIED)、PRINT(*EXCLD) 或 PRINT(*ERROR))上打印的记录。然而,在所有指定的打印输出上打印了一条消息,该消息指示不能读取记录。
当命令不能从磁盘读文件的某个部分时,发生数据库文件内容的一部分对象损坏。若文件是以这样的方式损坏的,则可用下列方法绕过出错的记录:通过复制有效的记录并手工地添加那些由于损坏而未复制的记录。
不管 ERRLVL 参数的值是什么,可恢复错误总是出现在作业记录中,且还出现表示“取消”的应答“C”。
对于那些有约束关系的文件,ERRLVL 参数仅影响目标文件。若将 ERRLVL 参数设置为 0,则复制命令不会把导致目标文件违反约束关系的任何记录复制到文件中。复制操作结束。若 ERRLVL 大于 0,则复制命令不会把导致目标文件违反约束关系的任何记录复制到文件中。然而,复制操作却一直继续,直到发生了足够多的违例(可恢复错误),即数目达到了 ERRLVL 值。若超过了此值,则复制操作结束。
使用 ERRLVL 参数,可以使约束关系处于检查暂挂状态的文件回到非检查暂挂状态。为此,设置从属目标文件,使它与从属源文件具有相同约束。然后,使用带有 ERRLVL(*NOMAX) 的 CPYF 命令来复制所有有效的记录。目标文件不应该包含任何记录。复制命令不将任何下面这样的记录插入目标文件中:它在将会导致目标文件约束转为检查暂挂状态的源文件中遇到的记录。通过将 ERRLVL 设置为 *NOMAX,复制命令处理源文件中的所有记录。
如果系统指示其中一个可恢复错误,则其它复制命令(CPYSRCF、CPYFRMTAP 和 CPYTOTAP)将立即结束,原因是它们没有 ERRLVL 参数。