baoshengfei
作者baoshengfei·2016-03-19 16:05
软件架构设计师·EM

DB2几个问题的处理(一)

字数 2447阅读 3037评论 3赞 4

        这几天有几个朋友在操作中,遇到几个很基础的问题。既然这样,就普及一下基础的知识。

1. 表是怎样处于xxxpending状态的,然后应该怎么办?

        表的状态可以通过db2 load query <table>或者db2 "select status from syscat.tables where tabname='<tabname>'来查看。

        聊一下这几个状态:

        1. drop pending: 恭喜,这个表只能drop了。可能是因为roll forward时,前滚了truncate、load等不记日志的操作。

        2. load pending:load过程中,由于什么原因,被中断了,表就会处于这种状态。这种状态的表也不可写,只能进行使用load将上一次的load取消或者继续上一次的load操作。对于我这种操作性不强的选手,只记住了一个命令把表带入normal状态:db2 "load from /dev/null of del terminate into <tabname>"

        3. set integrity pending: DB2认为这张表的完整性可能有问题的时候,就会把表置于这种状态。比如说,刚刚向一个有主键的表中attach了一个分区、刚刚向一张有外键参考的表中load了数据,这个表就会处于这个状态。将表带出这个状态就需要set integrity这个命令。不过注意,set integrity有两种方式:checked和unchecked。所谓checked就是让数据库检查一下,把不满足一致性的数据处理一下,如果表很大,会需要很长时间;所谓unchecked,就是人类很确定新加入或者删除的数据肯定没问题,直接把让表处于normal状态。基于对人类的信任,给大家一个unchecked的命令语法:db2 set integrity for table all immediate unchecked。

        4. reorg pending:给表加字段了、删字段了,可能会导致这种情况。说可能,是因为只有reorg recommand类型的alter table操作才会让表处于这种状态。例如,简单加一个字段可能不会,但是运行三个加字段的命令就会。我非常不喜欢reorg操作,太费心。所以,我宁可通过导数据、rename的方式(即,create table a like b;load from cursor a to b;rename a to c,rename b to a)也不想进行reorg。但是,如果实在没办法时,只能reorg,既得,reorg的时候,要有页大小和源相同的临时表空间。reorg有很多技巧,有离线和在线的方式。

2. 从一个系统倒出来的del文件,往另一个系统中相同的表中导数据时,报错“数据被截断”,怎么回事?

        90%时因为编码方式才遇到了这个问题。导出导入数据时,要注意几方面的编码方式:源数据库、导出的del文件、操作系统和目标数据库。

        首先,目标数据库一定要有足够的容量装下源的数据。例如,如果两边都是GBK活着UTF-8,那长度肯定是一样的;如果源是GBK,目标是UTF-8,目标一定要比源大(不好意思,大多少我没搞清楚)。

        其次,如果是load from cursor或者ixf格式的文件,编码方式DB2能识别出来。但是如果是del格式,编码方式就依赖于系统LANG这个环境变量,如果设置了db2codepge,就依赖于db2codepge这个环境变量。如果export命令中,显示制定了modified by codepage=,那就依赖于这个参数。

        还是因为我是操作性不强的选手,所以,我选择在导入、导出时,都在命令行中明确制定codepage,而且codepage和我的数据库编码方式相同。

3. 表上发生了bad page怎么办?

        一般来说,如果索引或者表上发生了坏页,数据库就起不来了。但是,我们其实特别不想让数据库因为一张表活着一个索引而影响整个数据库。所以,多数情况下,我们希望将索引和表标记为不可用,将数据库启动起来,然后重建不可用的表。

        db2dart提供了这个功能,db2dart /MI这个选项从help里面就能看到。只要知道tablespace id和table id就可以了。/MT着选项用过的人可能不太多,因为这个选项没有显示在dart的help文档中,而是以隐式的方式让用户用。使用的方法和/MI是一样的。大家只要百度一下db2dart /MT就知道怎么用了。

        重要的是,/MT这个选项需要一个service code。这个service code可以通过400找IBM要一个。对于我这种操作性不强的选手,因为我曾经管IBM要过一个,我的数据库每次需要service code时,我都把系统时间改成我上次管IBM要service code的时间,然后使用那个service code。

好了,孩子催我下楼玩去了!

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

4

添加新评论3 条评论

cwhcwh数据库管理员cwh
2016-04-20 08:44
感謝
jamycymjamycym软件开发工程师厦门用友烟草
2016-03-22 10:29
总结得不错,期待(二)
砚凝0920砚凝0920数据库管理员上海宝信软件股份有限公司
2016-03-22 10:03
很有用,期待(二)
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广