DB2数据库常见问题汇总)
DB2数据库常见问题汇总)
2010年06月20日
1.1 创建存储过程时需要注意变量声明的顺序
创建存储过程时,声明变量顺序不符合规范将提示:
SQL0104N An unexpected token "" was found following "".
Expected tokens may include: "". LINE NUMBER=11.
SQLSTATE=42601
解答:声明变量、游标以及条件处理要有序进行;普通变量声明在先,其次到游标的声明,最后才能声明condition handler。
1.11 因为死锁或超时,所以当前事务已回滚。
当前事务因死锁或超时而回滚,将提示:
SQL0911N The current transaction has been rolled back because of a deadlock or timeout. Reason code "2".
根据原因码确定具体原因,原因码如下:
2 由于死锁而导致事务已回滚。
68 由于锁定超时而导致事务已回滚。
72 因为存在与事务中所涉及的 DB2 Data Links Manager 有关的错误,所以事务已回滚。
常见原因码为2、68。应用程序已回滚至上一次 COMMIT。
解答:为了帮助避免死锁或锁定超时,对长时间运行的应用程序或有可能遇到死锁的应用程序频繁发出 COMMIT 操作(若有可能的话)。并适当地增大锁超时时间:db2 update db cfg using LOCKTIMEOUT 60(此处60秒为例)。
1.12 在客户端查询数据库中文信息会产生乱码
解答:在服务器端或客户端将编码类型设置为1208以支持中文:db2set DB2CODEPAGE=1208。
1.13 重启动机器后,用于创建表空间的裸设备与逻辑卷挂接失效,数据库无法使用,提示:SQL0290N Table space access is not allowed. SQLSTATE=55039
解答:按原来的对应关系重新将裸设备和逻辑卷挂接起来;或创建一个机器重启时自动执行的脚本,将该脚本放在/etc/init.d目录下,并在/etc/init.d/rcN.d(N为当前系统运行级别,使用runlevel或who r获得,不同系统命令不同)目录下建一个硬连接。
1.14 编目时确保使用正确的服务端口号
若在编目时使用的服务端口号与通过db2 get dbm cfg | grep SVCENAME查看到不一致,那在连接节点或数据库时,将出现如下提示信息:
db2inst1@osta1:~> db2 connect to l2cache
SQL30081N A communication error has been detected. Communication protocol
being used: "TCP/IP". Communication API being used: "SOCKETS". Location
where the error was detected: "10.71.122.196". Communication function
detecting the error: "connect". Protocol specific error code(s): "111", "*",
"*". SQLSTATE=08001
Administrator>db2 attach to L194 user db2inst1
输入 db2inst1 的当前密码:
SQL30081N 检测到通信错误。正在使用的通信协议:"TCP/IP"。正在使用的通信API:
"SOCKETS"。检测到错误的位置:"10.71.100.191"。检测到错误的通信函数:"connect"。
协议特定的错误代码:"10061"、"*"、"*"。 SQLSTATE=08001
解答:
1、 检查网络工作状态是否良好;
2、 通过db2 get dbm cfg | grep SVCENAME查看服务端口号,确认编目时使用的这个服务名称或端口号;并确定服务器端和客户端在etc/services文件中对服务名称、端口号和协议的配置一致;
3、 确定编目时使用的通信协议或etc/services文件中配置的通信协议跟服务器设置的一致(通过db2set DB2COMM查看服务器使用的通信协议);
4、 前面没问题,再去看看日志/sqllib/db2dump/db2diag.log是否有异常提示信息,根据提示解决问题。
1.15 不能分配"应用程序支持层"堆
内存不足(系统中可用的调页空间量或交换空间量或系统中可用的物理内存量),可能会导致问题,并提示如下错误信息:
SQL1221N The Application Support Layer heap cannot be allocated. SQLSTATE=57011
解答:确认有足够的内存资源可用于满足数据库管理器和系统上正在运行其它程序的需求。通过db2 update dbm cfg using ASLHEAPSZ 40(单位为4KB)适当增大应用程序支持层堆大小,或在适当的地方,停止使用该系统的其它程序。注意修改管理器的配置后,一定要重新启动实例,修改才能生效。
1.16 如何查看数据库占用内存情况
解答:1、db2pd memsets
1.17 如何查看DB2的进程
解答:使用db2_ps 可以确定db2是否正常启动。
1.18 如何将数据库运行的环境收集起来
解答:使用db2support ./ d 数据库名 s 将数据库环境及系统环境收集起来打成包,对于数据库管理器出现严重错误的情况,可以将此包发送给IBM的技术支援分析。
1.19 如何扩大表空间的容量
解答:给表空间增加新的容器:alter tablespace add (device '/dev/raw/raw110' 页数);我们可以通过list tablespaces show detail查看表空间大小是否增大了或通过list tablespace containers for 表空间ID可以查看到该表空间使用的裸设备。
1.20 数据库实例用户无法访问裸设备
当数据库实例用户没有权限访问创建数据库所用的裸设备时,数据库将无法使用,并会提示:The system attempted to write to a read-only file. SQLSTATE=55009
解答:修改裸设备的归属属性:chown db2inst1:db2grp1 /dev/raw/rawX(X为裸设备id)。
1.21 如何让数据库支持中文字符集
解答:在服务器端修改数据库字符集以支持中文字符集:db2set db2codepage=1208。
1.22 如何查看节点目录和数据库目录的信息
解答:使用db2 list node directory 可以查看到所有节点编目信息,使用db2 list db directory 可以查看到所有数据库的编目信息。
1.23