Oracle SQL*Loader 使用一个控制文件装载数据,DB2 LOAD 实用程序也是这样。但是,这些控制文件的结构很不一样,许多 Oracle 和 DB2 DBA 希望了解它们的差异。在本文中,要对比这两个实用程序,讨论如何使用 Perl 工具把 Oracle SQL*Loader 脚本转换为 LOAD 脚本。因为在大型数据仓库中空间总是很宝贵的,本文还解释如何修改 DB2 LOAD 的数据文件。
DB2 LOAD 与 Oracle SQL*Loader 的对比
DB2 LOAD 与 DB2 IMPORT — 使用哪种 “路径”?
实际上,DB2 有两种把外部数据源中的数据迁移到 DB2 表的实用程序:LOAD 和 IMPORT。LOAD 在页面级存放数据,这会绕过触发器和日志记录机制,并停止约束检查和索引构建,直到完成数据迁移。另一方面,IMPORT 基本上是执行 INSERT,所以在把数据放到表中时,会触发触发器、执行日志记录并执行约束检查和索引构建。这两个实用程序的选项之间还有其他许多差异,但是这超出了本文的范围。
另一方面,Oracle SQL*Loader 实用程序有两种操作模式,或者说操作路径:直接路径和传统路径。Oracle DBA 在使用这种实用程序时要指定 “路径”,这两种路径的效果分别与两个 DB2 实用程序相似。SQL*Loader “直接路径” 模式的功能与 DB2 LOAD 相似。SQL*Loader “传统路径” 模式的功能与 DB2 IMPORT 相似。
作为 DB2 迁移专家,我们发现大多数 Oracle DBA 在通常使用 SQL*Loader 的传统模式,他们的经验和脚本也是针对传统路径的。实际上,一些 Oracle DBA 从来没有使用过 SQL*Loader 的直接路径模式。但是,当他们开始学习 DB2 时,常常选用 DB2 LOAD 实用程序(可能是因为这个名称);因为 LOAD 具有 SQL*Loader 直接路径模式的许多特征,而这些 Oracle DBA 没有使用过直接路径,所以他们会遇到许多困难。因此,为了把问题谈清楚,尽管大多数 Oracle DBA 通常使用传统模式,本文会演示如何把所有 SQL*Loader 脚本转换为 DB2 LOAD 实用程序脚本,无论原来的脚本采用哪个路径。我们认为这样做有助于 DB2 产生最佳性能。如果由于某种原因 DBA 希望把这些脚本转换为使用 IMPORT 而不是 LOAD,以后也可以这么做(如果情况允许的话)。
SQL*Loader 命令行 — 调用 SQLLDR
用 SQLLDR 二进制代码调用 Oracle SQL*Loader 实用程序,使用的命令行语法与 DB2 LOAD 相似。命令行可以包含许多关键字,比如告诉 SQL*Loader 实用程序把消息发送到哪里、把丢弃的记录发送到哪里等等。
SQLLDR 命令行还指定 “控制文件” 的名称(常常具有 .CTL 扩展名)。这个控制文件也可以告诉 SQL*Loader 实用程序把消息发送到哪里、把丢弃的记录发送到哪里等等。SQLLDR 命令行中的关键字设置优先于控制文件中的设置,所以要想了解 SQL*Loader 会话的实际工作方式,必须同时关注 SQLLDR 命令行和控制文件。这样的设计方式可能是为了提高 SQL*Loader 的灵活性和功能,但是在把脚本迁移到 DB2 时,如果在这两个位置都使用了一些相同的关键字,而且各个脚本的设置不一致,就可能引起混乱。
SQL*Loader 控制文件指定装载操作的细节,所以在对比 SQL*Loader 和 DB2 LOAD 时,主要对比 SQLLDR 控制文件和 DB2 LOAD 命令行。但是,我们要先讨论 SQLLDR 命令行的所有选项,并将其与 DB2 LOAD 命令行进行比较,看看它们的相似之处。然后,讨论控制文件及其关键字和选项,再与 DB2 LOAD 命令行进行比较。
表 1. DB2 LOAD 与 Oracle SQL*Loader 直接路径
特性 | DB2 LOAD | SQL*Loader(直接路径) |
直接路径 | 使用 DB2 LOAD 实用程序 | 使用 SQL*Loader 直接路径 —— 传统路径的许多选项不可用。 |
在装载后生成统计数据 | 是(如果替换数据),不(如果追加数据) | 不 |
可恢复 | 可以,使用 COPY YES 选项 | 在直接路径中不可以 |
默认(值) | 可用 | 不可用 |
使用多个输入文件 | 可以 | 对于一个 SQLLDR,只能使用一个文件 |
异常数据 | 写到一个异常表和/或 DUMP 文件 | 写到一个异常表 |
从游标装载 | 是 | 否 |
从管道装载 | 是 | 是 |
BLOBS/CLOBS | 是 | 是 |
XML 文档 | 是 | 是 |
在装载时允许压缩 | 是 | 是 |
在线装载 | 是 —— 可以访问表 | 在直接路径中,不是在线装载 |
在装载时可以修改数据吗? | 可以 —— 通过用户退出 | 可以 —— 传统路径(SQL 字符串) 不可以 —— 直接路径 |
在列中填充常量值 | 不可以 | 可以,使用 CONSTANT 关键字 |
在多个数据库分区中装载 | 可以 | 无 |
如何调用? | 它是一个可以从 SQL 脚本调用的 DB2 命令,也可以使用 API 通过应用程序调用 | 它是一个可以从命令行调用的独立实用程序,可以在应用程序中通过 API 调用 |
如何监视装载状态? | 从另一个连接运行 LOAD QUERY 或 LIST UTILITIES 命令 | 查看日志文件 |
并行性 | 经过充分优化,可以使用多个 CPU、多个进程和线程 | 可以通过使用多线程实现并行 |
清单 1. Oracle SQLLDR 命令行语法示例
SQLLDR CONTROL=sample.ctl DATA=sample.dat LOG=sample.log BAD=sample.bad
DISCARD=sample.dsc
USERID=scott/tiger ERRORS=999 LOAD=2000 DISCARDMAX=5
表 2. Oracle SQLLDR 命令行关键字与 DB2 LOAD 关键字的比较
Oracle SQLLDR 关键字 | Oracle SQLLDR 关键字说明 | DB2 LOAD 关键字 | DB2 LOAD 关键字说明 |
CONTROL=filename.ctl | 包含详细的 LOAD 命令选项的文件。 | 无 | 不从控制文件单独调用 DB2 LOAD 命令选项。DB2 LOAD 命令在一个调用中包含所有关键字。 |
DIRECT=true | 调用 Oracle SQL*Loader 实用程序的直接路径模式。 | LOAD | DB2 LOAD 实用程序本身非常接近 Oracle SQL*Loader 实用程序的直接路径模式。 |
DIRECT=false | 如果不使用这个关键字或值为 “false”,就调用 Oracle SQL*Loader 实用程序的传统路径模式。 | IMPORT | DB2 IMPORT 实用程序本身非常接近 Oracle SQL*Loader 实用程序的传统路径模式。 |
BAD=filename.bad | 存储被拒绝的记录的地方。 | MODIFIED BY DUMPFILE=filename | 这个 DB2 LOAD 修饰符用来决定在哪里存储被拒绝的记录。 |
DATA=filename.dat | 输入数据源文件。 | FROM sourcename | DB2 LOAD 的 sourcename 可以是文件、管道、设备或游标。 |
DISCARD=filename.dsc | 由于各种原因未装载的异常记录。 | FOR EXCEPTION tablename | DB2 LOAD 把违反惟一索引规则的记录(异常)放到以前创建的一个表中。 |
DISCARDMAX=number | 定义在 SQLLDR 终止之前允许的最大丢弃记录数。 | WARNINGCOUNT=number | 在达到这个警告数时,DB2 LOAD 终止。丢弃仅仅是警告类型之一。 |
ERRORS=number | 定义在 SQLLDR 终止之前允许的最大错误数。 | NOROWWARNINGS | 修饰符 NOROWWARNINGS 可以关闭行警告,但是仍然保留异常记录的警告。 |
LOAD=number | 要装载的记录数(ALL 是默认设置)。 | ROWCOUNT number | 指定要装载的记录数。如果省略这个关键字,默认设置是所有记录。 |
MULTITHREADING=true | 允许在客户端进行流构建,在服务器端进行流装载。 | CPU_PARALLELISM number DISK_PARALLELISM number FETCH_PARALLELISM yes | DB2 LOAD 自动决定这些设置,用来控制为对文件、设备、管道和游标装载中的记录进行解析、转换、格式化和写操作所生成的线程数。也可以使用这些关键字指定自己需要的值。 |
ROWS=number | 每次数据保存存储的行数。 | SAVECOUNT number | DB2 LOAD 使用一致点确保装载操作的可恢复性。 |
LOG=logfile | LOG 存储装载操作的输出。 | MESSAGES messagefile | DB2 把消息放到这个消息文件中。如果不指定消息文件,它就不产生消息。 |
SILENT=options | SILENT=options 可以关闭操作不同部分的消息输出。 | NOROWWARNINGS | 修饰符 NOROWWARNINGS 关闭操作不同部分的消息输出。 |
SKIP=number | 在 n 个记录之后开始装载。通常,如果装载操作提交了部分装载,但是操作没有完成,就使用这个关键字重新启动这个操作。 注意:如果使用这个特性,SQL*Loader 要求操作者自己决定装载启始点,选择错误的数值会导致丢失数据或数据重复。 | RESTART (REPLACE, INSERT, TERMINATE) | DB2 LOAD 使用这个模式在遇到故障之前的最后一个一致点之后选择重新装载的启始点。DB2 LOAD 会自己决定启始点,不需要操作者计算。 DB2 LOA 您可能想查找下面的文章: |