您的位置 首页 方案

DB2下数据搬运使命操作实例

使用 DB2 LOAD 实用程序的 FROM CURSOR 选项简化 DB2 for Linux, UNIX, and Windows的数据转移过程。本文介绍 LOAD FROM CURSOR 特性并

运用 DB2 LOAD 实用程序的 FROM CURSOR 选项简化 DB2 for Linux, UNIX, and Windows数据搬运进程。本文介绍 LOAD FROM CURSOR 特性并供给两个接口 Command Line Processor 和 ADMIN_CMD 存储进程的运用示例。

简介

典型的 DB2 数据搬运使命触及三个进程:

◆把数据以二进制或文本格式从源数据库导出到一个暂时数据交换文件

◆在体系之间搬运生成的文件

◆把数据从文件导入或装载到方针数据库中

在数据量很大的状况下,运用 EXPORT 实用程序生成数据交换文件常常要花费很长时刻。别的,在把数据移入和移出数据库时,有必要考虑不同的数据库编码页和操作体系。

能够运用 LOAD 实用程序的 FROM CURSOR 选项防止这些问题。当指定 FROM CURSOR 选项时,LOAD 实用程序直接把一个 SQL 查询的成果集作为数据装载操作的来历,这样就不需求生成暂时数据交换文件。因而,LOAD FROM CURSOR 是在不同的表空间或数据库之间快速轻松地搬运数据的办法。能够在指令行上履行 LOAD FROM CURSOR,也能够经过运用 DB2 的 ADMIN_CMD 存储进程在运用程序或存储进程中履行它。本文介绍 LOAD FROM CURSOR 特性并供给两个接口 Command Line Processor (CLP) 和 ADMIN_CMD 存储进程的运用示例。

把表搬运到另一个表空间

首要,看看怎么把表从一个表空间搬运到另一个表空间。假如创立表的表空间的页面巨细不合适,或许应该用另一个缓冲区池拜访表,就可能需求履行这种数据搬运。在 9.1 曾经的 DB2 版别中,常常由于到达表空间的最大巨细而在表空间之间搬运表。可是,在 DB2 9.1 和更高版别中,这应该不再是问题了,由于表空间巨细束缚现已明显提高了(条件是运用大表空间,而不是曾经运用的惯例表空间)。

这个示例场景首要创立 DB2 SAMPLE 数据库。这能够经过在指令行上调用 db2sampl 指令来完结,见清单 1。

清单 1. 创立 SAMPLE 数据库

除了其他表之外,SAMPLE 数据库包括一个名为 SALES 的表。在默许状况下,在表空间 USERSPACE1 中创立这个表。能够经过对 DB2 编目视图 SYSCAT.TABLES 和 SYSCAT.TABLESPACES 履行查询来承认这一点。

清单 2. 判别 SALES 表的表空间

除了 USERSPACE1 表空间之外,还有第二个表空间 IBMDB2SAMPLEREL,它也用于存储用户数据。在这个示例场景中,IBMDB2SAMPLEREL 作为搬运 SALES 表的方针表空间。履行 DB2 指令 LIST TABLESPACES,就能够看到一个数据库的一切表空间。清单 3 演示具体做法。

清单 3. 列出 SAMPLE 数据库的一切表空间


在把 SALES 表的内容仿制到 IBMDB2SAMPLEREL 表空间之前,有必要在方针表空间中创立一个空表,此表的结构应该与 SALES 表相同。由于在同一个数据库方式中不行能有两个同名的表,所以暂时用 SALES_TMP 这个称号创立新的表。经过在 CREATE TABLE 指令中指定 LIKE 选项,创立一个与现有表结构相同的空表(清单 4)。经过 IN 选项显式地界说新表 SALES_TMP 的表空间。

清单 4. 创立数据搬运操作所需的方针表 SALES_TMP

现在,能够履行数据搬运操作了。运用 DECLARE CURSOR 指令界说一个游标,它运用 SELECT 句子读取源表 SALES 的一切数据。能够自由选择游标的称号,在此示例中运用 C1。然后,在用来填充方针表 SALES_TMP 的 LOAD 指令中引证此游标。此示例中的 LOAD 指令把它的音讯写到日志文件 load_sales_tmp.msg 中。履行的 LOAD 操作包括 NONRECOVERABLE 选项。这意味着在数据库康复的前滚阶段无法从头履行这个 LOAD 操作。因而,在履行数据搬运操作之后,应该履行数据库备份,至少是表空间备份。LOAD 指令有其他选项能够防止这种状况,可是这些选项超出了本文的规模。更多信息请拜见 DB2 Information Center 中对 LOAD 指令的阐明(拜见 参考资料)。

清单 5. 履行 LOAD FROM CURSOR 操作把 SALES 表中的一切行仿制到 SALES_TMP 表

在把 SALES 表中的一切行成功地仿制到 SALES_TMP 表之后,能够删去源表(DROP TABLE 句子)。然后,把方针表 SALES_TMP 重命名为 SALES(RENAME TABLE 句子)。在运用 RENAME TABLE 时,只能修正表名,而不能修正表的方式名。因而,必定要在正确的方式中创立 SALES_TMP 表。

清单 6. 删去源表 SALES 偏重命名方针表 SALES_TMP

再次对 DB2 编目视图履行查询,能够承认 SALES 表现已从本来的表空间 USERSPACE1 搬运到了新的表空间 IBMDB2SAMPLEREL 中,见清单 7。

清单 7. 承认新 SALES 表的表空间

运用别号在另一个数据库中创立表仿制

除了能够在一个数据库中的表空间之间搬运表之外,还能够在不同的数据库之间搬运表。这意味着:经过运用 LOAD FROM CURSOR,也能够把表从一个数据库搬运到另一个数据库。这能够经过两种办法完结:

办法 1 – 在方针数据库中,运用 DB2 的联邦数据库机制拜访源数据库。

办法 2 – 运用 LOAD FROM CURSOR 指令的长途拜访特性。

这两种办法各有长处,下面别离评论。

办法1 运用 DB2 的联邦数据库机制

经过对源数据库履行联邦拜访来仿制表内容。办法 1 要求方针数据库被装备为联邦数据库。因而,对应的 DB2 实例的 FEDERATED 参数有必要设置为 YES(UPDATE DBM CFG)。在修正 DBM CFG 参数 FEDERATED 之后,有必要从头启动 DB2 实例(db2stop/db2start)。在这个示例场景中,源和方针数据库在同一个 DB2 实例中运转。创立一个名为 MYSAMPLE 的空数据库作为方针数据库。关于没有特别需求的测验数据库,能够运用 CREATE DATABASE 指令创立此数据库,不需求其他选项。

清单 8. 在 DBM CFG 中启用联邦数据库支撑并创立空的方针数据库 MYSAMPLE

与前面相同,有必要在方针数据库 MYSAMPLE 中创立一个空表,它的结构与 SAMPLE 数据库中的 SALES 表相同。因而,应该运用 db2look 实用程序提取源数据库中 SALES 表的 DDL。

清单 9. 运用 db2look 实用程序提取源表 SALES 的 DDL

db2look 调用的成果是 sales.ddl 文件,其间包括 SALES 表的 CREATE TABLE 句子。假如在 SALES 表上界说了束缚和/或索引,也会提取出对应的界说并写到 sales.ddl 文件中。清单 10 显现这些成果。

清单 10. db2look 调用的成果文件 sales.ddl

在对方针数据库 MYSAMPLE 履行 sales.ddl 文件中的句子之前,在文本编辑器中翻开此文件并对生成的句子做两处修正:

在文件的最初,db2look 为源数据库 SAMPLE 生成 CONNECT 句子。由于期望对方针数据库 MYSAMPLE 履行下面的句子,所以要相应地修正 CONNECT 句子。

由于在方针数据库 MYSAMPLE 中没有用于存储用户数据的表空间 IBMDB2SAMPLREL,所以要把 CREATE TABLE 句子中的表空间名替换为 USERSPACE1。

清单 11. 成果文件 sales.ddl 中创立方针表所需的修正

在修正 sales.ddl 文件之后,经过调用 DB2 CLP (command line processor) 履行此脚本。

清单 12. 在 MYSAMPLE 数据库中创立方针表

到目前为止,只在方针数据库 MYSAMPLE 中创立了 SALES 表的空仿制。预备数据搬运操作的下一步是把源数据库 SAMPLE 编目为长途数据库。明显,这关于这个示例场景并不是必需的,由于源和方针数据库在同一个服务器上的同一个 DB2 实例中运转。可是在实在的环境中,有必要对运转方针数据库的 DB2 实例履行以下 CATALOG 指令,然后答应对源数据库进行 TCP/IP 拜访。

清单 13. 在节点和数据库目录中创立拜访 SAMPLE 数据库所需的条目

预备 LOAD FROM CURSOR 操作的最终一步是装备对源数据库 SAMPLE 中 SALES 表的联邦拜访。这需求在方针数据库 MYSAMPLE 中创立对另一个数据库履行联邦拜访所需的几个特别方针:

包装器

包装器支撑拜访外部数据源。外部数据源能够是另一个 DBMS(数据库办理体系),比方 Oracle 或 SQL Server,也能够仅仅是 Excel 文件。依据应该拜访的数据源,需求恰当的包装器。这些包装器包括在独自的 IBM product WebSphere® Federation Server 中。假如只期望拜访 DB2 产品系列(DB2 LUW 或 DB2 z/OS)的另一个数据库,那么需求 DRDA 包装器。DB2 LUW 中现已包括这个包装器,所以在这种状况下不需求 WebSphere Federation Server。经过在方针数据库中履行以下指令,创立 DRDA 包装器:CREATE WRAPPER DRDA。

服务器

“服务器” 这个词在这儿有点简单引起误解,由于这实际上意味着源数据库扮演(数据)服务器的人物。为了在方针数据库中辨认源数据库,要创立一个服务器方针,它指定数据源的类型 (DB2/UDB VERSION 9.5)、要运用的包装器 (DRDA) 和拜访源数据库所需的用户名/暗码组合。运用 DBNAME 选项供给源数据库自身的称号。用户名/暗码有必要在引号中指定。为了防止指令行解说器删去引号,应该加上一个反斜杠 ()。能够自由选择服务器方针的称号。在这个示例场景中,运用称号 SRCSRV。

用户映射

关于期望用前面界说的服务器方针拜访长途数据库的每个用户,都有必要创立一个用户映射。用户映射界说本地数据库 (MYSAMPLE) 中的授权 ID 怎么映射到长途数据库 (SAMPLE) 中的授权 ID。在这个示例场景中,本地用户和长途用户是相同的,可是依然有必要界说用户映射。

别号

别号是源数据库中的长途表的本地别号。指定了别号,就能够在方针数据库顶用 SQL 句子查询长途表,就像查询任何本地表相同。

清单 14. 创立联邦拜访所需的数据库方针

留意:这儿描绘的设置联邦拜访所需的进程彻底独立于 LOAD FROM CURSOR 功用。这意味着这些是为长途数据库中的表创立别号的通用进程。

装备了对源数据库表的联邦拜访之后,就能够像前面相同履行 LOAD FROM CURSOR 操作。首要,界说一个游标,它运用上面创立的别号读取长途表中的一切行。然后,在 LOAD 指令中引证这个游标。

清单 15. 运用别号履行长途 LOAD FROM CURSOR 操作

正如前面说到的,与办法 2 比较,结合运用 LOAD FROM CURSOR 操作和联邦拜访需求做的装备作业比较多。可是,联邦拜访的首要长处是能够从非 DB2 数据源装载数据。经过运用联邦办法,能够拜访 Oracle、SQL Server 等数据源以及其他许多联系和非联系数据源,经过创立别号并履行引证别号的 LOAD FROM CURSOR 操作来仿制内容。WebSphere Federation Server 产品供给拜访非 DB2 数据源所需的包装器。

办法2 运用 LOAD FROM CURSOR 指令的长途拜访特性

已然现已了解了运用别号的长途 LOAD FROM CURSOR 操作办法,现在看看另一种比较简洁的办法。为此,首要删去刚才在方针数据库 MYSAMPLE 中的 SALES 表中导入的一切行,见清单 16。

清单 16. 删去方针表中的一切行,以便再次履行 LOAD FROM CURSOR 操作

关于第二种办法,不需求装备对长途数据库的联邦拜访。只需运用 DATABASE 选项在 DECLARE CURSOR 句子中指定长途数据库。为此,要在本地 DB2 实例的体系数据库目录中对长途数据库进行编目。前面现已给出了所需的 CATALOG 指令。别的,在界说游标时要指定长途拜访所需的用户名和暗码。LOAD 指令自身坚持不变。

清单 17. 在不运用别号的状况下履行长途 LOAD FROM CURSOR 操作

从 DB2 9.1 开端,能够以这种办法履行长途 LOAD FROM CURSOR 操作,这种办法根据 DB2 8 中的联邦拜访办法。这种新办法有两个长处 —— 简单运用且性能好。明显,新办法十分简单运用。性能比联邦办法好是由于触及的数据传输层更少。可是,不应该忘掉联邦办法的长处,即能够拜访非 DB2 数据源。

CLP 和 ADMIN_CMD 在 LOAD FROM CURSOR 方面的差异

能够经过特别的存储进程 ADMIN_CMD 履行许多办理指令,然后把办理指令嵌入在运用程序代码中。这也适用于 LOAD FROM CURSOR 操作。存储进程 ADMIN_CMD 的运用与运用程序代码的方位无关,也就是说,在客户端代码(例如 Java 运用程序)和服务器端代码(例如 SQL/PL 存储进程)中都能够运用它。下面的示例在一个定制的 SQL/PL 存储进程中运用 ADMIN_CMD 存储进程。create_load_routine.sql 文件包括示例存储进程 REMOTE_LOAD_FROM_CURSOR 的 SQL/PL 源代码。

清单 18. 包括示例存储进程的 create_load_routine.sql 文件

存储进程中的第一个句子是 DELETE,它删去本地方针表 SALES 中现有的行。接下来,用恰当的 LOAD 指令调用 ADMIN_CMD,然后履行长途 LOAD FROM CURSOR 操作。这种办法与从指令行履行 LOAD FROM CURSOR 操作的差异如下:

不需求经过履行 DECLARE CURSOR 独自界说所需的游标。在 LOAD 指令中供给相应的 SELECT 句子,就会隐式地界说游标。只要在 ADMIN_CMD 调用中嵌入 LOAD FROM CURSOR 操作的状况下,这种语法才是有用的,在指令行上是无效的。

在 LOAD 指令中经过 DATABASE 选项界说长途数据库。不行能指定长途拜访所需的用户名/暗码组合。请在测验存储进程时调查这一束缚的影响。

可是,首要应该在方针数据库 MYSAMPLE 中创立存储进程。

清单 19. 创立示例存储进程

第一个测验调用失利,回来音讯 SQL30082N Security processing failed with reason 3 (PASSWORD MISSING). SQLSTATE=08001。

清单 20. 对示例存储进程的第一次测验失利

这个过错音讯是由于树立数据库衔接的办法形成的:db2 CONNECT TO

MYSAMPLE。在履行 CONNECT 句子时,没有供给用户名和暗码,因而运用登录操作体系所用的用户名树立衔接。在这种状况下,DB2 不知道此用户的暗码。在存储进程中履行 LOAD FROM CURSOR 操作时,DB2 测验用本地用户的授权 ID 衔接长途数据库 SAMPLE。可是,由于运用隐式的 CONNECT,DB2 不知道相应的暗码,所以长途拜访失利。因而,这个过错的原因如下:

由于经过 ADMIN_CMD 履行的 LOAD FROM CURSOR 操作不答应指定长途拜访所用的用户,所以 LOAD 操作自动地用归于本地数据库衔接的授权 ID 衔接长途数据库。

假如本地衔接的用户履行隐式的 CONNECT 而没有指定暗码,DB2 就不知道他/她的暗码,因而在测验衔接长途数据库时没有暗码可用。

经过 ADMIN_CMD 履行的长途 LOAD FROM CURSOR 操作的这一特色(无法指定长途拜访所用的用户)还有一个影响:当时衔接本地数据库的用户有必要用相同的授权 ID 拜访长途数据库。在运用联邦办法拜访长途数据库时,没有这一束缚,由于有必要以用户映射的方式界说额定的笼统层。

已然找到了过错的原因,就能够从头衔接本地数据库,这一次显式地指定用户名和暗码。对存储进程的第2次调用应该会成功 (Return Status = 0),见清单 21。

清单 21. 对示例存储进程的第2次测验成功

结束语

本文经过示例场景演示了怎么运用 DB2 的 LOAD FROM CURSOR 特性在一个数据库中以及不同的数据库之间快速轻松地仿制数据。还解说了经过 ADMIN_CMD 存储进程在运用程序代码中履行 LOAD FROM CURSOR 操作时的特别问题。别的,还讲解了怎么为另一个数据库装备联邦拜访,然后像拜访本地表或视图相同透明地读写长途数据库中的表和视图。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/187690.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部