加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

db2 问题ERROR报告和解决方法

(2011-08-23 13:22:42)
标签:

db2

error

端口

协议

模式

schema

it

分类: JAVA

一:

com.ibm.db2.jcc.b.gm: [jcc][t4][2043][11550][3.50.152] 异常 java.net.ConnectException:打开端口 50,000 上服务器 /10.45.2.2 套接字时出错,消息为:Connection refused: connect。 ERRORCODE=-4499, SQLSTATE=08001
at com.ibm.db2.jcc.b.wc.a(wc.java:283)

 

解决方法:

1、首先检查连接的db2服务器的防火墙有没有关闭,需要关闭防火墙才能连接远程数据库。

2、如果使用jcc.jar的Driver的话,需要使用db2set DB2COMM=TCPIP,才可以使用jdbc type v4 来连接。

3、检查DB2的服务是否都已经启动,尤其是提供远程连接的服务。

4、检查数据库名称是否正确

5、检查监听的端口有没有出错。检查端口有很多种方法:1:  通过netstat -ano|findstr portNumber找到有无该侦听端口,查到PID,之后使用tasklist|findstr PID来查看侦听该端口的进程是否是db2进程。2:检测'db2 get dbm cfg|grep SVCENAME",查看TCPIP服务名称和/etc/services中定义的db2服务名称是否匹配,windows下是“WINDOWS/system32/driver/services,若不匹配,使用"db2 update dbm cfg using SVCENAME serviceName", "db2 terminate",然后重启db2服务即可。

  事实上修改db2侦听端口的方法是在services文件中修改端口号和SVCENAME,之后使用"db2 update dbm cfg using SVCENAME serviceName", 将serviceName代入为services文件中端口号对应的名称。然后才是"db2 terminate",然后重启db2服务。注意"db2 update dbm cfg using SVCENAME serviceName", 不是"db2 update dbm cfg using SVCENAME portNumber", 也不是"db2 update dbm cfg using SVCENAME serviceName=portNumber"。不过建议将不要将端口设置太小,至少大于10000,这样比较保险! 

 

这里补充db2端口的更多信息:

C:\WINDOWS\SYSTEM32\DRIVERS\ETC\services文件中与DB2相关的比如有如下这些:

DB2_DB2                      60000/tcp
DB2_DB2_1                  60001/tcp
DB2_DB2_2                  60002/tcp
DB2_DB2_END              60003/tcp
db2c_DB2                       50000/tcp
DB2_DB2CTLSV             60004/tcp
DB2_DB2CTLSV_1         60005/tcp
DB2_DB2CTLSV_2         60006/tcp
DB2_DB2CTLSV_END     60007/tcp
db2c_DB2CTLSV             50001/tcp

 

其中下面几个是在安装是选择了partition才有的,一共有两个实例
实例一:db2c_DB2
DB2_DB2 60000/tcp
DB2_DB2_1 60001/tcp
DB2_DB2_2 60002/tcp
DB2_DB2_END 60003/tcp
实例二:db2c_DB2CTLSV
DB2_DB2CTLSV 60004/tcp
DB2_DB2CTLSV_1 60005/tcp
DB2_DB2CTLSV_2 60006/tcp
DB2_DB2CTLSV_END 60007/tcp

真正用于应用程序和编目数据库的端口号是db2c_DB2 50000/tcp 和db2c_DB2CTLSV 50001/tcp

一般在安装DB2的时候,默认安装都是建两个实例的,DB2和DB2CTLSV,所以,就对应两个端口:50000/tcp和50001/tcp。


其他端口是在安装选择分区方式时才会有的,这些端口时分区间的通讯使用

 

补充db2set DB2COMM=TCPIP之外的其他命令:

db2set -g DB2COMM=TCPIP  设置所有实例的通信协议是TCPIP

db2set  -i instanceName DB2COMM=TCPIP  设置特定实例instanceName的通信协议是TCPIP

db2set -all   在装完db2之后,缺省情况下没有将DB2COMM 设置成 TCPIP。如果不设置,那么其它应用就无法连接到数据库,一开始很可能以为db2服务没有起来或者端口设置错误。实际上只要键入如下命令db2set -all就可以看到db2是否将DB2COMM 设置成 TCPIP,如果没有设置,需要输入命令”db2set db2comm=tcpip“才能够将DB2COMM设置成TCPIP。


 二:

DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.TEST  DRIVER=3.58.82
sqlstate   42704:   检测到未定义的对象或约束名。意思是说DB2ADMIN这个schema下面的TEST表不存在。

原因有两个:1、没有设置访问用的Schema。2、使用的Schema和实际要访问的数据库表Schema不相符。

通常情况下可以通过currentSchema来设置连接Connection所用的当前模式,也可以不设置currentSchema,通过在sql语句中显式指明表的模式,如:select * from DB2ADMIN.TEST。

如果这两种方式都不采用,DB2会默认使用用户名作为访问数据库表的Schema,比如user为db2admin的时候不使用上述两种方式之一指定schema就会出现这个错误,不过前提是访问表的schema不是DB2ADMIN,如果是DB2ADMIn,应该是没有问题的。

 

补充关于db2的schema的相关知识。

   通过DB2提供的专用寄存器current schema/sqlid可以查看当前的模式,比如    
   select current schema from sysibm.sysdummy1    
   select current schema from sysibm.dual    
   或    
   select current sqlid from sysibm.sysdummy1    
   select current sqlid from sysibm.dual    
   或    
   values current schema    
   values current sqlid     
   :dual是一个从sysdummy1中创建而来的view    
   
   db2 => connect to study
    
       数据库连接信息
    
     数据库服务器         DB2/NT 9.5.0
     SQL 授权标识         ZHANGRP
     本地数据库别名       STUDY
    
    db2 => select current schema from sysibm.sysdummy1
    
       
    ------------------
    ZHANGRP    
      条记录已选择。
    
    db2 => select current schema from sysibm.dual
    
    1
    ------------------
    ZHANGRP    
      条记录已选择。
    
    db2 => set current schema toms
    DB20000I  SQL命令成功完成。
    db2 => select current schema from sysibm.dual
    
       
    ----------------------
    TOMS    
      条记录已选择。
    
    db2 => select current sqlid from sysibm.dual
    
    1
    ----------------------
    TOMS    
      条记录已选择。
    
    db2 =>  
    
    db2 => values current schema
    1
    ----------------------
    TOMS
     条记录已选择。
    db2 => values current sqlid
    1
    ----------------------
    TOMS
     条记录已选择。
    

 

 

 

另外,一般在执行SQL语句等db2命令时,除了密码以外是不用区分大小写的,这是因为db2会自动给你转换成大写。而且表名等object的名字也是以大写保存在数据库中的,不管你创建的时候是大写还是小写。但是特别注意的是使用com.ibm.db2.jcc.DB2Driver驱动连接数据库,在指定缺省模式名的情况下,模式名不会自动转换。就是说如果提供的是小写的模式名,那么以后的select,updata等数据库操作,没有显式指定模式名的情况下都将失败。当然是也可以建小写schema名的schema的。

 

 

三:

DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=delete;BEGIN-OF-STATEMENT;SELECT, DRIVER=3.58.82

这个原因通常是指语法错误,仔细查看sql语句是否有错误。通常db2中的delete语句拒绝使用符号*,即是:delete from tablename where ....而不是delete * frome tablename where ...

 

四:

DB2 SQL Error: SQLCODE=-551, SQLSTATE=42501, SQLERRMC=DB2ADMIN;SELECT;DB2ADMIN.T

EST, DRIVER=3.58.82

 

这个错误是权限问题引起的。通过table的特权选项查看使用的用户的权限,并给予正确的授权,至少允许select、update、insert和delete。SQLERRMC=DB2ADMIN;SELECT;DB2ADMIN.TEST, 是在说DB2ADMIN这个用户对DB2ADMIN.TEST表没有Select的权限。

 

五:

[jcc][t4][10120][10898][3.58.82] 操作无效:已关闭 result set。 ERRORCODE=-4470, SQLSTATE=null

 

这个原因很明显,使用一个一个已经关闭的ResultSet去获取对象,结果肯定是null。查看是否将使用的ResultSet的变量名写错了。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有