一.背景

在日常工作中,经常有数据的导入/导出需求,例如将某些表的数据保存成文件形式,或者将文件数据加载到数据库等。为此,DB2提供了很多工具供大家选择,如export、import、load、db2dart、db2move。图1直观地展示了这几种工具的使用,最上面虚线部分是工具所支持的导入/导出文件格式,中间

1.png

图1

由于export与import在其它数据库中也有较多的应用,本文不再对其做详细说明。在DB2中,load工具的使用较为频繁,此前已有其它同事做了介绍,这里也不再深入讨论。db2dart工具会在后续分享中进行介绍。

本文主要对db2move工具以及与之相配合的db2look工具做简要介绍。

二.db2look工具简介及使用

在数据迁移前,我们需要在目标端对数据对象做定义。db2look可以用来产生表、视图、索引、函数、触发器、存储过程等对象的定义语句。对于其详细用法,可以通过db2look -h进行查看帮助。

1.  db2look的选项及用法

db2inst1@suse11:~> db2look -h

db2look: Generates DDLs to recreate the objects defined in a database

 

Syntax: db2look -d DBname [-e] [-xs] [-xdir Path] [-u Creator] [-z Schema]

                          [-t Tname1 Tname2...TnameN] [-tw Tname] [-xdep] [-xddep]

                          [-n Nname1 Nname2...NnameN] [-nw Nname]

                          [-o Fname] [-a] [-m] [-c] [-r] [-l] [-x] [-xd] [-f] [-h]

                          [-fd] [-td x] [-noview] [-i userID] [-w password]

                          [-v Vname1 Vname2 ... VnameN] [-dp] [-ct]

                          [-wrapper WrapperName] [-server ServerName] [-nofed]

                          [-wlm] [-ap] [-mod] [-cor] [-wrap] [-noimplschema] [-nostatsclause]

                          [-wrapper WrapperName] [-server ServerName][-fedonly] [-nofed]

 

        db2look [-h]

 

对于参数的说明:

        -d: 数据库名:这必须指定

        -e: 抽取复制数据库所需要的 DDL 文件

             此选项将生成包含 DDL 语句的脚本

             可以对另一个数据库运行此脚本以便重新创建数据库对象

             此选项可以和 -m 选项一起使用

        -u: 创建程序标识:若 -u 和   -a 都未指定,则将使用 $USER

             若指定了 -a 选项,则将忽略 -u 选项

        -z: 模式名:如果同时指定了 -z 和 -a,则将忽略 -z

             联合部分的模式名被忽略

        -t: 生成指定表的统计信息

             可以指定的表的数目最多为 30

        -h: 更详细的帮助消息

        -o: 将输出重定向到给定的文件名

            若未指定 -o 选项,则输出将转到 stdout

        -a: 为所有创建程序生成统计信息

             若指定了此选项,则将忽略 -u 选项

        -m: 在模拟方式下运行 db2look 实用程序

            此选项将生成包含 SQL UPDATE 语句的脚本

            这些 SQL UPDATE 语句捕获所有统计信息

            可以对另一个数据库运行此脚本以便复制初始的那一个

            当指定了 -m 选项时,将忽略 -p、-g 和 -s 选项

        -c: 不要生成模拟的 COMMIT 语句

            除非指定了 -m 或 -e,否则将忽略此选项

            将不生成 CONNECT 和 CONNECT RESET 语句

        -r: 不要生成模拟的 RUNSTATS 语句

            缺省值为 RUNSTATS。仅当指定了 -m 时,此选项才有效

        -l: 生成数据库布局:数据库分区组、缓冲池和表空间。

        -x: 如果指定了此选项,则 db2look 实用程序将生成授权 DDL

            对于现有已授权特权,不包括对象的原始定义器

         -xd: 如果指定了此选项,则 db2look 实用程序将生成授权 DDL

            对于现有已授权特权,包括对象的原始定义器

        -f: 抽取配置参数和环境变量

            如果指定此选项,将忽略 -wrapper 和 -server 选项

         -td: 将 x 指定为语句定界符(缺省定界符为分号(;))

            应该与 -e 选项一起使用(如果触发器或者 SQL 例程存在的话)

        -p: 使用简单文本格式

        -s: 生成 postscript. 文件

            此选项将为您生成 postscript. 文件

            当设置了此选项时,将除去所有 latex 和 tmp ps 文件

            所需的(非 IBM)软件:LaTeX   和 dvips

            注意:文件 psfig.tex 必须在 LaTeX 输入路径中

        -g: 使用图形来显示索引的页取装对

            必须安装 Gnuplot,并且 必须在您的 LaTeX 输入路径中

            还将随 LaTeX 文件一起生成 文件

        -i: 登录到数据库驻留的服务器时所使用的用户标识

           -w: 登录到数据库驻留的服务器时所使用的密码

          -noview: 不要生成 CREATE VIEW ddl 语句

-wrapper: 为适用于此包装器的联合对象生成 DDL

            生成的对象可能包含下列各项:

            包装器、服务器、用户映射、别名、类型映射、

            函数模板、函数映射和索引规范

            -server: 为适用于此服务器的联合对象生成 DDL

            生成的对象可能包含下列各项:

            包装器、服务器、用户映射、别名、类型映射、

            函数模板、函数映射和索引规范

          -nofed: 不要生成 Federated DDL

              如果指定此选项,将忽略 -wrapper 和 -server 选项

   

在DB2 V10.5.0.5版本中,db2look又添加了几个非常实用的选项:

-ct: 按照对象创建时间生成DDL语句

-noimplschema: 不要为隐式创建的模式生成CREATE SCHEMA ddl

-nostatsclause: 不要在CREATE INDEX DDL中包含统计子句

-createdb: 生成用于创建源数据库的CREATE DATABASE命令

-printdbcfg: 为数据库配置参数生成UPDATE DB CFG命令

 

2.  db2look的几种常见用法:

1)导出数据库的建库指令:

db2look -d sample -createdb -o createdb.sql

2)导出数据库配置参数的更改指令:

db2look -d sample -printdbcfg -o dbcfg.sql

3)导出数据库所有对象的创建指令:

db2look -d sample -e -l -o sample.ddl

4)导出单张表的表结构:

db2look -d db_name -e -t schema_name.tab_name -nofed -o tab_name.ddl

5)导出数据库授权指令:

db2look -d sample -x -o grant.sql

 

3.  db2look的应用

1) 导出数据库的建库指令:

DB2自带了sample数据库,可以通过db2sampl指令来创建。db2sampl指令是由许多的指令封装而成的,这里我们通过db2look工具来导出sample数据库的建库指令。

db2inst1@suse11:~> db2look -d sample -createdb -o createdb.sql

-- No userid was specified, db2look tries to use Environment variable USER

-- USER is: DB2INST1

-- Output is sent to file: createdb.sql

db2inst1@suse11:~> cat createdb.sql

-- This CLP file was created using DB2LOOK Version "10.5"

-- Timestamp: 20180113 星期六 210556

-- Database Name: SAMPLE        

-- Database Manager Version: DB2/LINUXX8664 Version 10.5.6

-- Database Codepage: 1208

-- Database Collating Sequence is: IDENTITY

-- Alternate collating sequence(alt_collate): null

-- varchar2 compatibility(varchar2_compat): OFF

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

-- Generate CREATE DATABASE command

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

CREATE DATABASE SAMPLE

        AUTOMATIC STORAGE YES

        ON '/home/db2inst1'

        DBPATH ON '/home/db2inst1/'

        USING CODESET UTF-8 TERRITORY CN

        COLLATE USING IDENTITY

        PAGESIZE 8192

        DFT_EXTENT_SZ 32

        CATALOG TABLESPACE MANAGED BY AUTOMATIC STORAGE

         EXTENTSIZE 4

         OVERHEAD 7.500000

         TRANSFERRATE 0.060000

         NO FILE SYSTEM CACHING

         AUTORESIZE YES

         INITIALSIZE 32 M

         MAXSIZE NONE

        TEMPORARY TABLESPACE MANAGED BY AUTOMATIC STORAGE

         EXTENTSIZE 32

         OVERHEAD 7.500000

         TRANSFERRATE 0.060000

         FILE SYSTEM CACHING

        USER TABLESPACE MANAGED BY AUTOMATIC STORAGE

         EXTENTSIZE 32

         OVERHEAD 7.500000

         TRANSFERRATE 0.060000

         NO FILE SYSTEM CACHING

         AUTORESIZE YES

         INITIALSIZE 32 M

         MAXSIZE NONE ;

CONNECT TO SAMPLE;

COMMIT WORK;

CONNECT RESET;

TERMINATE;

2) 导出sample数据库配置参数的更改指令:

db2inst1@suse11:~> db2look -d sample -printdbcfg -o dbcfg.sql

-- No userid was specified, db2look tries to use Environment variable USER

-- USER is: DB2INST1

-- Output is sent to file: dbcfg.sql

db2inst1@suse11:~> cat dbcfg.sql

-- This CLP file was created using DB2LOOK Version "10.5"

-- Timestamp: 20180113 星期六214906

-- Database Name: SAMPLE        

-- Database Manager Version: DB2/LINUXX8664 Version 10.5.6

-- Database Codepage: 1208

-- Database Collating Sequence is: IDENTITY

-- Alternate collating sequence(alt_collate): null

-- varchar2 compatibility(varchar2_compat): OFF

CONNECT TO SAMPLE;

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

-- Generate UPDATE DB CFG commands

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

-- The db2look command generates the UPDATE DB CFG statements

-- to replicate the database configuration parameters based on

-- the current values in the source database.

-- For the configuration parameters which support AUTOMATIC,

-- you need to add AUTOMATIC to the end

-- if you want the DB2 database to automatically adjust them.

--UPDATE DB CFG FOR SAMPLE USING ALT_COLLATE      ;

UPDATE DB CFG FOR SAMPLE USING STMT_CONC          OFF ;

UPDATE DB CFG FOR SAMPLE USING DISCOVER_DB        ENABLE ;

(此处省略若干行)

UPDATE DB CFG FOR SAMPLE USING LOGARCHMETH1  DISK:/home/db2inst1/arch/ ;

UPDATE DB CFG FOR SAMPLE USING LOG_DDL_STMTS      NO ;

UPDATE DB CFG FOR SAMPLE USING LOG_APPL_INFO      NO ;

UPDATE DB CFG FOR SAMPLE USING DFT_SCHEMAS_DCC    NO ;

(此处省略若干行)

COMMIT WORK;

CONNECT RESET;

TERMINATE;

3) 导出sample数据库所有对象的创建指令:

db2inst1@suse11:~> db2look -d sample -e -l -o sample.ddl

-- No userid was specified, db2look tries to use Environment variable USER

-- USER is: DB2INST1

-- Creating DDL for table(s)

-- Output is sent to file: sample.ddl

db2inst1@suse11:~> cat sample.ddl

-- This CLP file was created using DB2LOOK Version "10.5"

-- Timestamp: 20180113 星期六 215847

-- Database Name: SAMPLE        

-- Database Manager Version: DB2/LINUXX8664 Version 10.5.6

-- Database Codepage: 1208

-- Database Collating Sequence is: IDENTITY

-- Alternate collating sequence(alt_collate): null

-- varchar2 compatibility(varchar2_compat): OFF

CONNECT TO SAMPLE;

(由于创建指令过长,此处省略)

COMMIT WORK;

CONNECT RESET;

TERMINATE;

4)以sample库的表sales为例,导出单张表的创建指令:

db2inst1@suse11:~> db2look -d sample -e -t db2inst1.sales -nofed -o sales.ddl

-- No userid was specified, db2look tries to use Environment variable USER

-- USER is: DB2INST1

-- The db2look utility will consider only the specified tables

-- Creating DDL for table(s)

-- Output is sent to file: sales.ddl

db2inst1@suse11:~> cat sales.ddl

-- This CLP file was created using DB2LOOK Version "10.5"

-- Timestamp: 20180113 星期六 214117

-- Database Name: SAMPLE        

-- Database Manager Version: DB2/LINUXX8664 Version 10.5.6

-- Database Codepage: 1208

-- Database Collating Sequence is: IDENTITY

-- Alternate collating sequence(alt_collate): null

-- varchar2 compatibility(varchar2_compat): OFF

CONNECT TO SAMPLE;

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

-- DDL Statements for Table "DB2INST1"."SALES"

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

CREATE TABLE "DB2INST1"."SALES"  (

                  "SALES_DATE" DATE ,

                  "SALES_PERSON" VARCHAR(15 OCTETS) ,

                  "REGION" VARCHAR(15 OCTETS) ,

                  "SALES" INTEGER )  

                 IN "USERSPACE1" 

                 ORGANIZE BY ROW;

COMMIT WORK;

CONNECT RESET;

TERMINATE;

三.db2move工具简介及使用

    db2move工具用来在两个数据库之间进行数据迁移,特别适合于不同平台、表数量比较多的情况。此工具是对export、import、load命令的封装,根据系统表获得用户表,将数据库导出为PC/IXF格式,同时会产生一个db2move.1st文件,记录导出表和数据文件名字,将这些文件传输到目标系统中,通过load或import进行导入。

 

1.  IBM官网对于db2move的语法介绍:

                            .----------------------------.   

                            V                            |   

>>-db2move--dbname--action----+------------------------+-+-----><

                              +- -tc--table_definers---+     

                              +- -tn--table_names------+     

                              +- -sn--schema_names-----+     

                              +- -ts--tablespace_names-+     

                              +- -tf--filename---------+     

                              +- -io--import_option----+     

                              +- -lo--load_option------+     

                              +- -co--copy_option------+     

                              +- -l--lobpaths----------+     

                              +- -u--userid------------+     

                              +- -p--password----------+     

                              '- -aw-------------------'     

2.  以下是用中文介绍db2move的用法:(本段中文说明引自网络)

db2move   命令

db2move   <database-name> <action> [<option> <value>]

首先,必须指定数据库名(想要移动的表所在的数据库)和要执行的操作(export 和 import 或 load)。然后指定一个选项来定义操作的范围。例如,可以将一个操作限制在特定的表(-tn)、表空间(-ts)、表创建者(-tc)或模式名(-sn)范围内。指定表、表空间或表的创建者的一个子集只对 export 操作有效。如果指定多个值,就必须使用逗号将其分隔开;在值列表项之间不允许有空格。可以指定的项最多为 10 个。

另外,也可以指定 -tf 选项,此时要使用一个文件名作为参数,其中列出了要导出的表名;在该文件中,每行只能列出一个完整的表名。您还可以指定以下内容:

-tn -表名,导出单一表

-tf - 文件名,文件中每行记录一个完整的表名

-ts -表空间名称,用于导出某个表空间下的所有数据

-tc -表创建者,导出某用户创建的所有数据

-sn -模式名,用于导出某个模式下的所有数据

 

-io import-option

指定 DB2 的 import 工具可以运行的一种模式。有效的选项有: CREATE、 INSERT、   INSERT_UPDATE、 REPLACE 和   REPLACE_CREATE。缺省值为 REPLACE_CREATE。有关这些模式的更多内容,请参阅 DB2 的产品文档,可以从 DB2 技术支持获得这些文档。

-lo   load-option

指定 DB2 的 load 工具可以运行的一种模式。有效的选项有:INSERT 和 REPLACE。缺省值为 INSERT。 有关这些模式的更多内容,请参阅 DB2 的产品文档,可以从 DB2 技术支持获得这些文档。

-l   lobpaths

指定要创建或查找的 LOB 文件的位置。必须指定一个或多个绝对路径名。如果指定了多个绝对路径,就必须使用逗号将其分隔开;值之间不允许有空格。缺省值是当前目录。

-u userid 

指定一个用户 ID,该工具可以使用这个用户 ID 登录到远程系统上。

-p   password

指定对该用户进行认证的密码;该工具需要使用一个有效的用户 ID 和密码登录到远程系统上。

(注:本段中文说明引自网络)

 

需要补充说明的是,在实际环境中,有些数据表会采用identity标识列,而db2move无法迁移这种类型的表数据。

3.  db2look+db2move导出试验

1) 试验目的:利用db2look+db2move工具,将192.168.29.142主机db2inst1实例的sample数据库迁移至192.168.29.135主机db2inst1实例上。

2) 创建SAMPLE数据库,并创建带有identity标识列的表cust1。

db2inst1@suse11:~> db2sampl

 

  Creating database "SAMPLE"...

  Connecting to database "SAMPLE"...

  Creating tables and data in schema "DB2INST1"...

  Creating tables with XML columns and XML data in schema "DB2INST1"...

 

  'db2sampl' processing complete.

 

db2inst1@suse11:~> db2 connect to sample

 

   Database Connection Information

 

 Database server        = DB2/LINUXX8664 10.5.6

 SQL authorization ID   = DB2INST1

 Local database alias   = SAMPLE

 

db2inst1@suse11:~> db2 "create table cust1(custno smallint not null generated always as identity (start with 100,increment by 1),custname varchar(16)) in USERSPACE1"

DB20000I  The SQL command completed successfully.

db2inst1@suse11:~> db2 "select * from cust1 with ur"

 

CUSTNO CUSTNAME       

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

 

  0 record(s) selected.

 

db2inst1@suse11:~> db2 "insert into cust1(custname) values('ma')"

DB20000I  The SQL command completed successfully.

db2inst1@suse11:~> db2 "insert into cust1(custname) values('miao')"

DB20000I  The SQL command completed successfully.

db2inst1@suse11:~> db2 "insert into cust1(custname) values('miaomiao')"

DB20000I  The SQL command completed successfully.

db2inst1@suse11:~> db2 "select * from cust1 with ur"

 

CUSTNO CUSTNAME       

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

   100 ma             

   101 miao           

   102 miaomiao       

 

  3 record(s) selected.

3) 使用db2look工具,导出192.168.29.142主机SAMPLE数据库的建库指令以及所有对象的定义。

db2inst1@suse11:~/ddl> db2look -d sample -createdb -o createdb.sql

-- No userid was specified, db2look tries to use Environment variable USER

-- USER is: DB2INST1

-- Output is sent to file: createdb.sql

-- Binding package automatically ...

-- Bind is successful

-- Binding package automatically ...

-- Bind is successful

db2inst1@suse11:~/ddl> db2look -d sample -e -l -o sample.ddl

-- No userid was specified, db2look tries to use Environment variable USER

-- USER is: DB2INST1

-- Creating DDL for table(s)

-- Output is sent to file: sample.ddl

4) 将sample库的数据通过db2move导出,新建目录db2move,用于存放导出的数据

db2inst1@suse11:~> mkdir db2move

db2inst1@suse11:~> cd db2move

db2inst1@suse11:~/db2move> db2move sample export

 

Application code page not determined, using ANSI codepage 1208

 

*****  DB2MOVE  *****

 

Action:  EXPORT

 

Start time:  Sat Jan 13 23:20:36 2018

 

 

Connecting to database SAMPLE ... successful!  Server : DB2 Common Server V10.5.6

 

EXPORT:     18 rows from table "DB2INST1"."ACT"

EXPORT:      0 rows from table "DB2INST1"."CATALOG"

EXPORT:      5 rows from table "DB2INST1"."CL_SCHED"

EXPORT:      6 rows from table "DB2INST1"."CUSTOMER"

EXPORT:     14 rows from table "DB2INST1"."DEPARTMENT"

EXPORT:     42 rows from table "DB2INST1"."EMPLOYEE"

EXPORT:  10000 rows from table "DB2INST1"."EMPMDC"

EXPORT:     73 rows from table "DB2INST1"."EMPPROJACT"

EXPORT:      8 rows from table "DB2INST1"."EMP_PHOTO"

EXPORT:      8 rows from table "DB2INST1"."EMP_RESUME"

EXPORT:    156 rows from table "SYSTOOLS"."HMON_ATM_INFO"

EXPORT:      0 rows from table "SYSTOOLS"."HMON_COLLECTION"

EXPORT:      4 rows from table "DB2INST1"."INVENTORY"

EXPORT:      3 rows from table "DB2INST1"."IN_TRAY"

EXPORT:      8 rows from table "DB2INST1"."ORG"

EXPORT:      5 rows from table "SYSTOOLS"."POLICY"

EXPORT:      4 rows from table "DB2INST1"."PRODUCT"

EXPORT:      2 rows from table "DB2INST1"."PRODUCTSUPPLIER"

EXPORT:     65 rows from table "DB2INST1"."PROJACT"

EXPORT:     20 rows from table "DB2INST1"."PROJECT"

EXPORT:      6 rows from table "DB2INST1"."PURCHASEORDER"

EXPORT:     41 rows from table "DB2INST1"."SALES"

EXPORT:     35 rows from table "DB2INST1"."STAFF"

EXPORT:     35 rows from table "DB2INST1"."STAFFG"

EXPORT:      2 rows from table "DB2INST1"."SUPPLIERS"

 

Disconnecting from database ... successful!

 

End time:  Sat Jan 13 23:20:41 2018

检查确认文件已经导出

db2inst1@suse11:~/db2move> ls

db2move.lst  tab11.ixf  tab14.ixf  tab17a.001.lob  tab19.ixf  tab21.ixf (此处省略其他若干文件)

5) 将上述的creatdb.sql、sample.ddl以及通过db2move导出的数据文件传输至目标端

db2inst1@suse11:~> cd ~

db2inst1@suse11:~> tar -cvf db2move.tar db2move

db2inst1@suse11:~> scp ./ddl/* db2inst1@192.168.29.135:/home/db2inst1/

db2inst1@suse11:~> scp ./db2move.tar db2inst1@192.168.29.135:/home/db2inst1/

6) 在目标端创建数据库、数据库对象

[db2inst1@localhost ~]$ db2 -tvf createdb.sql

CREATE DATABASE SAMPLE AUTOMATIC STORAGE YES ON '/home/db2inst1' DBPATH ON '/home/db2inst1/' USING CODESET UTF-8 TERRITORY CN COLLATE USING IDENTITY PAGESIZE 8192 DFT_EXTENT_SZ 32 CATALOG TABLESPACE MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 4 NO FILE SYSTEM CACHING AUTORESIZE YES INITIALSIZE 32 M MAXSIZE NONE TEMPORARY TABLESPACE MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 32 FILE SYSTEM CACHING USER TABLESPACE MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 32 NO FILE SYSTEM CACHING AUTORESIZE YES INITIALSIZE 32 M MAXSIZE NONE

DB20000I  The CREATE DATABASE command completed successfully.

 

[db2inst1@localhost ~]$ db2 -tvf sample.ddl

(此处省略若干行)

DB20000I  The SQL command completed successfully.

7)  对象创建完成后,需要与原库做对比,检查两边对象数目是否一致

原库对象数目:

db2inst1@suse11:~/ddl> db2 "select count(*) from syscat.tables with ur"

 

1         

-----------

        444

 

  1 record(s) selected.

 

db2inst1@suse11:~/ddl> db2 "select count(*) from syscat.indexes with ur"

 

1         

-----------

        396

 

  1 record(s) selected.

目标端对象数目:

[db2inst1@localhost ~]$ db2 "select count(*) from syscat.tables with ur"

 

1         

-----------

        444

 

  1 record(s) selected.

 

[db2inst1@localhost ~]$ db2 "select count(*) from syscat.indexes with ur"

 

1         

-----------

        396

经检查,两边数据库对象数目一致。

8)  将数据通过db2move导入

[db2inst1@localhost db2move]$ db2move sample load

 

Application code page not determined, using ANSI codepage 1208

 

*****  DB2MOVE  *****

 

Action:  LOAD

 

Start time:  Sun Jan 14 01:06:55 2018

 

 

Connecting to database SAMPLE ... successful!  Server : DB2 Common Server V10.5.6

 

Binding package automatically ... /home/db2inst1/sqllib/bnd/db2common.bnd ... successful!

 

Binding package automatically ... /home/db2inst1/sqllib/bnd/db2move.bnd ... successful!

 

* LOAD:  table "DB2INST1"."ACT"                

  -Rows read:         18

  -Loaded:            18

  -Rejected:           0

  -Deleted:            0

  -Committed:         18

(此处省略若干行)

* LOAD:  table "DB2INST1"."CUST1"             

***  WARNING 3107.  Check message file tab4.msg!

***  SQL Warning!  SQLCODE is  3107

***  SQL3107W  There is at least one warning message in the message file.

 

  -Rows read:          3

  -Loaded:             0

  -Rejected:           3

  -Deleted:            0

  -Committed:          3

(此处省略若干行)

Disconnecting from database ... successful!

 

End time:  Sun Jan 14 01:07:02 2018

9)  通过检查原库与目标库表的条数,验证迁移数据的准确性,以sales表为例:

db2inst1@suse11:~/ddl> db2 "select count(*) from sales with ur"

 

1         

-----------

         41

 

  1 record(s) selected.

[db2inst1@localhost db2move]$ db2 "select count(*) from sales with ur"

 

1         

-----------

         41

 

  1 record(s) selected.

 

10)      从第(8)步的信息,我们可以看到,由于有identity标识列的存在,表CUST1的数据并没有被导入到目标库中,因此需要单独对其进行装载数据。

[db2inst1@localhost db2move]$ db2 "select * from cust1 with ur"

 

CUSTNO CUSTNAME       

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

 

  0 record(s) selected.

 

从msg文件可以得知,表CUST1对应的数据文件为tab4.ixf,将其装载到表CUST1中。

 

[db2inst1@localhost db2move]$ db2 "load from tab4.ixf of ixf modified by IDENTITYOVERRIDE insert into CUST1"

(此处省略若干行)

Number of rows read         = 3

Number of rows skipped      = 0

Number of rows loaded       = 3

Number of rows rejected     = 0

Number of rows deleted      = 0

Number of rows committed    = 3

[db2inst1@localhost db2move]$ db2 "select * from CUST1 with ur"

 

CUSTNO CUSTNAME       

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

   100 ma             

   101 miao           

   102 miaomiao       

 

  3 record(s) selected.

 

db2 update db   cfg for <dbname> using LOGSECOND   100

11)      执行到这里,数据的迁移基本上算是“完工”了。但是由于LOAD装载不会检查表的参考完整性约束和检查约束,因此需要进行数据完整性检查。执行以下SQL,找出处于set integrity pending状态的表:

 

[db2inst1@localhost db2move]$ db2 "select char(TABNAME,20) TABNAME,STATUS,ACCESS_MODE,SUBSTR(CONST_CHECKED,1,1) FK_CHECKED,SUBSTR(CONST_CHECKED,2,1) CC_CHECKED FROM SYSCAT.TABLES WHERE STATUS='C' with ur"

 

TABNAME              STATUS ACCESS_MODE FK_CHECKED CC_CHECKED

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

DEPARTMENT           C      N           N          Y        

EMPLOYEE             C      N           N          N        

EMP_PHOTO            C      N           N          Y        

EMP_RESUME           C      N           N          Y        

PROJECT              C      N           N          Y        

PROJACT              C      N           N          Y         

EMPPROJACT           C      N           N          Y        

ACT                  C      N           N          Y        

ADEFUSR              C      N           Y          Y        

PURCHASEORDER        C      N           N          Y        

 

  10 record(s) selected.

有10张表处于set integrity pending状态,将这些表解除该状态后,本次的迁移才算是真正的完工。解除set integrity pending状态步骤也是较为繁琐的,本文不做深入探讨。

 

四.试验总结

本文使用db2look+db2move工具迁移做了较为完整的介绍,力求详细的同时,整个过程也会显得较为繁琐。在日常的迁移操作中,由于操作稍显繁琐,而且有其他工具的存在,db2move工具使用的频率较低,甚至不使用。而迁移环节离不开对象的定义,因此db2look工具则是不可或缺的。笔者认为,对于db2move,有一定的了解认识即可,不需要过于深入地研究;而用好db2look工具,则对于迁移、数据库对象的理解会有更深的认识,值得深入学习。