频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

全面解析IBM DB2数据库移植的常见问题

来源:赛迪网 作者:Anna 出处:巧巧读书 2008-07-01 进入讨论组
下一页 1 2 

本文为作者针对实际项目数据库迁移的经验总结出的常见问题集,涉及到将数据库从 OracleSQL Server 迁移到 DB2 过程中的安装、配置、管理、开发等方面。

安装与配置

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 错误

解决办法:

1.更新系统时间到当前时间。使用 Linux 中的 DATE 命令;

2.使用 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;

数据操作

如何对应 SQLServer 的 InsertBulk 命令?

解决办法:使用 load 命令。

如何给 VARGRAPHIC 类型字段设置缺省值?

解决办法:将数据库建为 UTF-8 格式的数据库。

原因分析:

表中有 long varchar 字段,在存储过程的游标中,以 select distinct varchar(该字段)……方式选择记录,但编译通不过

解决办法:把 distinct 去掉;

原因分析:如果有 long 型字段,加 distinct 关键字就失去意义而且十分影响性能,另外该列在原来的 Oracle 应用中也只是定义为 varchar(4000),建议在 DB2 中仍设为 varchar 型,同时将该表所在表空间的 pagesize 加大,由缺省的 4k 设为 16k 或 32k。

DB2存储过程中的异常处理如何写,与Oracle中的有何区别?

解决办法:DB2 中使用以下 SQL 语句声明和处理异常:

清单7. 声明和处理异常,方法一

DECLARE <continue EXIT | UNDO>HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND

BEGIN

END;

或者也可以针对某一sqlstate定义相应的错误处理句柄,示例如下:

清单8. 声明和处理异常,方法二

DECLARE condition_name CONDITION FOR SQLSTATE value;

DECLARE EXIT HANDLER FOR too_many_rows

BEGIN

...

END;

如何查询数据库中用户已定义的表?

解决办法:select * from syscat.tables;

原因分析:DB2 提供了一组视图用以用户查询数据库对象,这些视图统一存放在 SYSCAT 模式下,这些视图几乎包含了所以的数据库对象编目信息,包括表、视图、名字空间、存储过程等等。用户可以在《DB2 UDB SQL Reference Volume 1》SQL Reference 1 的 Appendix D 中找到这些视图的详细定义。

如何查询数据库中用户已定义的 sequence?

解决办法:使用 select * from syscat.sequences。

如何用SQL语句获得表空间的当前使用率?

解决办法:可以使用如下 SQL 语句查询,在用该语句获得了表空间已用页数,可用页数等信息后,即可计算出表空间当前使用率:

清单9. 获得表空间页数信息

select tablespace_name, page_size, usable_pages, used_pages, free_pages

from table( snapshot_tbs_cfg( 'sample', -1 ) ) as t

where t.tablespace_type = 0 and t.tablespace_name= <tablespace_name>

在 Oracle 中可以将游标结果集通过 BULK 方式存入宿主数组中,DB2中如何实现?

解决办法:DB2 中不支持 BULK 方式,其替代方式是定义相应的数组,然后以循环方式每次从游标结果集中 fetch 一条记录到数组元素中。

DB2中如何用 SQL 语句取出满足条件的结果集的前N条记录?

解决办法:使用 select * from <tablename>where <condition>fetch first <number>row only。

更多文章 更多内容请看DB2DB2中的数据处理数据库专栏专题,或进入讨论组讨论。
下一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章