IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management  >

DB2 9.7: IBM Data Movement Tool

把应用程序轻松地从 Oracle 迁移到 DB2

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论

样例代码

英文原文

英文原文


级别: 中级

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

2009 年 6 月 19 日
更新 2009 年 8 月 10 日

本文提供一个非常简单但强大的工具,可以把应用程序从 Oracle 迁移到 IBM® DB2® Version 9.7 for Linux®, UNIX®, and Windows® 上。还可以使用这个工具把数据从其他数据库管理系统转移到 DB2 for Linux, UNIX, and Windows 和 DB2 for z/OS®。

简介

从 DB2 V9.7 for Linux, UNIX, and Windows 开始,不再需要通过 Migration Toolkit (MTK) 在 DB2 产品上使用 Oracle 应用程序。Data Movement Tool 替代了 MTK 功能并显著简化了工作流。

对于所有其他场景,例如把数据从数据库转移到 DB2 for z/OS,这个工具在高速数据转移方面尤其出色。曾经使用这个工具在三天内转移了 4TB 数据。

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

准备

下载

首先,从 下载 中把这个工具下载到您的目标 DB2 服务器。把数据转移到 DB2 for z/OS 需要执行额外步骤。

安装

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

前提条件

  • 如果希望在 DB2 for Linux, UNIX, and Windows 上运行 Oracle 应用程序,应该在目标服务器上安装 DB2 V9.7。
  • 在目标服务器上必须安装 Java™ version 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) 中。
  • 查明源数据库和 DB2 的 JDBC 驱动程序的位置。

    数据库JDBC 驱动程序
    Oracleojdbc14.jar、xdb.jar、xmlparserv2.jar 或 classes12.jar(对于 Oracle 7 或 8i,是 classes111.jar)
    SQL Serversqljdbc.jar
    Sybasejconn3.jar
    MySQLmysql-connector-java-5.0.8-bin.jar
    PostgreSQLpostgresql-8.1-405.jdbc3.jar
    Ingresiijdbc.jar
    DB2 for Linux, UNIX, and Windowsdb2jcc.jar、db2jcc_license_cu.jar
    DB2 for zdb2jcc.jar、db2jcc_license_cisuz.jar
    MS Access可选的 Access_JDBC30.jar


环境设置

  • UNIX:作为 DB2 实例所有者登录服务器。
  • Windows:启动 DB2 命令窗口。
  • 切换到 IBMDataMovementTool 目录。这个工具包括一个 JAR 文件和两个驱动程序脚本。
    IBMDataMovementTool.cmd - 在 Windows 上运行此工具的命令脚本。
    IBMDataMovementTool.sh - 在 UNIX 上运行此工具的命令脚本。
    IBMDataMovementTool.jar - 此工具的 JAR 文件。

创建 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_enforce
$ 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_enforce
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。否则,它会切换到交互式命令行模式。

在 Windows 上:
IBMDataMovementTool.cmd

在 UNIX 上:
./IBMDataMovementTool.sh


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

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


[2009-05-15 12.48.59.218] INPUT Directory = .
[2009-05-15 12.48.59.218] Configuration file loaded: 'jdbcdriver.properties'
[2009-05-15 12.48.59.218] Configuration file loaded: 'IBMExtract.properties'
[2009-05-15 12.48.59.218] appJar  : 'C:\Vikram\Prospects\DB2Cobra\IBMDataMovementTool.jar'
[2009-05-15 12.49.01.000] * WARNING *. I did not detect DB2_COMPATIBILITY_VECTOR set for 
                          compatibility mode.
[2009-05-15 12.49.01.000] To set compatibility mode, discontinue this program and 
                          run the following commands
[2009-05-15 12.49.01.000] db2set DB2_COMPATIBILITY_VECTOR=ORA
[2009-05-15 12.49.01.000] db2stop force
[2009-05-15 12.49.01.000] db2start

使用图形用户界面

什么是 DB2_COMPATIBILITY_VECTOR?

DB2_COMPATIBILITY_VECTOR 用于让 DB2 V9.7 实例和数据库进入 Oracle 兼容模式。详细信息请参见 DB2 V9.7 Information Center。

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

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

图 1. 源和 DB2 数据库的输入参数
提取和部署数据

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


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

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

配置文件

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

文件名说明
IBMExtract.properties这个文件包含通过 GUI 或命令行指定的所有输入参数。可以手工编辑这个文件,修改或纠正参数。注意,在每次运行 GUI 时,会覆盖这个文件。
geninput这是第一个数据转移步骤,即创建包含要转移的表名的输入文件。可以手工编辑这个文件,排除不希望转移的表。
genddl这是一个可选的脚本,只在选择单独生成 DDL 时生成它。这是第二个数据转移步骤,即从源数据库生成所有 DDL。
unload 这是最后一个数据转移步骤。这个脚本把源数据库服务器中的数据卸载到平面文件。在运行这个脚本之后,会生成 DB2 LOAD 脚本。
请注意:如果不选择单独生成 DDL,那么 genddl 内容包含在 unload 脚本中。
rowcount在完成数据转移之后,使用这个文件对源和目标数据库服务器中表的行数执行检查。

图 3. 提取数据之后创建的文件
步骤 2. 创建的文件

使用命令行模式

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

在 Windows 上:
IBMDataMovementTool -console
在 UNIX 上:
./IBMDataMovementTool.sh	-console


可以通过交互选项依次指定源和 DB2 数据库连接参数。下面是控制台窗口中的输出示例:
[2009-05-16 23.38.54.703] INPUT Directory = .
[2009-05-16 23.38.54.703] Configuration file loaded: 'jdbcdriver.properties'
[2009-05-16 23.38.54.703] Configuration file loaded: 'IBMExtract.properties'
[2009-05-16 23.38.54.703] appJar  : 'C:\Vikram\Prospects\DB2Cobra\IBMDataMovementTool.jar'
Extract DDL (Yes)        : 1
Extract DDL (No)         : 2
Enter a number (Default=1) : 1
Extract Data (Yes)        : 1
Extract Data (No)         : 2
Enter a number (Default=1) : 2
******* 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) : 1

部署对象和装载数据

创建数据库目标对象

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 上可能浪费许多空间。为了避免空间问题,使用一个算法分配大小。

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

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

选用哪种方法部署数据取决于数据和对象转移需求。如果只迁移非 PL/SQL DDL 对象和数据,那么使用 unload 脚本或单击 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
			

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

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

  1. 通过这个 IBM 链接 下载和安装 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、问题、意见和改进建议。

常见问题

常见问题
问题:为了使用这个工具,是否需要在源数据库服务器上安装什么东西?
回答:不需要为了使用这个工具在源数据库上安装任何东西。
问题:这个工具支持哪些平台?
回答: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 7 和 8i 数据库中的数据。使用 Oracle 9g、10g 或 11g JDBC 驱动程序行吗?
回答:从理论上说可以。如果遇到麻烦,请尝试改用比较老的 JDBC 驱动程序,比如 classes12.jar 或 classes111.jar。
问题:这个工具可以连接哪些数据库?
回答:具有 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 的默认页面大小。

致谢

世界各地的许多 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 Tool1IBMDataMovementTool.zip900KBHTTP
关于下载方法的信息

注意:

  1. 这个工具使用 JGoodies Forms 1.2.1、JGoodies Look 2.2.2 和 JSyntaxPane 0.9.4 包实现 GUI 界面。


参考资料

学习

获得产品和技术

讨论


关于作者

Vikram S Khatri 在 IBM 的 Sales and Distribution 部门工作,是 DB2 Migration 团队的一员。Vikram 有 23 年的 IT 从业经验,擅长把非 DB2 数据库迁移到 DB2。Vikram 支持 DB2 技术销售组织的工作,帮助他们完成复杂的数据库迁移项目和数据库性能基准测试。




对本文的评价










回页首


IBM、AIX、DB2、z/OS 和 DB2 是 IBM 公司在美国和其他许多国家的商标。Java 和所有基于 Java 的商标是 Sun Microsystems 公司在美国和其他国家的商标。Linux 是 Linus Torvalds 在美国和其他国家的商标。Microsoft、Windows、Windows NT 和 Windows 徽标是 Microsoft 公司在美国和其他国家的商标。UNIX 是 The Open Group 在美国和其他国家的注册商标。Oracle 是 Oracle 公司在美国和其他国家的商标。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款