DB2移植常见问题解析

白天鹅高手论坛 bsk888 5℃ 0评论

【IT168 技术文档】
安装与配置

·在 Linux 下重新安装 DB2 之后无法建立 DB2INST1 的实例,提示已经存在

解决办法:删除 /var/db2/v81 目录,再重新创建实例;

原因分析:在重新安装 DB2 之前,需要卸载原 DB2 安装环境,其中很重要的一步就是,使用 db2idrop 命令删除 DB2INST1 实例, 如果不删除,再次安装 DB2 之后,则无法建立相同名称的数据库实例。db2idrop 命令在 /opt/IBM/db2/V8.1/instance 目录下,以下为示例:

清单 1. db2idrop 命令示例
/opt/IBM/db2/V8.1/instance/db2idrop db2inst1

·在 Solaris 5.8 下安装 DB2 后却无法创建实例,提示 shmmax 需要调整

解决办法:编辑 /etc/system 文件,修改共享内存参数和消息队列值,重启机器后再建实例;

原因分析:DB2 在 UNIX 系统上需要使用 IPC 通信,所以内核参数共享内存和消息队列是关键指标,如果不能达到 DB2 要求数量,则 DB2 无法正常工作,其具体数字不易记忆,但可以查看 db2diag.log,里面记录了 DB2 所需要的具体数字,依照该数字更新内核参数即可。

·DB2 Runtime Client 可否不安装开发工具包,只安装足够客户端工作的组件,以方便模拟客户实际应用环境进行测试?

解决办法:DB2 Runtime Client并不包含开发工具包。其功能就是只提供客户端工作的组件包。

·一个裸设备无法同时分配给两个数据库,这样无法建立两个数据库服务器共享同一个裸设备

解决办法:把这两个数据库分别建在不同的实例上,将其中一个实例停下,第二个实例启动,分配裸设备给该活动实例上的数据库,分配完毕后将活动实例停下,启动第一个实例,重复先前分配裸设备的操作到第一个实例,即可实现当一个数据库停下时,该裸设备数据可以完全被另外一个数据库接管,从而实现共享。

原因分析:一个容器是无法同时分配给两个活动数据库的。必须针对两个实例来操作,分配给一个实例时另一个实例必须处于不活动状态。

·在 Linux 上 DB2 安装完成后,不能绑定 License,报 DBI1430N 错误

解决办法:

更新系统时间到当前时间。使用 Linux 中的 DATE 命令;
使用 db2licm 命令绑定 License:
清单 2. 绑定 License 命令示例
./db2licm -a db2ese.lic

·在 Linux 上 DB2 实例创建不成功,返回错误码 DBI1281E

解决办法:正确设置主机名;

原因分析:DB2 创建实例时要取主机名,如果主机名设置不正确,则会报告无法初始化实例的错误,也就是 DBI1281E,可以首先用 uname 或者 hostname 查看是否有主机名,进一步可以用 ping 命令验证主机名是否正确,如果 ping 不通则不正确,还可以检查 /etc/hosts 查看 IP 和主机名的对应关系是否正确。

连接数据库

·SuSE Linux C shell 环境下,无法连接数据库

解决办法:在cshell下,执行以下脚本设置环境,或将该命令加到 Linux 用户配置文件中:

清单 3. 设置环境
source <DB2INSTALLHOME>/sqllib/db2csrhc

原因分析:在 Linux 下,根据不同的 shell,需要执行不同的脚本来设置环境。

清单 4. 在不同的 shell 环境下设置
. <DB2INSTALLHOME>/sqllib/db2profile (B shell 或 K shell)
source <DB2INSTALLHOME>/sqllib/db2csrhc (C shell)

·CLP 连接数据库服务器返回错误,提示 codepage 无法转换,按提示更改代码页后仍然无法连接

解决办法:在 CLP 中运行 db2 terminate 后再重新连接即可;

原因分析:在 CLP 中 codepage 更改不会即时生效,必须断掉当前连接再连才会生效。

·Solaris 5.8 下用命令行方式无法连接数据库,提示遇到错误 SQL1084C

解决办法:编辑 /etc/system 调整内核参数,重启机器;

原因分析:查看 db2diag.log 可以发现消息队列错误,进一步发现该机器上的内核参数的消息队列值被改为 4096,DB2 需要 65535,更改这个参数重启机器和数据库,再连成功。

·在 Linux C Shell 下创建新的 DB2 用户之后,用该用户无法连接数据库

解决办法:在该用户 home 目录下寻找 .cshrc 文件,如果没有则手工创建一个,然后在该文件中加入以下一行,然后重新登陆或者使用 source .cshrc 即可连接数据库。

清单 5. shell 环境设置
source <DB2HOME>/sqllib/db2cshrc

原因分析:创建的用户所用的 shell 是 C shell,调用的是 .cshrc,该文件不存在,手工创建该文件,并在该文件中调用 sqllib/db2cshrc 后即可以正常连接数据库。

存储过程

·在 Stored Procedure 中如何判断一个系统文件是否存在

解决办法:使用 Java 开发一个 UDF, 将文件全名通过参数传递给这个 UDF,在 UDF 中判断系统文件是否存在然后返回结果代码;

原因分析:存储过程的主要目标是对数据库对象的操作,对文件系统操作需要借助于外部语言开发用户自定义函数,DB2 中提供了用各种外部语言开发函数的机制,所以推荐用 Java 开发 UDF 后,由该存储过程来调用。

·DB2 SQL PL 的 HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 无法捕获 SQLCODE=-727 和 SQLCODE=-911 的异常

解决办法:将 DB2 补丁升级到 DB2V8 FixPack9;

原因分析:在 DB2 V8 FixPack7 上的确存在该问题,在 FixPack9 中已经解决。

备份与恢复

·DB2 中可否查询最近一次全备份执行的时间以及全备份文件存放的路径

解决办法:在 CLP 中可以使用 list history backup all for <dbname> 命令查看,如需要在存储过程中使用,可使用表函数查询:select from table(snapshot_database(‘sample’,-2)) as t

原因分析:snapshot_database() 是 DB2 中提供的表函数,可以返回当前数据库的一些信息,其中包括了数据库上次备份的时间信息。第一个参数是数据库名,第二个参数是数据库分区标志,-2 代表所有分区,-1 代表当前分区。

·如何在数据库恢复的时候重定向表空间

解决办法:使用如下命令,详情请参见《DB2备份和恢复》简明手册:

清单 6. 在数据库恢复的时候重定向表空间

RESTORE DATABASE SAMPLE FROM "C:\TEMP" TAKEN AT 20050626155952 REDIRECT;
SET TABLESPACE CONTAINERS FOR 0 IGNORE ROLLFORWARD CONTAINER OPERATIONS
USING (PATH "C:\DB2\NODE0000\SQL00005\SQLT0000.
0");
RESTORE DATABASE SAMPLE CONTINUE;

转载请注明:乖乖彩色图库_皇冠顶尖高手论坛 » DB2移植常见问题解析

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址