一.背景
在日常工作中,经常有数据的导入/导出需求,例如将某些表的数据保存成文件形式,或者将文件数据加载到数据库等。为此,DB2提供了很多工具供大家选择,如export、import、load、db2dart、db2move。图1直观地展示了这几种工具的使用,最上面虚线部分是工具所支持的导入/导出文件格式,中间
图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: 2018年01月13日 星期六 21时05分56秒
-- 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: 2018年01月13日 星期六21时49分06秒
-- 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: 2018年01月13日 星期六 21时58分47秒
-- 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: 2018年01月13日 星期六 21时41分17秒
-- 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工具,则对于迁移、数据库对象的理解会有更深的认识,值得深入学习。