欢迎投稿

今日深度:

DB2下数据转移任务操作实例(1)

DB2下数据转移任务操作实例(1)


使用 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 数据库

C:\>db2sampl
Creating
database "SAMPLE"...
Connecting
to database "SAMPLE"...
Creating tables
and data in schema "FECHNER"...
'db2sampl' processing complete.

除了其他表之外,SAMPLE 数据库包含一个名为 SALES 的表。在默认情况下,在表空间 USERSPACE1 中创建这个表。可以通过对 DB2 编目视图 SYSCAT.TABLES 和 SYSCAT.TABLESPACES 执行查询来确认这一点。

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

C:\>db2 "CONNECT TO SAMPLE"
Database Connection Information
Database server = DB2/NT 9.5.2
SQL
authorization ID = FECHNER
Local
database alias = SAMPLE
C:\
>db2 "SELECT TABLES.TABSCHEMA, TABLES.TABNAME, TBSPACES.TBSPACE FROM SYSCAT.TABLES AS
TABLES, SYSCAT.TABLESPACES
AS TBSPACES WHERE TABLES.TBSPACEID = TBSPACES.TBSPACEID AND
TABNAME
= 'SALES'"
TABSCHEMA
TABNAME
TBSPACE
------------------------------------------------------------------------------------------

-------- ---------------------------------------------------------------------------------

----------------- ------------------------------------------------------------------------

--------------------------

FECHNER
SALES
USERSPACE1
1 record(s) selected.

除了 USERSPACE1 表空间之外,还有第二个表空间 IBMDB2SAMPLEREL,它也用于存储用户数据。在这个示例场景中,IBMDB2SAMPLEREL 作为转移 SALES 表的目标表空间。执行 DB2 命令 LIST TABLESPACES,就可以看到一个数据库的所有表空间。清单 3 演示具体做法。

清单 3. 列出 SAMPLE 数据库的所有表空间

C:\>db2 "LIST TABLESPACES"
Tablespaces
for Current Database
Tablespace ID
= 0
Name
= SYSCATSPACE
Type
= Database managed space
Contents
= All permanent data. Regular table space.
State
= 0x0000
Detailed explanation:
Normal
Tablespace ID
= 1
Name
= TEMPSPACE1
Type
= System managed space
Contents
= System Temporary data
State
= 0x0000
Detailed explanation:
Normal
Tablespace ID
= 2
Name
= USERSPACE1
Type
= Database managed space
Contents
= All permanent data. Large table space.
State
= 0x0000
Detailed explanation:
Normal
Tablespace ID
= 3
Name
= IBMDB2SAMPLEREL
Type
= Database managed space
Contents
= All permanent data. Large table space.
State
= 0x0000
Detailed explanation:
Normal

在把 SALES 表的内容复制到 IBMDB2SAMPLEREL 表空间之前,必须在目标表空间中创建一个空表,此表的结构应该与 SALES 表相同。因为在同一个数据库模式中不可能有两个同名的表,所以临时用 SALES_TMP 这个名称创建新的表。通过在 CREATE TABLE 命令中指定 LIKE 选项,创建一个与现有表结构相同的空表(清单 4)。通过 IN 选项显式地定义新表 SALES_TMP 的表空间。

清单 4. 创建数据转移操作所需的目标表 SALES_TMP

C:\>db2 "CREATE TABLE FECHNER.SALES_TMP LIKE FECHNER.SALES IN IBMDB2SAMPLEREL"
DB20000I The SQL command completed successfully.

现在,可以执行数据转移操作了。使用 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 表

C:\>db2 "DECLARE C1 CURSOR FOR SELECT * FROM FECHNER.SALES"
DB20000I The SQL command completed successfully.
C:\
>db2 "LOAD FROM C1 OF CURSOR MESSAGES C:\load_sales_tmp.msg INSERT INTO
FECHNER.SALES_TMP NONRECOVERABLE"
Number of rows read = 41
Number of rows skipped = 0
Number of rows loaded = 41
Number of rows rejected = 0
Number of rows deleted = 0
Number of rows committed = 41

在把 SALES 表中的所有行成功地复制到 SALES_TMP 表之后,可以删除源表(DROP TABLE 语句)。然后,把目标表 SALES_TMP 重命名为 SALES(RENAME TABLE 语句)。在使用 RENAME TABLE 时,只能修改表名,而不能修改表的模式名。因此,一定要在正确的模式中创建 SALES_TMP 表。

清单 6. 删除源表 SALES 并重命名目标表 SALES_TMP

C:\>db2 "DROP TABLE FECHNER.SALES"
DB20000I The SQL command completed successfully.
C:\
>db2 "RENAME TABLE FECHNER.SALES_TMP TO SALES"
DB20000I The SQL command completed successfully.

再次对 DB2 编目视图执行查询,可以确认 SALES 表已经从原来的表空间 USERSPACE1 转移到了新的表空间 IBMDB2SAMPLEREL 中,见清单 7。

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

C:\>db2 "SELECT TABLES.TABSCHEMA, TABLES.TABNAME, TBSPACES.TBSPACE FROM SYSCAT.TABLES AS
TABLES, SYSCAT.TABLESPACES
AS TBSPACES WHERE TABLES.TBSPACEID = TBSPACES.TBSPACEID AND
TABNAME
= 'SALES'"
TABSCHEMA
TABNAME
TBSPACE
------------------------------------------------------------------------------------------

-------- ---------------------------------------------------------------------------------

----------------- ------------------------------------------------------------------------

--------------------------

FECHNER
SALES
IBMDB2SAMPLEREL
1 record(s) selected.
C:\
>db2 "TERMINATE"
DB20000I The TERMINATE command completed successfully.


www.htsjk.Com true http://www.htsjk.com/shujukugl/18077.html NewsArticle DB2下数据转移任务操作实例(1) 使用 DB2 LOAD 实用程序的 FROM CURSOR 选项简化 DB2 for Linux, UNIX, and Windows的数据转移过程。本文介绍 LOAD FROM CURSOR 特性并提供两个接口 Command Line Processor 和 AD...
评论暂时关闭