IBM Data Movement Tool 简介

轻松地将数据从源数据库迁移到 DB2

本文提供一个非常简单但强大的工具,可以轻松地移动各种不同来源的数据。这个工具的 DB2 兼容特性还支持轻松地移动 Oracle 和 Sybase 中的对象。该工具使来自 Oracle 和 Sybase 的应用程序能够在 IBM® DB2®, Version 9.7 for Linux®, UNIX®, and Windows® 上照常运行,并且不需要或仅需要少量更改。此外,该工具还用于将来自各种数据库管理系统的数据移动到 DB2 for Linux, UNIX, and Windows 和 DB2 for z/OS®。它还支持在 pureScale 环境中将源数据库中的数据移动到 DB2。

Vikram S. Khatri, 认证的 I/T 咨询专家, IBM

Vikram Khatri 在 IBM 的 Sales and Distribution 部门工作,是 DB2 迁移团队的一员,有 18 年的 IT 从业经验。Vikram 非常喜欢 DB2 数据库管理。他支持 DB2 技术销售部门的工作,帮助他们完成迁移项目和高性能基准测试。



2011 年 8 月 01 日 (最初于 2009 年 6 月 19 日)

免费下载:IBM® DB2® Express-C 9.7.2 免费版 或者 DB2® 9.7 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

该工具能够在 pureScale 环境中将来自不同源的数据移动到 DB2。

从 DB2 V9.7 for Linux, UNIX, and Windows 开始,在 DB2 产品上使用来自 Oracle 和 Sybase(Fixpack 3 之后)不再需要 Migration Toolkit (MTK) 。这个工具取代了 MTK 的功能,并且极大地简化了工作流程。

对于所有其他场景,例如将数据从某个数据库移动到 DB2 for z/OS,该工具在高速数据移动方面对 MTK 的支持尤其出色。使用该工具能够在短短的 3 天时间内移动多达 4TB 的数据。

GUI 为新手提供容易使用的界面,而高级用户往往更喜欢命令行 API。

准备

下载

首先,从 下载部分 中把这个工具下载到您的目标 DB2 服务器。把数据转移到 DB2 for z/OS 需要执行额外步骤。(查看该工具的最新可用版本。)

安装

下载了 IBMDataMovementTool.zip 文件之后,将该文件解压缩到目标 DB2 服务器上名为 IBMDataMovementTool 的目录中。为了实现最好的数据转移性能,强烈建议进行服务器端安装(在 DB2 上)。

前提条件

  • 如果希望在 DB2 for Linux, UNIX, and Windows 上运行 Oracle 应用程序,应该在目标服务器上安装 DB2 V9.7。
  • 在目标服务器上必须安装 Java™ 1.5 或更高版本。可以通过运行 java -version 命令检查当前的 Java 版本。在默认情况下,Java 作为 DB2 for Linux, UNIX, and Windows 的一部分安装在 <install_dir>\SQLLIB\java\jdk(Windows 操作系统)或 /opt/ibm/db2/V9.7/java/jdk(Linux 操作系统)目录下。
表 1. 源数据库和 DB2 的 JDBC 驱动程序的位置
数据库JDBC 驱动程序
Oracleojdbc5.jar 或 ojdbc6.jar 或 ojdbc14.jar、xdb.jar、xmlparserv2.jar 或 classes12.jar 或 classes111.jar(针对 Oracle 7 或 8i)
SQL Serversqljdbc5.jar 或 sqljdbc.jar
Sybasejconn3.jar 和 antsjconn2.jar(针对 DB2 SKIN 特性)
MySQLmysql-connector-java-5.0.8-bin.jar 或最新的驱动程序
PostgreSQLpostgresql-8.1-405.jdbc3.jar 或最新的驱动程序
DB2 for Linux, UNIX, and Windowsdb2jcc.jar、db2jcc_license_cu.jar 或 db2jcc4.jar、db2jcc4_license_cu.jar
DB2 for zdb2jcc.jar、db2jcc_license_cisuz.jar 或 db2jcc4.jar、db2jcc4_license_cisuz.jar
DB2 for ijt400.jar
Teradatraterajdbc4.jar 和 tdgssconfig.jar
MS AccessOptional Access_JDBC30.jar

环境设置

  • UNIX:作为 DB2 实例所有者登录服务器。
  • Windows:启动 DB2 命令窗口。
  • 切换到 IBMDataMovementTool 目录。这个工具包括一个 JAR 文件和两个驱动程序脚本。
    IBMDataMovementTool.cmd - Command script to run the tool on Windows.
    IBMDataMovementTool.sh - Command script to run the tool on UNIX.
    IBMDataMovementTool.jar - JAR file of the tool.
    Pipe.dll - A DLL required on Windows if pipe option is used.

创建 DB2 目标数据库

运行此工具需要连接目标数据库,所以必须首先创建这个数据库。在 DB2 V9.7 上,建议使用默认的自动存储并选择 32KB 页面大小。在 DB2 V9.7 上启用应用程序时,实例和数据库必须处于兼容模式。还建议调整舍入行为以匹配 Oracle。通过把重新验证语义(revalidation semantics)设置为 deferred_force,可以不按依赖次序部署对象。

在 UNIX 系统上

$ db2set DB2_COMPATIBILITY_VECTOR=ORA
$ db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
$ db2stop force
$ db2start
$ db2 "create db testdb automatic storage yes on /db2data1,
/db2data2,/db2data3 DBPATH ON /db2system PAGESIZE 32 K"
$ db2 update db cfg for testdb using auto_reval deferred_force
$ db2 update db cfg for testdb using decflt_rounding round_half_up

在 Windows 系统上

C:\> db2set DB2_COMPATIBILITY_VECTOR=ORA
C:\> db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
C:\> db2stop force
C:\> db2start
C:\> db2 "create db testdb automatic storage yes on C:,D: DBPATH ON E: PAGESIZE 32 K"
C:\> db2 update db cfg for testdb using auto_reval deferred_force
C:\> db2 update db cfg for testdb using decflt_rounding round_half_up

提取对象和数据

在运行此工具之前,应该准备好源数据库和 DB2 服务器的以下信息:

  • 源数据库和 DB2 服务器的 IP 地址或主机名
  • 要连接的端口号
  • 需要的数据库名、SID、子系统名等等
  • 在源数据库上有 DBA 特权的用户 ID
  • 此用户的密码
  • 源数据库和 DB2 JDBC 驱动程序的位置
  • 将存储数据的空间或卷/挂载点信息

在 Windows 上运行 IBMDataMovementTool.cmd,或在 UNIX 上运行 ./IBMDataMovementTool.sh。如果服务器能够显示图形,此工具会启动一个 GUI。否则,它会切换到交互式命令行模式。

On Windows:
IBMDataMovementTool.cmd

On UNIX:
chmod +x IBMDataMovementTool.sh
./IBMDataMovementTool.sh

DB2_COMPATIBILITY_VECTOR 是什么?

DB2_COMPATIBILITY_VECTOR 用于将 DB2 V9.7 实例和数据库设置为与 Oracle 兼容的模式。要了解详细情况请参阅 DB2 V9.7 Information Center。

现在会看到一个 GUI 窗口。shell 窗口中还应该出现一些消息。在开始使用 GUI 之前,请确认这些消息没有错误。

如果没有设置 DB2_COMPATIBILITY_VECTOR,此工具会报告一个警告。请按以下步骤设置兼容向量(如果还没有这么做的话)。

[2010-01-10 17.08.58.578] INPUT Directory = .
[2010-01-10 17.08.58.578] Configuration file loaded: 'jdbcdriver.properties'
[2010-01-10 17.08.58.593] Configuration file loaded: 'IBMExtract.properties'
[2010-01-10 17.08.58.593] appJar  : 'C:\IBMDataMovementTool\IBMDataMovementTool.jar'
[2010-01-10 17.08.59.531] DB2 PATH is C:\Program Files\IBM\SQLLIB
[2010-01-10 17.35.30.015] *** WARNING ***. The DB2_COMPATIBILITY_VECTOR is not set.
[2010-01-10 17.35.30.015] To set compatibility mode, discontinue this program and 
                          run the following commands
[2010-01-10 17.35.30.015] db2set DB2_COMPATIBILITY_VECTOR=FFF
[2010-01-10 17.35.30.015] db2stop force
[2010-01-10 17.35.30.015] db2start

使用图形用户界面

图 1 所示的 GUI 上有用于指定源和 DB2 数据库连接信息的字段。在这个屏幕上执行以下步骤:

  1. 指定源和 DB2 连接信息。
  2. 单击 Connect to Oracle 测试连接。
  3. 单击 Connect to DB2 测试连接。
  4. 指定 DDL 和数据要提取到的工作目录。
  5. 选择是否需要 DDL 和/或数据。如果只选择 DDL,那么会生成额外的 genddl 脚本。
  6. 单击 Extract DDL/Data 按钮。可以在控制台窗口中监视进度。
  7. 成功地完成数据提取之后,在产生的输出文件中查看数据转移的状态、警告、错误和其他潜在问题。
  8. 还可以单击 View Script/Output 按钮检查生成的脚本、DDL、数据或输出日志文件。
  9. 单击 Deploy DDL/Data 按钮在 DB2 中创建表和索引并装载从源数据库提取的数据。
  10. 可以使用 Execute DB2 Script 运行生成的 DB2 脚本,而不是从命令行运行它。数据转移是一个交互式活动。如果需要在开始刷新之前删除所有表,可以选择并执行删除表脚本。还可以使用这个按钮按您希望的次序执行脚本。
图 1. 源和 DB2 数据库的输入参数
提取和部署数据

在单击 Extract DDL/Data 按钮之后,会在图 2 所示的 View File 选项卡中看到工具的消息。

图 2. 提取 DDL 和数据
提取 DDL 和数据

在提取完 DDL 和数据之后,会在工作目录中看到几个新创建的文件。这些文件可以用于在命令行中运行 DB2。

配置文件

在每次以 GUI 模式运行此工具时,重新生成下面的命令脚本。但是,可以不使用 GUI,而是使用这些脚本执行所有数据转移步骤。这有助于把此工具嵌入批处理过程,实现自动化的数据转移。

表 2. 命令脚本
文件名说明
IBMExtract.properties这个文件包含通过 GUI 或命令行指定的所有输入参数。可以手工编辑这个文件,修改或纠正参数。注意:在每次运行 GUI 时,会覆盖这个文件。
unload这是由该工具创建的脚本。如果勾选 DD 和 Data 选项,这个脚本把源数据库服务器中的数据卸载到平面文件。如果在 GUI 中勾选管道选项来去掉中间平面文件,该脚本将使用管道把数据从源数据库移动到 DB2。管道选项由 IBMExtract.properties 文件中的 usePipe 选项控制。
rowcount这是由该工具创建的脚本。在完成数据部署之后,运行该脚本对源和目标数据库服务器中表的行数执行检查。
图 3. 提取数据之后创建的文件
步骤 2. 创建的文件

使用命令行模式

如果在服务器上无法使用 GUI 功能,那么可以使用命令行模式运行此工具。如果无法启动 GUI,工具会自动地切换模式。如果希望强制以命令行交互模式运行工具,可以在 IBMDataMovementTool 命令中指定 -console 选项。

On Windows:
IBMDataMovementTool -console
On UNIX:
./IBMDataMovementTool.sh	-console


可以通过交互选项依次指定源和 DB2 数据库连接参数。下面是控制台窗口中的输出示例:

[2010-01-10 20.08.05.390] INPUT Directory = .
[2010-01-10 20.08.05.390] Configuration file loaded: 'jdbcdriver.properties'
[2010-01-10 20.08.05.390] Configuration file loaded: 'IBMExtract.properties'
[2010-01-10 20.08.05.390] appJar  : 'C:\IBMDataMovementTool\IBMDataMovementTool.jar'
Debug (Yes)        : 1
Debug (No)         : 2
Enter a number (Default=2) :
IS TARGET DB2 LOCAL (YES)   : 1
IS TARGET DB2 REMOTE (NO)   : 2
Enter a number (Default=1) :
Extract DDL (Yes)        : 1
Extract DDL (No)         : 2
Enter a number (Default=1) :
Extract Data (Yes)        : 1
Extract Data (No)         : 2
Enter a number (Default=1) :
Enter # of rows limit to extract.  (Default=ALL) :
Enter # of rows limit to load data in DB2.  (Default=ALL) :
Compress Table in DB2 (No)     : 1
Compress Table in DB2 (YES)    : 2
Enter a number (Default=1) :
Compress Index in DB2 (No)     : 1
Compress Index in DB2 (YES)    : 2
Enter a number (Default=1) :
******* Source database information: *****
Oracle                  : 1
MS SQL Server           : 2
Sybase                  : 3
MS Access Database      : 4
MySQL                   : 5
PostgreSQL              : 6
DB2 z/OS                : 7
DB2 LUW                 : 8
Enter a number (Default 1) :
DB2 Compatibility Feature (DB2 V9.7 or later)  : 1
No Compatibility feature                       : 2
Enter compatibility feature (Default=1) :

部署对象和装载数据

创建数据库目标对象

在提取 DDL 和数据之后,可以以三种方法在 DB2 中部署提取的对象。

  • 单击 GUI 屏幕上的 Deploy DDL/DATA 按钮
  • 进入 Interactive Deploy 选项卡并按步骤部署对象
  • 使用命令行脚本 db2gen 部署 DDL/数据

选用哪种方法部署数据取决于数据和对象转移需求。如果只迁移非 PL/SQL DDL 对象和数据,那么使用 db2gen 脚本或单击 GUI 上的 Deploy DDL/DATA 按钮就够了。

如果还要部署 PL/SQL 对象,比如触发器、函数、过程和 PL/SQL 包,那么交互式部署选项可能更好。

图 4 所示的 GUI 屏幕用于以交互方式部署 DDL 和其他数据库对象。在这个屏幕上执行以下步骤:

  1. 使用 Extract/Deploy 选项卡确认连接到 DB2。
  2. 单击 Interactive Deploy 选项卡。
  3. 使用 Open Directory 按钮选择包含以前提取的对象的工作目录。对象在一个树视图中列出。
  4. 可以按工具栏上的 Deploy All Objects 按钮部署所有对象。大多数对象会成功地部署,但是一些对象可能会部署失败。
  5. 单击树视图中部署失败的对象时,可以在编辑器窗口中看到这个对象的源代码。下面的部署日志列出失败的原因。
  6. 在一般情况下,Oracle 兼容模式允许按原样 部署对象。但是,仍然可能有不支持的特性,它们会妨碍成功地部署某些对象。可以使用编辑器调整这些对象的源代码以解决任何问题。在部署修改后的对象时,会保存新的源代码并备份原来的源代码。
  7. 编辑对象之后,可以使用 CTRL 键选择一个或多个对象,然后单击工具栏上的 Deploy Selected Objects 按钮部署这些对象。部署失败常常是相关联的;在这种情况下,成功地部署一个对象之后,依赖于它的其他对象也就可以部署了。
  8. 重复步骤 5 到步骤 7,直到成功地部署所有对象。
图 4. 交互式地部署对象
步骤 3. 交互式部署

比较行数

  • 进入数据转移的根目录并运行 rowcount 脚本。
  • 应该会在 “<source database name>.tables.rowcount” 文件中看到生成的报告。这个报告包含源和目标数据库的行数。
oracle                      :       db2
"TESTCASE"."CALL_STACKS"    : 123   "TESTCASE"."CALL_STACKS"      : 123
"TESTCASE"."CLASSES"        : 401   "TESTCASE"."CLASSES"          : 401
"TESTCASE"."DESTINATION"    : 513   "TESTCASE"."DESTINATION"      : 513

使用管道移动数据

当源数据库过大并且没有足够的空间来容纳中间数据文件时,推荐使用管道来移动数据。

在 Windows 系统上

该工具使用 Pipe.dll 来创建 Windows 管道,并确保将这个 dll 文件位于 IBMDataMovementTool.jar 文件所在的目录下。

在 UNIX 系统上

该工具使用 mkfifo 命令创建 UNIX 管道来将数据从源数据库移动到 DB2。

要在源数据库和 DB2 之间使用管道之前,必须先创建表定义。请遵循以下步骤:

  1. 如果使用命令行窗口的话,在 GUI 中指定 # Extract Rows=1 in the GUI 或在 IBMExtract.properties 中设置 LimitExtractRows=1
  2. 单击 Extract DDL/Data 按钮卸载数据,或者从命令行窗口运行 unload 脚本。
  3. 单击 Deploy DDL/Data 按钮,或者从命令行窗口运行 db2gen 脚本。
  4. 如果使用命令行窗口,选择 Use Pipe 或者在 IBMExtract.properties 中设置 usepipe=true
  5. 单击 Extract / Deploy through Pipe Load 按钮,或者从命令行窗口运行 unload 脚本。
图 5. 使用管道移动数据
步骤 4. 使用管道

DB2 on z/OS 所需的额外步骤

z/OS 上的 UNLOAD 过程

  • 运行这个工具需要 USS,但是 z/OS 上的 DB2 LOAD 无法使用 HFS 文件装载数据。因此,需要使用 JZOS 工具包从 Unix System Services 在 z/OS 上创建 PS 数据集。但是,DB2 LOAD 可以使用 USS(或 HFS)文件在 DB2 中装载 CLOBS/BLOBS。因此,在 z/OS 上创建 PS 数据集,从而把数据从源数据库转移到 z/OS,并使用 Unix System Services HFS 文件保存所有 BLOBS/CLOBS。
  • 不能从 USS 运行 LOAD 语句。应该使用 SYSPROC.DSNUTILS 存储过程运行 LOAD、CHECK DATA 和 RUN STATS。
  • 创建 PS 数据集可能比较困难,因为需要为每个表分配 PS 数据集。无法预先分配固定的大小,因为表的大小是未知的。这在 z/OS 上可能浪费许多空间。为了避免空间问题,使用一个算法分配大小。

可以在 z/OS 上使用这个工具把数据从源数据库转移到 DB2 for z/OS。但是,需要执行下面的额外步骤。

  1. 通过这个链接 下载 和安装 JZOS。
  2. 这个 zip 文件包含一个名为 jzos.pax 的文件。使用 Unix System Services 通过 FTP 以二进制模式把这个文件传输到要安装 JZOS 的目录。
  3. 转到保存 .pax 文件的目录。
  4. 运行命令:pax -rvf。这会在当前工作目录中创建一个名为 jzos 的子目录。后面把这个子目录称为 <JZOS_HOME>。
  5. 在用户的主目录中,基于以下模板创建一个名为 .profile 的文件,根据您的 z/OS DB2 安装情况进行修改。
    export JZOS_HOME=$HOME/jzos
    export JAVA_PATH=/usr/lpp/java/J1.5
    export PATH=$JAVA_HOME/bin:$PATH		        
    export CLPHOME=/usr/lpp/db2/db2910/db2910_base/lib/IBM                  
    export CLASSPATH=$CLASSPATH:/usr/lpp/db2/db2910/db2910_base/lib/clp.jar 
    export CLPPROPERTIESFILE=$HOME/clp.properties                           
    export LIBPATH=$LIBPATH:<JZOS_HOME<                               
    alias db2="java com.ibm.db2.clp.db2"
  6. 必须根据您的环境修改 CLPHOME 和 CLASSPATH。把 <JZOS_HOME> 替换为适当的目录。
  7. 在用户的主目录中,基于以下模板创建一个名为 clp.properties 的文件:
    #Specify the value as ON/OFF or leave them blank              
    DisplaySQLCA=ON                                               
    AutoCommit=ON                                                 
    InputFilename=                                                
    OutputFilename=                                               
    DisplayOutput=                                                
    StopOnError=                                                  
    TerminationChar=                                              
    Echo=                                                         
    StripHeaders=                                                 
    MaxLinesFromSelect=                                           
    MaxColumnWidth=20                                             
    IsolationLevel=                                               
    <SUBSYSTEM_NAME>=<IP address>:<port number>/<location name>,USER,PASSWD
    
    Replace items on the last line as appropriate.
  8. 运行命令 chmod 777 <JZOS_HOME>/*.so。
  9. 运行 IBMDataMovementTool.sh -console 命令并通过交互式用户响应指定参数值。
  10. 工具替您创建 IBMExtract.properties、geninput 和 unload 脚本。
  11. IBMExtract.properties 中的 zdb2tableseries 参数指定 PS 数据集序列的名称。例如,如果您的 TSO ID 是 DNET770,而这个参数设置为 R,那么为第一个表创建的 PS 数据集名为 DNET777.TBLDATA.R0000001。
  12. znocopypend 参数用于在 LOAD 语句中添加 NOCOPYPEND 参数。z/OS DB2 DBA 可以使用这个参数执行备份,因为表不会处于 COPY pending 模式。
  13. zoveralloc 参数指定希望扩大文件分配请求的程度。值 1 表示根本不扩大。在有足够空闲存储的环境中,这可能是合适的。在真实环境中,15/11 (1.3636) 是比较好的估计值。建议先采用 1.3636 (15/11),然后逐渐降低这个值,直到出现文件写错误,然后再增加一点。如果知道 SMS 参数 REDUCE SPACE UP TO 的值,那么可以按 1 / (1 - (X/100)) 计算最合适的 overAlloc 值,其中的 X 是 REDUCE SPACE UP TO 的值(表示为 0 - 100 的整数)。注意,REDUCE SPACE UP TO 表示一个百分数。
  14. zsecondary 参数用于分配固定的辅助 extent。先采用 0 值,然后逐渐增加它,直到出现文件错误,再降低它。
  15. 运行 geninput 脚本为卸载过程创建输入文件。
  16. 运行 unload 脚本生成 DDL 和数据。
  17. 运行生成的脚本创建 DDL 并在 z/OS DB2 上装载数据。
  18. 如果不删除这些数据集,DSNUTILS 会失败。下面的 Java 程序可以删除这些中间数据集。
    java -cp /u/dnet770/migr/IBMDataMovementTool.jar:$JZOS_HOME/ibmjzos.jar \
    -Djava.ext.dirs=${JZOS_HOME}:${JAVA_HOME}/lib/ext ibm.Cleanup
  19. 在把数据装载到 z/OS 上的 DB2 表中之后,可能会发现需要删除的数据集。使用下面的 Java 程序删除这些数据集。

    创建如下所示的脚本 jd:

    JZOS_HOME=$HOME/jzos
    JAVA_HOME=/usr/lpp/java/J1.5
    CLASSPATH=$HOME/migr/IBMDataMovementTool.jar:$JZOS_HOME/ibmjzos.jar
    LIBPATH=$LIBPATH:$JZOS_HOME
    
    $JAVA_HOME/bin/java -cp $CLASSPATH \
    -Djava.ext.dirs=${JZOS_HOME}:${JAVA_HOME}/lib/ext ibm.Jd $1

    把文件权限改为 755,运行它,会出现以下输出:

    DNET770:/u/dnet770/migr: >./jd
    USAGE: ibm.Jd <filter_key>
    USAGE: ibm.Jd "DNET770.TBLDATA.**"
    USAGE: ibm.Jd "DNET770.TBLDATA.**.CERR"
    USAGE: ibm.Jd "DNET770.TBLDATA.**.LERR"
    USAGE: ibm.Jd "DNET770.TBLDATA.**.DISC"

    因此,如果希望删除 “DNET770.TBLDATA” 下面的所有数据集,应该使用以下命令。

    DNET770:/u/dnet770/migr: >./jd "DNET770.TBLDATA.**"

大型数据转移计划

这个工具最适合大规模数据转移。采用良好的计划和过程,这个工具曾经在三天内转移过 4TB 的 Oracle 数据。下面给出一些提示和技术,可以帮助您在有限的时间内完成大规模数据转移。

硬件需求和容量计划

对硬件需求和数据库容量计划的讨论超出了本文的范围,但是在估计完成大规模数据转移的时间时一定要考虑以下因素。

  • 在源和 DB2 服务器之间需要良好的网络连接,带宽最好为 1GBPS 或更高。网络带宽会限制完成数据转移的时间。
  • 源服务器上的多个 CPU 允许并行地卸载多个表。对于大于 1TB 的数据库,在源服务器上应该有至少 4 个 CPU。
  • DB2 服务器上的 CPU 数量决定 LOAD 过程的速度。根据经验,1/4 到 1/3 的时间用于装载数据,其他时间用于卸载过程。
  • 事先计划 DB2 数据库布局。请参考 DB2 for Linux, UNIX, and Windows 最佳实践

提示和技术

  • 通过命令行模式了解工具。使用 GUI 生成数据转移脚本(geninput 和 unload),通过在命令行上运行 unload 脚本执行数据卸载。
  • 通过在 unload 脚本中设置 GENDDL=trueUNLOAD=false,只从源数据库提取 DDL。使用生成的 DDL 计划表空间和表映射。通过在 unload 脚本中使用 -DOUTPUT_DIR 参数指定目标目录,使用单独的输出目录存储生成的 DDL 和数据。DDL 的生成应该在最终的数据转移之前执行。
  • 使用 geninput 脚本生成要从源数据库转移到 DB2 的表列表。在 geninput 脚本中使用 SRCSCHEMA=ALLDSTSCHEMA=ALL 参数生成包含所有表的列表。通过编辑文件,删除不需要的表并把它分割为几个输入文件,这样就可以采用分阶段转移方式,也就是并行地执行从源数据库卸载和装载到目标数据库。
  • 在把(geninput 脚本生成的)表输入文件分割为几个文件之后,把 unload 脚本复制到多个文件中,修改输入文件名,为每个卸载过程指定不同的目录。例如,可以创建 10 个卸载脚本,每个卸载脚本卸载 500 个表,总共 5000 个表。
  • 一定要分别转移 DDL 和数据。对于大规模数据转移,不要在一步中执行这两个任务。
  • 这个工具并行地从源表卸载数据,并行度由 unload 脚本中的 NUM_THREADS 参数控制。默认值是 5,可以增加它,直到源服务器上的 CPU 利用率达到大约 90%。
  • 注意输入文件中列出的表。geninput 脚本并不按特定的次序安排表,您需要调整表的次序以减少卸载时间。输入文件中列出的表以循环方式提供给线程池。常常出现大多数线程已经完成卸载过程,只有一个线程仍然在运行的情况。为了保持所有线程都忙碌,应该在输入文件中以行数递增的次序组织表。
  • 可能出现大多数表都已经卸载,只有几个线程仍然在卸载非常大的表的情况。如果在输入文件中正确地指定 WHERE 子句,就可以在多个线程中卸载同一个表。例如:
    "ACCOUNT"."T1":SELECT * FROM "ACCOUNT"."T1" WHERE id between 1 and 1000000
    "ACCOUNT"."T1":SELECT * FROM "ACCOUNT"."T1" WHERE id between 1000001 and 2000000
    "ACCOUNT"."T1":SELECT * FROM "ACCOUNT"."T1" WHERE id between 2000001 and 3000000
    "ACCOUNT"."T1":SELECT * FROM "ACCOUNT"."T1" WHERE id between 3000001 and 4000000

    要确保在 WHERE 子句中使用正确的键,这个键最好是主键或惟一索引。工具负责使用正确的 DB2 LOAD 脚本从工具生成的多个文件装载数据。在多个线程中卸载同一个表不需要其他设置,只需要添加 WHERE 子句。

  • 把卸载过程分为多个步骤之后,可以在完成一批数据卸载时开始在 DB2 中同时装载数据。关键是每批卸载使用不同的输出目录。在 DB2 中装载数据所需的所有文件都在输出目录中生成。对于 DDL,使用生成的 db2ddl 脚本创建表定义。对于数据,使用 db2load 脚本在 DB2 中装载数据。如果在一个步骤中处理 DDL 和数据,那么脚本名为 db2gen
  • 通过 shell 脚本自动执行整个过程,让卸载和装载过程同步。从 Oracle 或其他数据库到 DB2 的每个大规模数据转移都是独特的。您应该根据经验决定如何自动执行所有作业。使用 tee 命令把作业的输出保存在一个文件中,这样就可以观察进度,还应该把输出保存在日志文件中。

运行模拟测试

应该进行模拟数据转移,以便测试自动化过程,检查计划的分阶段卸载和装载方式是否正常。只需通过创建 shell 脚本以正确的次序运行这些任务。按照以下步骤运行模拟测试:

  1. 把数据转移脚本和自动化 shell 脚本复制到一个模拟目录中。
  2. 在几个线程中卸载少数几个大表,并相应地分阶段转移数据,以此估算时间。
  3. 添加 WHERE 子句以限制转移的数据行数。例如,在 Oracle 中可以添加 ROWNUM 子句以限制行数,对于 SQL Server 使用 TOP 子句。
    "ACCOUNT"."T1":SELECT * FROM "ACCOUNT"."T1" WHERE rownum < 100
    "ACCOUNT"."T2":SELECT * FROM "ACCOUNT"."T2" WHERE rownum < 100
    "ACCOUNT"."T3":SELECT * FROM "ACCOUNT"."T3" WHERE rownum < 100
    "ACCOUNT"."T4":SELECT * FROM "ACCOUNT"."T4" WHERE rownum < 100
  4. 运行脚本,做必要的修改,为最终运行做好准备。

最终运行

  1. 已经提取了 DDL,对表和表空间之间的映射做了必要的手工修改。
  2. 停机,开始数据转移。
  3. 如果 Oracle 数据库是源数据库,要确保设置大约 10000 个打开的游标。
  4. 观察日志文件中的输出。

对于大规模数据转移,要仔细地制定计划并考虑作业的自动化。这个工具提供这种转移所需的所有功能。这个小工具曾经成功地把数据从非常大的源数据库转移到 DB2。

工具支持

IBM 支持部门并不支持这个工具。但是,可以在 论坛 中报告 bug、问题、意见和改进建议。

常见问题

表 3. 常见问题
问题回答
为了使用这个工具,是否需要在源数据库服务器上安装什么东西? 不需要为了使用这个工具在源数据库上安装任何东西。
这个工具支持哪些平台?Windows、z/OS、AIX、Linux、UNIX、HP-UX、Solaris、Mac 以及有 JVM 的任何平台。
我在 Linux/Unix 平台上从一个安全 shell 窗口运行这个工具,在命令行 shell 中看到了一些消息,但是没有看到 GUI,似乎这个工具停止运行了。根据您的 DISPLAY 设置,在有显示能力的服务器上会打开 GUI 窗口。您需要正确地导出 DISPLAY 设置。请咨询您的 Unix 系统管理员。
我打算转移 PostgreSQL 中的数据,但是没有看到这个工具附带的 PostgreSQL JDBC 驱动程序。由于许可证问题,这个工具没有提供 JDBC 驱动程序。您应该从自己的已经获得许可的软件中获得数据库 JDBC 驱动程序。
不可能将从 Oracle 数据库提取用户数据的权限授予 DBA。我如何才能使用该工具?您至少需要将授予用户的 SELECT_CATALOG_ROLE 权限和表上用于迁移的 SELECT 特权。
这个工具可以连接哪些数据库?具有 type-IV JDBC 驱动程序的任何数据库。因此,可以连接 MySQL、PostgreSQL、Ingres、SQL Server、Sybase、Oracle、DB2 等数据库。它还可以连接具有 ODBC-JDBC 连接器的数据库,所以还可以从 Access 数据库转移数据。
运行这个工具需要 Java 的哪个版本?运行这个工具至少需要 Java 1.5。依赖于 Java 1.5 主要是由于工具的 GUI 部分。如果确实需要对 Java 1.4.2 的支持,请通知我,我会针对 Java 1.4.2 编译它,但是 GUI 不会运行以创建数据转移驱动程序脚本。

可以运行以下命令检查 Java 版本:


$ java -version
C:\>java -version
如何检查工具的版本?在 Windows 上运行 IBMDataMovementTool -version,或者在 Linux/UNIX 上运行 ./IBMDataMovementTool.sh -version
我在运行工具时遇到了错误 “Unsupported major.minor version 49.0” 或 “(.:15077): Gtk-WARNING **: cannot open display:”。您使用的 Java 版本低于 1.5。安装高于 1.4.2 的 Java 版本即可解决这个问题。我们建议您安装 IBM Java。
为了运行这个工具,需要源数据库和 DB2 数据库服务器的哪些信息?需要知道源和 DB2 数据库的 IP 地址、端口号、数据库名、用户 id 和密码。源数据库的用户 id 应该具有 DBA 特权,DB2 数据库的用户 id 应该具有 SYSADM 特权。
我在 Windows 工作站上运行这个工具,它运行得非常慢。在 IBMDataMovementTool.cmd 或 IBMDataMovementTool.sh 命令脚本中,分配给这个工具的默认内存量为 990MB(使用 JVM 的 -Xmx 开关指定)。如果工作站上的内存比较少,请尝试减少分配的内存。
我要把数据从 SQL Server 转移到 DB2,希望 TEXT 字段在 DB2 中存储为 VARCHAR。在 IBMExtract.properties 文件中指定 mssqltexttoclob=true。
我要把数据从 Sybase 转移到 DB2,但是它并不把 T-SQL 过程转移到 DB2。这个工具只用于 DDL 和数据转移。必须使用 MTK 进行过程/触发器转移。
我要把 DDL 从 Sybase 转移到 DB2,而且已经把 Sybase 对象保存在文件中了。我不知道如何指定 DDL 文件作为数据源。这个工具的用途是高速数据转移,因此没有提供把 DDL 文件从另一个数据库传输到 DB2 的功能。但是,可以使用 IBM InfoSphere Data Architect 把 DDL 文件从源数据库传输到目标数据库。
我要把数据从 MS Access 转移到 DB2,但是在生成的 DDL 中没有看到索引等内容。我们使用基本的 ODBC-JDBC 连接器连接 MS Access 数据库。要想获得完整的 DDL 集,需要使用商业 JDBC 驱动程序。可以试试 HXTT JDBC driver for MS Access。如果使用 HXTT 驱动程序,那么必须在生成的 unload 脚本中指定 DBVENDOR=hxtt。
我要使用这个工具把数据从 Sybase 转移到 DB2,但是遇到了许多错误。这很可能是因为您的 Sybase 数据库没有启用所需的 JDBC 支持。请与您的 Sybase DBA 联系,确认 Sybase 数据库中安装了正确的 JDBC 存储过程。
我要把数据从 MySQL 转移到 DB2,但是出现了内存不足。尝试在生成的 unload 脚本中为 FETCHSIZE=nnn 指定不同的值,然后从命令行运行数据转移。如果使用 GUI 工具,它会覆盖 unload 脚本。
我要把数据从 Oracle 转移到 DB2,我注意到数据转移需要三个 jar 文件。但是,我认为数据转移只需要 JDBC 驱动程序。为什么需要另外两个 jar 文件?另外的 jar 文件主要是 Oracle XML 数据类型需要的。应该可以在 Oracle 安装目录中找到这些文件。
我希望 Oracle 数据类型 CLOB 在 DB2 中存储为 DBCLOB。在 IBMExtract.properties 文件中设置 DBCLOB=true
我要使用这个工具把数据从 Oracle 转移到 DB2,但是遇到了许多 Oracle SQL 错误,它们指出没有找到某个表。连接 Oracle 的用户 id 应该具有 DBA 和 SELECT_CATALOG_ROLE 特权。
我不希望 NCHAR 和 NVARCHAR2 在 DB2 中存储为 GRAPHIC 或 VARGRAPHIC。希望它们存储为 CHAR 和 VARCHAR2,因为我在创建 DB2 数据库时启用了 UTF-8。在 IBMExtract.properties 文件中设置 GRAPHIC=false
可以把数据从 Oracle 数据库转移到版本低于 V9.7/V9.5 的 DB2 吗?可以,在 IBMExtract.properties 中设置 db2_compatibility=false。
我注意到这个工具把 Oracle 的 NUMBER(38) 转换为 NUMBER(31),我认为这是因为 DB2 只支持最多 31 位。我不希望舍入,希望把它转换为 DOUBLE。在 IBMExtract.properties 中设置 roundDown_31=false
我遇到了许多数据被拒绝的情况。如何把被拒绝的数据保存到一个文件中,让我能够分析拒绝的原因。在 IBMExtract.properties 中设置 dumpfile=true
我要把数据从工作站装载到 DB2 服务器,但是遇到了错误。只能从服务器运行这个工具吗?最好从 DB2 服务器运行这个工具从源数据库提取数据,避免使用中间服务器。但是,如果希望从中间服务器运行这个工具,可以在生成的 unload 脚本中指定 REMOTELOAD=TRUE。请记住,转移 BLOBS/CLOBS/XML 数据需要使用服务器上的 DB2 LOAD 实用程序。需要在目标 DB2 服务器上以相同的命名约定挂载这些目录。
我只能通过 SSH shell 登录 DB2 服务器,在 DB2 服务器上不允许运行 X-Windows。我如何运行这个工具来转移 DDL 和数据?从 SSH 运行 IBMDataMovementTool.sh,如果服务器不支持图形,工具会自动地切换到命令行模式。如果它由于某种原因没有切换,就给 IBMDataMovementTool.sh 命令指定 -console 选项,这会迫使工具以交互式命令行模式运行。命令行模式可以收集输入并生成数据转移所需的脚本。GUI 只用来生成脚本,实际工作完全通过脚本执行。
既然要求用户指定数据库名,为什么不通过脚本创建 DB2 数据库?DBA 一般喜欢根据存储路径信息创建数据库。但是,我们要创建必需的表空间,让 DB2 自动地把表放到适当的表空间中。您应该参考 IBM 最佳实践 小心地为数据库制定计划。建议在创建 DB2 数据库时采用 32K 的默认页面大小。
除了 Oracle JDBC 驱动程序之外,为什么还需要 xdb.jar 和 xmlparserv2.jar?如果 Oracle 数据包含 XML 数据,则需要使用 xdb.jar 和 xmlparserv2.jar。您可以在 lib 文件夹下的 server/RDBMS/jlib 和 xmlparserv2.jar 文件夹下找到 xdb.jar。如果不能找到它们,可以下载 Oracle XDK for Java。
我遇到了 java.lang.UnsatisfiedLinkError: Pipe。Pipe.dll 不是有效的 Win32 应用程序。我如何解决该问题?如果在安装 32 位 Java JVM 的 64 位 Windows 平台上使用该工具,将出现该问题。在您的 Windows 平台上安装 64 位的 JVM,然后重新运行该工具。

致谢

世界各地的许多 IBM 员工为这个工具提供了有价值的反馈,如果没有他们的反馈,这个工具不可能达到现在的水平。我要特别感谢以下各位提供的帮助、反馈、建议和指导。

  • Jason A Arnold
  • Serge Rielau
  • Marina Greenstein
  • Maria N Schwenger
  • Patrick Dantressangle
  • Sam Lightstome
  • Barry Faust
  • Vince Lee
  • Connie Tsui
  • Raanon Reutlinger
  • Antonio Maranhao
  • Max Petrenko
  • Kenneth Chen
  • Masafumi Otsuki
  • Neal Finkelstein

免责声明

本文包含一个工具。IBM 授予您(“被许可方”)使用这个工具的非专有的、版权免费的许可证。然而,这个工具是 “按现状” 提供的,没有任何形式的(不论是明示的,还是默示的)保证,包括对适销性、适用于特定用途或非侵权性的默示保证。IBM 及其许可方不对被许可方由于使用该软件所导致的任何损失负责。任何情况下,无论损失是如何发生的,也不管责任条款怎样,IBM 或其许可方都不对由使用该软件或不能使用该软件所引起的收入的减少、利润的损失或数据的丢失,或者直接的、间接的、特殊的、由此产生的、附带的损失或惩罚性的损失赔偿负责,即使 IBM 已经被明确告知此类损害的可能性,也是如此。

参考资料

学习

获得产品和技术

讨论

更多下载

  • IBM Data Movement Tool (这款工具的版本更新得非常快,以对 bug 进行修复或添加新的特性。从图形用户界面单击 Help > Check New Version 或者输入命令 ./IBMDataMovementTool.sh -check 检查是否有新的版本可供下载。可以从 Help > About 菜单选项或输入 ./IBMDataMovementTool.sh -version 命令找到该工具的版本号。该工具的 GUI 接口使用了 JGoodies Forms 1.2.1、JGoodies Look 2.2.2 和 JSyntaxPane 0.9.4 包。)

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=750051
ArticleTitle=IBM Data Movement Tool 简介
publish-date=08012011