db_migrate 命令选项

db_migrate 命令允许您将一个或多个数据库表从 NPS(源)复制到 Db2 Warehouse(目标)。本主题包含有关此命令及其选项列表的信息。

源和目标

注: 如果源数据库启用了完全模式支持,那么在缺省情况下,db_migrate 会将 NPS 模式复制到 Db2 Warehouse 模式。否则,在缺省情况下,NPS 数据库将复制到 Db2 Warehouse 模式。
要复制的数据所在的服务器/数据库。您可使用 -sHost-sPort-sDB 参数来指定源数据库。
目标
要接收数据的服务器/数据库。目标数据库在执行 db_migrate 的系统上编目。您可通过 -tDB 参数定义目标数据库,该参数指定在启动 db_migrate 的主机上编目的目标数据库别名。不支持参数 -tHost-tPort
使用缺省选项时,目标数据库和目标表必须已存在。您可选择性地使用 db_migrate 的以下选项来自动创建目标数据库中的所有对象,或仅创建目标表:
-CreateTargetObjects   YES
-CreateTargetTable     YES

先决条件

可以从源主机或目标主机调用此脚本。另外,也可以从 Linux 客户机进行调用。必须在运行此脚本的机器上安装所有必需软件包。必须在本地数据库目录中编目目标数据库。

可以任何用户身份运行此脚本。必须授予适当的特权(例如,能够从源表读取和创建外部表,以及能够写入目标表)。

要迁移表,用户需要如下许可权:
  • 在源系统上:
    GRANT LIST ON <DATABASE|dbname> TO <user/group>;
    用户必须有权访问源数据库。
    GRANT SELECT ON <TABLE|tablename> TO <user/group>;
    用户必须有权访问源数据库中的表及其数据。
    GRANT CREATE EXTERNAL TABLE TO <user/group>;
    用户必须能够创建外部表,数据将会卸载到其中。
  • 在目标系统上:
    GRANT DBADM WITH DATAACCESS ON DATABASE TO <user/group>;
    用户必须有权访问目标数据库。

用法

db_migrate -sdb <dbname> -tdb <dbname> -shost <name> 
                     -suser <user> -tuser <user> -spassword <password>
                     -tpassword <password> [optional args]

除了定界的对象名,参数不区分大小写。指定定界的对象名时,请将它们括在单引号内,然后再括在双引号内:'"name"'

最简单的命令行可能类似于:
db_migrate -sdb proddb -tdb testdb -shost nzbox  
                     -suser admin -tuser dbuser 
                     -spassword password -tpassword password
可以通过导出以下环境变量传递所需的自变量:
  • -shost > NZ_HOST
  • -sdb > NZ_DATABASE
  • -suser > NZ_USER
  • -spassword > DBMIG_SOURCE_PASSWORD 或 NZ_PASSWORD
  • -tdb > DB_DATABASE
  • -tuser > DB_USER
  • -tpassword > DBMIG_TARGET_PASSWORD 或 DB_PASSWORD
工具会以交互方式提示您输入缺少的值。

命令选项

此脚本支持以下通用选项:
表 1. db_migrate 的通用命令选项
选项 描述
-rev 显示工具箱和 DBMS 版本信息。
-?|--?|-h|--h|-help|--help 显示帮助文本。
下表列出所有必需自变量。
表 2. db_migrate 的必需自变量
选项 描述
-sdb <dbname> 源数据库名称
-tdb <dbname> 目标数据库名称
-shost <name/IP> 源主机
-suser <user> 源用户
-tuser <user> 目标用户
-spassword <password> 源密码
-tpassword <password> 目标密码
以下是 db_migrate 的可选自变量列表:
-cksum <yes|count|fast|no|slow|full|columns <columnslists> >
定义迁移后是否对源表和目标表计算校验和,以确认它们包含相同的数据。缺省值为 yes。可用的选项如下所示:
  • yes | count | fast - 执行简单的 select COUNT(*) from <table>
  • slow | full - 根据 <table> 中所有的列计算校验和
  • columns <columnList> - 根据 <columnList> 中列出的列计算校验和
  • no - 不计算校验和

校验和计算在迁移操作将表数据复制到目标后执行。

使用 FULL 或 COLUMNS 选项时,必须为源数据库安装并启用 SQL 扩展工具箱。

校验和基于具有以下 Netezza 数据类型的字段中的全部内容:BOOLEAN、BYTEINT、SMALLINT、INTEGER、BIGINT、NUMERIC、CHARACTER(VARYING 和 NATIONAL)以及 DATE。

对于 TIMESTAMP 和 TIME,比较精度在秒级别。校验和机制会忽略小数部分(微秒)的差异。因此,校验和不会报告在迁移期间截断到秒精度的 TIME 数据类型。

对于浮点类型 (FLOAT/REAL/DOUBLE),校验和不是基于实际值,而是只区分 null 值/非 null 值。

另外,还可以使用独立的 db_mchecksum 工具对现有表计算校验和。当使用 db_migrate 计算所得的完全校验和报告差异时,此工具可能十分有用。您可以针对特定的列计算校验和,并指定 WHERE 条件。您可以使用 db_checksum -h 来找出所有选项。

-cloneDDL
如果包括 -cloneDDL 开关,那么此脚本将生成与对象关联的所有 DDL 以尝试进行克隆。这将包括下列语句:
COMMENT ON ...
GRANT ...
ALTER ... OWNER TO ...
注:
  • 当指定了 -CreateTargetObjects 时,此选项始终启用。
  • 此脚本可发出 CREATE TABLE 语句 (-CreateTargetTable YES)
  • 此脚本可发出 CREATE SYNONYM 语句 (-viaSynonym)
-CreateTargetObjects <no|yes>
定义此脚本是否尝试在目标上自动创建其所有的表和其他对象。缺省值为 NO。如果值为 YES,那么此脚本将从源系统中抽取所有 DDL,然后针对目标系统运行以创建对象。可能会发生许多非致命错误。例如,CREATE VIEW 语句可能会引用目标系统上不存在的另一数据库中的对象,因此,该 DDL 语句将失败。发生错误时,此脚本会显示警告消息。这些操作的输出可能非常长,因此详细信息将记录到磁盘文件以供稍后复查。要仅迁移 DDL(不迁移数据),您可搭配此选项指定 -noData 选项。
-CreateTargetTable <no|yes>
如果目标数据库中尚不存在该表,您是否希望此脚本尝试自动创建该表?缺省值为 NO。如果值为 YES,那么将创建该表,并且其定义将包括可能已定义的任何主键约束和唯一列约束。如果要删除现有表并重新创建该表,请使用选项 -RecreateTargetTable。
-errors_to <email@recipient>
此脚本的输出副本所要发送到的电子邮件地址,但只有在遇到错误时才发送。
-evaluate
迁移前评估。在实际迁移前,生成 HTML 报告以评估迁移。要评估所有数据库对象的迁移,需要指定选项“-CreateTargetObjects YES”。要仅针对一个表生成报告,请搭配使用此选项和 -t 选项,并指定“-CreateTargetTable YES -CreateTargetObject NO”。
-constraints <drop>
定义如何处理表约束。当前只支持一个自变量:
  • drop - 不创建约束
此选项在缺省情况下已禁用。
-exclude <tablename> [...]
将指定的表排除在迁移之外。当您想要从源数据库迁移大部分表时,此选项十分有用,您不必列出所有这些表,而只需列出不想迁移的表。
-format <ascii|mixed|binary>
要使用的数据传输格式。缺省值为 ascii
  • ascii - 使用文本格式进行传输。迁移通常需要更长时间。
  • binary - 使用压缩二进制内部格式进行传输。可以获得更高的吞吐量和性能。
  • mixed -
    注: 不推荐使用该选项。请考虑使用 binary 格式。
    在源系统与启动 db_migrate 的主机之间使用压缩 NPS 内部格式进行传输。解压缩(动态)在启动 db_migrate 的主机上进行。如果该工具是在中间(非目标)主机上启动,那么此主机与目标之间的传输以非压缩文本格式进行。当源主机与启动 db_migrate 的主机之间的网络为瓶颈时,混合方式可提高性能。
-genStats <none|full>
将每个表迁移到目标数据库之后,此脚本可以针对目标表自动发出 RUNSTATS 命令。它是以后台作业方式进行调用,因此不会阻止余下的迁移过程。选项如下所示:
  • none - 不执行任何操作(缺省值)。
  • full - 生成统计信息。
-mail_program <script_or_executable>
缺省情况下,在发送电子邮件时,此脚本将调用 /bin/mail。此选项允许您使用另一个邮件程序(或 Shell 脚本),而不必对 db_migrate 脚本本身进行任何更改。
-noData
执行命令行上请求的所有步骤,但不移动实际数据。此选项可用于:
  • 创建目标数据库对象
  • 截断目标表以将其清除
  • 在总体上测试操作,而不实际移动数据
-RecreateTargetTable <no|yes>
该表在目标数据库中已存在时,此脚本可以自动将其删除并重新创建。缺省值为 NO。如果值为 YES,那么将删除现有表并重新创建。
-restart <n>
有时,表迁移可能会由于两台主机之间发生短暂网络问题(例如,通信链路故障)或短暂的软硬件问题而失败。在下列情况下,此脚本会自动重新启动表迁移:

您已指定 -TruncateTargetTable yes 选项

您已指定 -SourceWhereClause <clause> 选项。

在尝试迁移该表失败期间,可能已有一个或多个线程成功完成,这可能会导致目标表中存在部分(但并非全部)数据。这将使目标表处于不一致状态。在重新启动迁移过程之前,此脚本会尝试截断目标表(应该会即刻完成),或者根据 -SourceWhereClause <clause> 对目标表发出 DELETE 语句(可能需要较长时间才能运行完成)。缺省情况下,重新启动尝试次数设置为 1。您可以将重新启动尝试次数设置为 0(不重新启动)到 10 的值。重新启动不保证成功,只是自动尝试。仅当迁移本身发生问题,而不是在早期设置期间或最终校验和阶段发生问题时,才会执行重新启动。如果该表的后续迁移成功,那么脚本会将其视为成功,并在输出中包括相应的日志消息。

-SourceObjectType <table|any>
使用此选项时,db_migrate 会将数据从源表复制到目标表,但源可以是视图、外部表或数据文件。在这种情况下,您必须手动创建目标表,以便 db_migrate 可以将数据从外部表或视图复制到这个表。要使用此选项,您必须:
  1. -table-sTable 选项中指定源对象名。
  2. -SourceObjectType 选项设置为 any
否则,要求源确实是表。
-SourceWhereClause <clause>
此选项允许您指定 WHERE 子句,以限制所迁移的数据,从而迁移表的子集。请将该子句括在双引号内。示例:

                -SourceWhereClause  "customer_key = 2"
                -SourceWhereClause  "customer_key in (1,3,5)"
                -SourceWhereClause  "region_name = 'AMERICA' or region_key = 0"
                -SourceWhereClause  "order_date between '1998-01-01' and '1998-12-31'"
                -SourceWhereClause  "customer_num in (select id from sales..accounts)"
请注意,指定的子句将应用于所有要迁移的表,因此您可能希望仅迁移一个与此子句中指定的 WHERE 列匹配的表。该子句将应用于源表。它的使用将记录在此脚本的输出中,并记录在源机器上的 pg.log 文件中。迁移之后,在校验和步骤中比较表时,校验和查询还会针对源表和目标表使用该子句,以便仅评估已复制的数据。
-sPort <#>
源端口号。通常,从不指定此选项,这将使用缺省值 5480。此选项允许您在源数据库使用其他端口时覆盖缺省值。
-sSchema <schema>
源模式。这仅适用于数据库支持且正在使用模式的情况。
-sTable <tablename>
源表名。
-tTable <tablename>
这些选项允许您将源表迁移到具有另一名称的目标表。必须始终同时指定源表名和目标表名。使用此选项时,一次只能复制一个表。可以使用 -CreateTargetTable-TruncateTargetTable 选项。不得在同一命令中使用 -t <tablename> 选项。
-status [<n>]
在传输数据的过程中提供定期状态更新。缺省情况下,状态每 60 秒更新一次。您可指定从 1 秒到 3600 秒的可选值。样本输出:
.....data flowing.....
.....status Total:       25,165,824    Average:    5,033,164    elapsed seconds: 5
.....status Total:       67,108,864    Average:    8,388,608    elapsed seconds: 10
.....status Total:      117,440,512    Average:   10,066,329    elapsed seconds: 15
第一列是传输的总字节数,第二列是自上次状态更新以来每秒传输的平均字节数。此选项还会提供每个表以及总体迁移的其他汇总统计信息:
.....# of bytes xfer'ed                                         173,001,038
 .....xfer rate (bytes per second)                               7,863,683
-tableFile <filename>
您可以指定一个文件,并在其中列出要迁移的表名。各个名称可以由换行符或跳进字符分隔。此开关可以与 -table 选项配合使用。可以多次指定此开关。
-TargetDistributeOnClause <clause>
此选项允许您在创建目标表时控制和覆盖源表分布键。缺省情况下,目标表分布键与源表的分布键匹配。请将该子句括在双引号中,以便将其正确传递给脚本。要使用此选项,目标表不能已存在,并且必须指定 -CreateTargetTable YES 选项。由于此子句将应用于所有要迁移的表,建议您一次迁移一个表,因为该子句通常包含特定于该表的列名。示例:
-TargetDistributeOnClause  "(customer_id)"
-TargetDistributeOnClause  "(customer_id, account_id)"
-TargetOrderByClause <clause>
此选项允许先对数据进行排序,再将其实际插入到目标表中。您负责决定数据应按哪些列进行排序,并将这些列名传递给此脚本。请将该子句括在双引号中,以便将其正确传递给脚本。由于此子句将应用于所有要迁移的表,建议您一次迁移一个表,因为该子句通常包含特定于该表的列名。另外,还建议您包括 -threads 1 选项,将数据作为单个数据集进行排序。使用多个线程会造成每个线程都单独地对其数据进行排序。示例:
 -TargetOrderByClause  "purchase_date"
-TargetOrderByClause  "purchase_date asc"
-TargetOrderByClause  "purchase_date asc, store_id asc"
-LoadWarnings <n>
指定每个线程的错误数,达到此数目后,工具停止处理。缺省值为 1。此缺省值表示仅当装入没有错误时,系统才落实装入。要禁用错误限制,请将值设置为 0。
-threads <n>
每个表都使用 <n> 个线程(并行卸载/装入流)进行处理,以优化对 SMP 主机和网络带宽的使用。缺省情况下,对于较小的表(< 1M 行),将会使用 1 个线程,而对于较大的表,将会使用 4 个线程。您可以使用此开关覆盖缺省线程数。最多支持 31 个线程。
-timeout [<n>]
有时,表迁移会挂起。例如,除其中一个线程外,所有线程都完成。源可能已发送数据包,但目标未接收到该数据包。它们都没有收到错误,但它们都不会继续运行,因为它们都在等待对方执行操作。此选项尝试监视此类情况,当它注意到在指定的时间长度(-timeout 值)内,两个系统之间没有传输任何数据字节时,将自动终止挂起的线程。指定此选项还会自动启用“-status”选项。缺省情况下,此选项已禁用。在命令行上包括此开关即可将其启用。缺省超时值设置为 600 秒(10 分钟)。您可指定从 1 秒到 7200 秒的可选值。达到此超时值时,当前表的迁移将自动终止。您也可以指定还要自动重新启动该表的迁移。请参阅上文中描述的 -restart 选项,以获取更多详细信息。
-to <email@recipient>
此脚本会将输出副本发送到指定的电子邮件地址。
-TruncateTargetTable <no|yes>
在将任何数据装入目标表之前,截断目标表以确保其为空。缺省值为 NO。
要点: 务必非常小心地正确指定源主机和目标主机。如果启用此选项,但错误地指定目标主机,那么可能会意外截断源表并丢失数据。
-tschema <schema>
目标模式。如果指定此选项,那么会使用此模式将源对象复制到目标系统。
注: 此参数始终被视为大写字符串,即使以混合大小写形式提供并括在引号内也是如此。
-t|-table|-tables <tablename> [...]
指定源数据库中要迁移的一个或多个表的列表。如果未指定任何表,那么将会迁移源数据库中所有的表。可以多次指定此开关。
-viaSynonym
如果向脚本传递同义词名称(而非表名),并且包括此开关,那么脚本会迁移该同义词所引用的源表。成功复制源表之后,脚本还会在目标数据库中创建该同义词,以引用所迁移的表。例如,同义词 TODAYS_DATA 可能引用表 MARCH_12。脚本会复制 MARCH_12 表,如果成功,脚本还会在目标上创建同义词 TODAYS_DATA 以指向该表。
-loader <exttab>
使用此参数,您可以定义将数据装入 Db2® Warehouse 的方式:
  • 使用缺省的 exttab 选项时,将会使用从外部表执行的 INSERT,这是与 Netezza 中的外部表对应的功能。
-logVerbose
如果指定此选项,那么将保存脚本所生成的所有日志。未指定此选项时,除非发生问题,否则仅保存主日志。
-multiByteChars <yes|no>
如果任何 VARCHAR 字段中包含 ASCII 码大于 127 的字符,那么应使用此选项。此类字符在 Netezza 中采用 Latin9 编码,在 Db2 Warehouse 中采用 UTF-8 编码,因此在迁移后,它们会变为多字节字符。此选项只能与 -loader exttab 配合使用。如果设置了此选项,那么 Netezza 中的 VARCHAR 字段会变为 Db2 Warehouse 中的 NVARCHAR(字符串单位为 CODEUNITS32)。如果未设置此选项,那么 VARCHAR 字段中的每个字符(在 Netezza 中为 1 个字节)都会迁移到字符串单位为 OCTETS(表示单字节)的 VARCHAR 字段。如果 VARCHAR 字段中的数据仅包含 ASCII 码小于或等于 127 的字符,那么这种行为是正确的。否则,字符串函数无法正常工作,而数据在目标字段中可能放不下,因为其长度以字节为单位指定,而不是以字符为单位指定。
-prefixSchema < no | yes | withPrefix <prefixName> >
此选项专用于启用了完全模式的源数据库。使用缺省选项 -prefixSchema no 时,每个模式都会迁移到目标系统上的同一模式名称。使用 -prefixSchema 参数时,将会对目标模式名称自动添加前缀,这样就可以在多个源数据库中定义有相同模式的情况下保证模式名称是唯一的。可能的值:
  • no - 不执行任何操作(缺省值)
  • yes - 将数据库名称用作模式前缀,目标模式名称为 <sourceDB>_<sourceSchema>
  • withPrefix <prefixName> - 将 prefixName 用作模式前缀,目标模式名称为 <prefixName>_<sourceSchema>
注:
  • 此选项与 -tSchema 互斥。
  • 此选项始终被视为大写字符串,即使以混合大小写形式提供并括在引号内也是如此。
  • 使用 V2.5 以前的 Db2 Warehouse 版本时,不可使用此选项来迁移模式具有括在引号内的混合大小写名称(例如,CamelCaseSchema)的多模式数据库。

命令示例

以下是迁移整个数据库的示例:
db_migrate -sDB proddb -tDB bludb -sHost nzbox 
             -sUser admin -tUser dbuser 
             -sPassword password -tPassword password
             -CreateTargetObjects yes -TruncateTargetTable yes

命令输出

所迁移的每个表的状态、日志和计时信息都会发送到标准输出,包括有关可能需要解决的任何问题的详细信息。退出状态:
  • 0 = 成功
  • 非 0 = 遇到错误

以下是包括许多可选自变量的迁移的样本输出:



Migrate table "ADMIN"."ZZSHIPPERS_USING_FAKE_SIC" --> "SANDBOX"."ZZSHIPPERS_USING_FAKE_SIC"

.....processing table 5 of 5
.....truncating the target table
.....migration process                              started at  2016-02-01 10:44:37
.....estimated # of records                                     6
.....load starting               ( thread 1 of 1 )
.....waiting on load             ( thread 1 of 1 )
.....unloading data              ( thread 1 of 1 )
.....data flowing.....
.....unload results              ( thread 1 of 1 )              Rows Returned : 6
.....unload finished             ( thread 1 of 1 )              elapsed seconds: 14
.....load finished               ( thread 1 of 1 )              elapsed seconds: 122
.....load successful             ( thread 1 of 1 )
.....migration process                              ended at    2016-02-01 10:46:39
.....data flow finished
.....actual # of records unloaded                               6
.....
.....migration completed                                        TOTAL seconds: 122
.....
.....launching generate statistics (in the background)