panpan
作者panpan·2012-05-02 21:37
数据库架构师·pan

一次db2move案例

字数 4076阅读 9710评论 5赞 2
前提:想将生产用数据库的环境在自己的笔记本上配置,以便进行模拟调试和维护。

1、用db2move进行模式下的数据表的导出:
    db2move testdb export 
   在msg文件中出现警告:
   SQL3132W  The character data in column NAME" will be truncated to size "2".
   而且,出现警告的表没有出现在db2move.lst上。导致在load时数据丢失。

   但是,如果加上-aw选项,虽然msg文件有警告,但是出现警告的表进入了db2move.lst。这意味着在load时数据不会丢。
   db2move testdb export -aw

   (  原因:数据库代码页的设置问题。利用db2set将注册表变量db2codepage设置成与数据库的一样,重启实例,即可。
db2 get db cfg for testdb1 | grep code
 Database code page                                      = 1208
 Database code set                                       = UTF-8
 Database country/region code                            = 86
db2set db2codepage=1208
db2stop
db2start
   )

2、db2look提取需要的数据库环境的DDL
   db2look -d testdb -e -a -l -o db2look.sql

3、在笔记本上创建数据库。
  db2 create db testdb using codeset utf-8 territory cn collate using identity
4、db2look导入DDL
    db2 -tvf db2look.sql > log
5、vi log,发现如下error:
  (1) SQL1582N  The PAGESIZE of the table space "SYSTOOLSPACE" does not match the 
PAGESIZE of the bufferpool "IBMDEFAULTBP" associated with the table space.  
SQLSTATE=428CB
   (原因,笔记本上的testdb的IBMDEFAULTBP的pagesiae=4k,要创建的 "SYSTOOLSPACE",其pagesize=16k,表空间的pagesize与bufferpool的pagesize不匹配。"IBMDEFAULTBP"的pagesize由“create db testdb .... pagesize 16 k”指定,同时,其16 k,还是syscatspace,userspace,tempspace3个表空间的默认pagesize。
     而我创建数据库时,没有显示指定pagesize,默认给的是pagesize=4 k,所以"IBMDEFAULTBP"的pagesize=4 k)

  (2)SQL0670N  The row length of the table exceeded a limit of "4005" bytes. (Table 
space "USERSPACE1".)  SQLSTATE=54010
    (原因,定义的表中一列是varchar(5000),而之前我创建数据库时,没有指定pagesize,其表空间userspace的pagesize是4k,对于varchar数据类型,要求必须存储在单个page上,不能夸page。4K的pagesize最大存储4096个单字节字符,varchar(5000),再加上其他列的字节,显然超了。)

   (3)number,rownum等数据类型没有定义,dual没有定义:SQL0206N  "ROWNUM" is not valid in the context where it is used.  LINE NUMBER=35.  SQLSTATE=42703
    (原因,number,rownum是oracle的数据类型,我在创建数据库之前没有设置注册表变量DB2_COMPATIBILITY_VECTOR,只需在数据库创建之前,进行如下操作“db2set DB2_COMPATIBILITY_VECTOR=ORA”即可。这里注意,“db2set -lr ”命令不会列出DB2_COMPATIBILITY_VECTOR,只有设置之后,在db2set -all中才会出现)

   (4)CREATE PUBLIC ALIAS "SYSPUBLIC"."ALL_ALL_TABLES" FOR TABLE "SYSIBMADM"."ALL_ALL_TABLES"
SQL0403W  The newly defined alias "SYSPUBLIC.ALL_ALL_TABLES" resolved to the 
object "SYSIBMADM.ALL_ALL_TABLES" which is currently undefined.  
SQLSTATE=01522
   (原因,创建公共别名所引用的对象未定义,我看了一下,在sysibmadm模式下的所有以dba_*,all_*,user_*打头的视图都没有定义。但是,我自己再创建一个数据库(db2 create db testdb1),dba_*,all_*,user_*都存在。为什么2次创建的数据库,会有这个差异,我怀疑是数据库创建语句的问题(db2 create db testdb using codeset utf-8 territory cn collate using identity),这个差异导致建立sysibmadm模式下的所有以dba_*,all_*,user_*打头的视图的脚本没有执行,这个问题我在网上查阅了整个晚上,但是没有结果。喔,突然明白,dba_*,all_*,user_*打头的视图,都是oracle风格,实际上就是为了兼容oracle而定义的,我之前没有设置DB2_COMPATIBILITY_VECTOR,创建数据库时,当然没有定义这些视图。
    但是,为什么db2look会导出syspublic中的对象呢?如果我在笔记本上设置了DB2_COMPATIBILITY_VECTOR,再创建的数据库中就会有dba_*,all_*,user_*打头的视图,syspublic模式中也会有这些视图的别名,那db2look.sql脚本在执行时就会有冲突,虽然这无关紧要。我想,可能是为了防止用户自己在syspublic模式中定义的对象被丢弃,这叫“宁可错杀一千,不可放走一个”)。

6.查看数据表的状态
db2 select tabname,status from syscat.tables where tabschema = user_schema status = 'C'
发现有许多的表处于‘C’状态,即Check pending。需要利用set integrity语句对该表进行数据完整性检查(检查约束、外键约束、更新用IMMEDIATE CHECKED选项定义的汇总表(这个约束不清楚))。
由于有许多表,因此利用脚本是考虑的首选。
生成脚本:
db2 "select 'db2 set integrity for user_schema.' || tabname || ' immediate checked' from syscat.tables where schema = user_schema and status = 'C'"  > set_integrity.sql
对 set_integrity.sql添加connect数据库和提交事务的语句。
执行set_integrity.sql。
由于在检查外键约束时,表的顺序不总是按照“先基表、后子表”的顺序,所以会存在“对子表进行外键约束检查时,其引用的基表还处于check pengding状态”,从而导致报错。
不过,对set_integrity.sql进行若干次执行,则报错的表会逐渐减少,直至为0。

至此,整个db2move案例完成。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论5 条评论

tangyimstangyims软件开发工程师xxxxx
2016-01-06 18:57
楼主v5
qi0200000qi0200000数据库管理员黑龙江农信
2013-05-29 21:36
谢谢  学习了
thuanqinthuanqin其它ibm
2013-04-01 09:14
学习了
taylor840326taylor840326数据库管理员中国百盛集团
2013-04-01 00:17
谢谢,我也碰到了。
风影子风影子数据库管理员深圳
2013-01-25 09:10
正好碰到这个问题,困扰了好几天了,谢谢。
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广