文档库

最新最全的文档下载
当前位置:文档库 > DB2数据库跨平台迁移步骤及注意事项

DB2数据库跨平台迁移步骤及注意事项

DB2数据库跨平台迁移步骤及注意事项

简介

针对DB2数据库跨平台迁移的需求,我们编写了此文档,对迁移的步骤及注意事项进行详细的记录。此文档以STMAOLD数据库为例,是从AIX 6.1迁移到REDHAT LINUX 6.0系统上,而且数据库版本也从DB2 v8.1.1.56升级到DB2 v9.7.0.7。STMAOLD数据库的数据量大约为26G,共有611张表,数据库支持联邦数据库,有多个跨库的视图,NICKNAME等。此次迁移我们使用DB2自带的db2move,db2look工具。

迁移步骤

经过实践,总结 DB2 数据库的跨平台迁移步骤如下:

1. 记录源数据库管理系统配置参数。

2. 导出源数据库系统的数据集。

3. 生成源数据库系统的数据对象定义语句。

4. 将生成的数据对象定义和数据文件等上传至目标平台

5. 在目标平台创建新的数据库,参照源系统设置参数。

6. 修改数据库参数,并创建bufferpool,tablespace。

7. 修改数据库对象创建语句,并导入目标数据库。

8. 将数据导入目标数据库。

9. 执行后期检查。

10. 配置应用程序,连接数据库,测试迁移是否成功。

迁移示例

下面给出一个遵循上述步骤的具体例子,其中将给出执行这些步骤的具体 DB2 命令以供参考。

1.记录源数据库管理系统配置参数。

这些是很重要的数据环境设置,其中的一些设置关系到迁移能否成功。

1. 记录数据库实例配置参数的命令

db2 get dbm cfg > dbm.cfg

2. 记录数据库配置参数的命令

db2 get db cfg for stmaold > stmaold.cfg

db2cfexp cfgpro backup

3. 显示数据库注册表变量的命令

db2set –all > db2set.txt

4. 显示数据库表空间的命令

db2 list tablespaces show detail

5. 显示数据库程序包的命令

db2 list packages

2.导出源数据库系统的数据集

DB2 提供了一个工具叫作 db2move,用户通过它可以把所有用户定义的表中的数据导出到 IXF(集成交换格式)的文件中。同时,在导入数据的时

候,它还可以生成表上的所定义的索引。具体的导出执行命令如下:

db2move stmaold export

根据数据库大小,机器性能的不同,这个导出过程可能耗时几分钟到几个小时不等。乌鲁木齐测试环境共26G的数据,此过程用时44分钟。导出过程的详细信息可查看EXPORT.out文件,里面记录了每个表的导出情况。

3.生成源数据库系统的数据对象定义语句

在导出了数据之后,要做的就是导出数据对象定义。DB2提供了一个工具叫db2look,用户可以通过它来生成数据库中的数据对象定义,包括别名,表,索引,视图,触发器,用户定义函数,等。因为在db2 v8版本中,db2look不支持导出存储过程,所以我们必须手工导出,然后再导入。具体的命令如下:

db2look -d dbname -l -o stmaold1.sql

db2look -d dbname -e -a -xd -o stmaold2.sql

db2 "EXPORT TO procedure.del OF del lobfile pro.del MODIFIED BY LOBSINFILE select 'SET CURRENT SCHEMA

'||rtrim(procschema)||'@'||chr(10)||'SET CURRENT PATH = SYSIBM,SYSFUN,SYSPROC,'||rtrim(procschema)||'

@'||chr(10)||text||chr(10)||' @'||chr(10) from syscat.procedures where procschema='DB2ADMIN' ORDER BY create_time"

第一条命令导出数据库BUFFERPOOL,TABLESPACES创建语句

第二条命令导出数据库中所有的对象,包括表,索引,NICKNAME等

第三条命令用来导出所有的存储过程,存储过程定义保存在文件pro.del.001中

4.将生成的数据对象定义和数据文件等上传至目标平台

使用tar命令将生成的所有文件打包如文件较大可用gzip压缩后上传至目标平台,并解压缩。如果两边平台上db2实例用户的uid不同的话,需

用chown –R db2admin:db2grp1 *来修改文件的属主及属组。

5.在目标平台创建新的数据库,参照源系统设置参数

在源平台上完成了数据导出和数据对象定义语句生成之后,下面就是要在目标平台建立实例及数据库了。

1)创建实例

./db2icrt -u db2fenc db2admin

2)修改数据库实例配置参数

db2 update dbm cfg using FEDERATED yes

db2 update dbm cfg using svcename 50000

3)创建数据库

db2start

db2 "create database stmaold using codeset GBK territory CN"

4)导入源数据库中的NODE,CATALOG信息

因为源数据库与目标数据库使用不同的数据库版本,因此我们不使用源数据库实例的配置文件,修改cfpro文件,去掉DBM_CONFIG所包含的内容,然后使用如下的命令导入

db2cfimp cfgpro

5)检查NODE,CATALOG信息

db2 list node directory

db2 list db directory

6)修改目标数据库配置文件并重启数据库

db2 update db cfg using auto_reval DEFERRED_FORCE

db2 update db cfg using LOGFILSIZ 128000 logbufsz 512 logprimary 40 logsecond 2

db2stop force

db2start

db2 connect to stmaold

对于非常复杂的数据库,目标数据库的日志参数还需要做出调整,以便在导入数据和生成数据对象时,系统不至于日志溢出。

6.修改数据库参数,并创建bufferpool,tablespace

修改stmaold1.sql,去掉create bufferpool中的NOT EXTENDED STORAGE,并修改创建表空间的语句,将容器路径改为目标数据库上的路径,执行如下的命令创建bufferpool和tablespace

db2 –tvf stmaold1.sql | tee stmaold1.log

建议创建完数据库bufferpool及tablespaces后对数据库做一个离线备份

db2 backup db stmaold

7.修改数据库对象创建语句,并导入目标数据库

1. 修改创建WRAPPER的语句,将libdb2drda.a改为libdb2drda.so

2. 需修改用户映射语句,添加REMOTE_PASSWORD

3. 修改CREATE SERVER语句,在WRAPPER "DRDA"后添加用户名密码,本例中添加的语句为authorization "db2admin" password

"db2admin"

4. 检查stmaold2.sql中的中文字符,如显示为乱码需要修改本地的环境变量LANG,本例中将LANG改为en_US, export LANG=en_US

5. 导入数据库对象,执行如下的命令

db2 –tvf stmaold2.sql | tee stmaold2.log

6. 检查stmaold2.log日志,查看有无错误发生,如有错误,需找出解决办法,然后用备份文件恢复数据库后重新导入对象。

7. 导入存储过程,并检查pro.log文件,查看是否报错。

db2 –td@ -vf pro.del.001 |tee pro.log

8.将数据导入目标数据库

如第6步数据库对象导入没有发生错误,可使用如下的命令导入数据

db2move stmaold load

load完成后请检查LOAD.out日志文件,查看是否有错误产生。

使用 load时不需要写日志(或很少日志),不做检查约束和参照完整性约束,不触发Trigger,锁的时间比较短,因此特别适合大数据量的导入.

如果表定义中有数据库管理的自动增长列,比如表定义语句含有 "GENERATED BY DEFAULT AS IDENTITY"。那么你需要更新这些列的起始计数。使用如下脚本批量修改:

cat stmaold2.sql|grep -B1 GENERATED|grep -v '\--'|awk '{if(NR%2==1) printf $3;else print " "$1}'|while read tn tid;do

db2 connect to stmaold >/dev/null

maxid=$(db2 -x "select max($tid)+1 from $tn");

if [ $maxid == "-" ];then

let maxid=1

fi

eval "db2 alter table $tn alter column $tid restart with $maxid"

done

9.执行后期检查

1. 检查表状态

通常,在使用load导入数据后,会有很多表处于load pending状态,使用如下的语句检查表的状态并自动生成完整性检查的命令:

db2 "select 'db2 set integrity for '||substr(tabname,1,30)||' immediate checked' from syscat.tables where status<>'N'"

2. 检查表的记录数

在源数据库和目标数据库上分别执行如下的命令统计表的记录数,然后用diff命令对比两边记录。

db2 connect to stmaold

db2 list tables for user|grep -w "T"|sort|while read tn ts other;do

db2 connect to stmaold>/dev/null;

echo $ts.$tn >>source.txt;

db2 "select count(*) from $ts.$tn">>source.txt;

done

db2 list tables for user|grep -w "T"|sort|while read tn ts other;do

db2 connect to stmaold>/dev/null;

echo $ts.$tn >>target.txt;

db2 "select count(*) from $ts.$tn">>target.txt;

done

如diff命令无输出则表明两边的记录数保持一致。

3. 检查FUNCTION记录数

在源数据库和目标数据库分别执行如下语句,对比返回结果

db2 "select count(*) from syscat.FUNCTIONS where funcschema='DB2ADMIN'"

4. 检查PROCEDURE记录数

在源数据库和目标数据库分别执行如下语句,对比返回结果

db2 "select count(*) from syscat.procedures where procschema='DB2ADMIN'"

5. 检查package个数

在源数据库和目标数据库分别执行如下语句,对比返回结果

db2 list packages

10.配置应用程序,连接数据库,测试迁移是否成功。

注意事项

1. 如果数据库中存在数据量非常大的表,且没有足够的本地磁盘空间用于保存落地的数据或用于数据库落地和传输的速度不可接受,可考虑使

用联邦数据库的方式来迁移数据,下面给出一个使用联邦数据库的方式迁移数据表的例子。

需迁移的数据库IP地址及数据库名端口为:10.49.1.17 stmaold 50000

目标数据库的IP地块及数据库名端口为:10。49.1.224 stmaold 50000

1. 在目标数据库创建catalog

db2 catalog tcpip node node17 remote 10.49.1.17 server 50000

db2 catalog db stmaold as stma17 at node node17 (请注意保证新catalog的数据库与本地数据库名称不要相同)

2. 在目标数据库创建SERVER及USER MAPPING

db2 "CREATE SERVER SERVER17 TYPE DB2/UDB VERSION '8.1' WRAPPER "DRDA" AUTHORIZATION \"db2admin\" PASSWORD \"db2admin\" OPTIONS ( DBNAME 'STMA17' )"

db2 "CREATE USER MAPPING FOR db2admin SERVER SERVER17 OPTIONS (REMOTE_AUTHID 'db2admin' , REMOTE_PASSWORD 'db2admin')"

3. 在目标数据库创建相关表的NICKNAME,我们以表COMM_CIGPRICE_LIST为例子

db2 "CREATE NICKNAME NICK_COMM_CIGPRICE_LIST FOR SERVER17."DB2ADMIN".COMM_CIGPRICE_LIST"

4. 使用NICKNAME导入数据库中的数据

db2 "insert into "DB2ADMIN"." COMM_CIGPRICE_LIST " select * from NICK_ COMM_CIGPRICE_LIST "

2. 在创建索引的过程中如果报如下的错误可忽略,发生此错误的原因为源数据库中同一个表的同一个栏位上存在多个索引而在新的数据库中仅

能创建一个索引。

SQL0605W The index was not created because an index "DB2ADMIN.IDX_BA_BB_1"with a matching definition already exists. SQLSTATE=01550

3. 在数据库导出导入时请注意文件系统是否支持大文件。