不同操作系统之间迁移DB2数据库的一个案例

假设我们有一个 IBM DB2 数据库,这个数据库里有很多表(可能上百张甚至更多),又有很多索引、外键约束、触发器。最要命的是还有一些含有自增字段的表(含有 GENERATED ALWAYS AS IDENTITY 定义的字段的表)。我们也没有关于这些数据库对象的准确创建脚本(笔者经常碰到客户有这种情况)。

现在我们要把这个数据库迁移到不同的操作系统(比如从 AIX 到 LINUX ),我们应该怎么办呢?因为操作系统不同,所以使用 BACKUP/RESTORE 命令显然是不行了。那么是不是可以使用 db2move 命令呢?也不行,首先 db2move 命令没有办法迁移索引、外键约束、触发器,更不能迁移含自增字段数据的表。那么对每张表都进行 export/import 操作?天哪,这简直是一场灾难,几百张表要做到什么时候啊,更何况 import 命令并不能保证自增字段的数据和原来一模一样!下面笔者提供一种方案,感觉还是比较奏效的

假设数据库名为 sample ,运行在 AIX 上,我们的目标是迁移到 LINUX 上。为简单起见 , 所有数据库对象都在 DB2INST1 模式下, db2inst1 用户拥有必须的所有权限 , 密码也是 db2inst1

(一) AIX 系统上的操作:

  1. 首先我们用 db2look 命令得到数据库对象的 DDL 脚本 :

db2look -d SAMPLE -z DB2INST1 -e -o sample.ddl -i db2inst1 -w db2inst1

  1. 使用文本编辑器编辑生成的 sample.ddl, 将创建表及索引的脚本语句,创建外键约束的语句,创建触发器的语句分开,制作成三个 DDL 脚本,分别是

sample_tabs.ddl

sample_foriegnkeys.ddl

sample_triggers.ddl

  1. 使用下面的 SQL 语句生成导出所有数据的脚本: exort.sql

db2 "select 'export to ' || rtrim(tabname) || '.ixf of ixf select * from ' || rtrim(tabname) || ';' from syscat.tables where tabschema = 'DB2INST1'" > export.sql

  1. 编辑生成的 export.sql ,把头和尾那些信息去掉,只保留必要的 export 命令.

  2. 使用下面的 SQL 语句生成倒入所有数据的脚本(我们使用 LOAD 命令,而且必须使用)

db2 "select 'load from ' || rtrim(tabname) || '.ixf of ixf insert into ' || rtrim(tabname) || ';' from syscat.tables where tabschema = 'DB2INST1'" > load.sql

  1. 编辑生成的 load.sql ,把头和尾的信息去掉,只保留必要的 load 命令.搜索 sample_tabs.ddl 文件中哪些表含有自增字段 ( 含有 GENERATED ALWAYS AS IDENTITY 定义的字段的表 ) ,并把 load.sql 中含有自增字段的表的 load 命令加入 modified by identityoverride 语句(加在 of ixf 和 insert 之间,例如 : load from MYTABLE.ixf of ixf modified by identityoverride insert into MYTABLE; )

** 注意: ** load 命令中的 modified by identityoverride 可以保证导入数据时那些自增字段的值和原数据库中的数据一致.

  1. 使用 db2 -tvf export.sql 命令,导出所有表的数据。

(二)将 sample_tabs.ddl,sample_foriegnkeys.ddl,sample_triggers.ddl,load.sql 及所有导出的 .ixf 数据文件复制到 LINUX 机器上.

(三) LINUX 系统上的操作:

  1. 使用 CREATE DATABASE 命令创建数据库 SAMPLE ,创建必要的表空间及配置必要的数据库参数.

  2. 连接到 SAMPLE 数据库,使用 sample_tabs.dd 脚本文件创建表 (db2 -tvf sample_tabs.ddl) .

  3. 进入到放置 .ixf 数据文件的目录,使用 db2 -tvf load.sql 导入数据.

  4. 使用 sample_foriegnkeys.ddl 和 sample_triggers.ddl 脚本文件创建外键约束和触发器.

OK ,我们的数据库基本上就迁移成功了!

最后,别忘了对每张表运行 runstats 命令,你可以参照上面生成 export 和 load 命令脚本的方法来生成 runstats 脚本,然后再运行它。

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus