db2数据迁移
版本:v8.1
任务:从生产拿数据到测试环境
处理过程中遇到的问题:
1、字符集问题。源数据库代码页为gbk,目标数据库代码页为uft-8
处理方法:导出或者导入时做格式转换
注意:由于在gbk库里面,一个汉字占两个字节,而uft-8里面,一个汉字站三个字节 ,导入目标库时,存在字段超过长度的告警错误
导出:
db2 "export to xxx.ixf of ixf select * from xxx"
db2 "export to xxx.ixf of ixf modified by codepage=1208 select * from xxx" --会自动把表结构中字段类型为char和varchar的字段长度扩大一倍
db2 "export to xxx.del of del modified by codepage=1208 select * from xxx"
导入:
db2 "load from xxx.ixf of ixf replace into xxx nonrecoverable"
db2 "load from xxx.del of del replace into xxx nonrecoverable"
注意:load导入时,如果长度字段超长,为把超长的每一条记录打印出来,数据量大的情况下很让人无语,会花大量的时间。对于这种错误,这次的处理方法就直接先把表字段长度扩大好了,然后再导入数据。查看load导入时的详细信息,可以使用db2 list utilities show detail
2、改字段类型问题
db2v8貌似不能直接修改,只能先删字段再加字段,无奈的时,该字段上面有索引....只能发大招,重建表了
为了安全,先备份原来环境的表结构
方法一:db2 "export to tbname.ixf of ixf select * from tbnamewhere 1=2"
方法二:db2look -d dbname -e -t tbname -o tbname.sql
将方法二中导出来的sql语句修改一下,把字段超长的长度加大,然后执行db2 -tvf tbname.sql 重新建表
另外:本来是想把测试环境的数据库删掉,直接把生产的数据库全部对象ddl拿回来,在测试环境还原一下,由于时间紧迫,又没做过,怕搞坏了,下次自己重新再做一次恢复,目前还没有相关的脚本,也希望有经验的同志不吝赐教,多多指导
临时建了一个空数据库
db2 create dbname using codepage=1208 territory cn
创建缓冲池
db2 create bufferpool bp16k size 2000 pagesize 16384
创建表空间
db2 create tablespace tpname pagesize 16384 managed by database using (file,'/dd/ddd',size) bufferpool bp16k
总结:在迁移过程中,还碰到了其他问题,如日志溢出,死锁等,毕竟测试环境和生产的是没得比,而且参数配置也存在差别。但总的来说,大部分问题都还是可以处理好。
感谢同事老师指导。小小的心得:计划好要做的事情,考虑好存在的问题,做好每一步,处理好碰到的问题。