解决使用数据库时出现的问题

使用此处给出的建议可以帮助您解决使用数据库时可能发生的问题。

准备工作

过程

发出 IBM Db2 错误消息 SQL0443N

过程

  • 场景: IBM® DB2® 服务器升级到新的修订包级别后,如果您调用 IBM Db2 调用级别接口 (CLI) 目录功能 (例如 SQLTables ()SQLColumns ()SQLStatistics ()) ,那么会发出 IBM Db2 错误消息 SQL0443N
    下列为错误消息示例:

    SQL0443N Routine "SYSIBM.SQLTABLES" (specific name "TABLES") has returned an error SQLSTATE with diagnostic text SYSIBM:CLI:-805". SQLSTATE=38553.

  • 解决方案: 通过在命令提示符处输入以下命令,针对每个数据库绑定 db2schema.bnd 文件:
    db2 terminate
    db2 connect to database-name
    db2 bind path\db2schema.bnd blocking all grant public sqlerror continue
    db2 terminate
    其中 database-name 是实用程序必须绑定的数据库的名称而 path 是绑定文件所在的目录的完整路径名。 例如, 窗口 上的缺省位置为 C:\Program Files\IBM\SQLLIB \bnd\

    要为特定 IBM Db2 实例列出数据库的所有名称,请运行 IBM Db2 CLI 命令 db2 列表数据库目录。 有关更多信息,请参阅 IBM Db2 文档。

发出 IBM Db2 错误消息 SQL0805N

过程

  • 场景: 包含 数据库 节点的消息流运行时,发生 SQL 错误SQL0805N NULLID.SQLLF000已发出。
  • 解决方案: 打开 " IBM Db2 命令行处理器" 窗口并向数据库发出绑定命令。
    Linux 平台UNIX 平台Linux®UNIX 系统上,输入以下命令:
    connect to db
    bind ~/sqllib/bnd/@db2cli.lst grant public CLIPKG 5
    connect reset
    其中 db 是数据库名称。
    Windows 平台窗口 系统上,输入以下命令:
    connect to db
    bind x:\sqllib\bnd\@db2cli.lst blocking all grant public
    connect reset

    其中, x: 标识安装在其中的驱动器 IBM Db2数据库 是数据库名称。

Linux 上发出 IBM Db2 错误消息 SQL0998N

过程

  • 场景: 您正在尝试将全局协调的消息流与 Linux 上的 IBM Db2 配合使用,并且发出了错误消息 SQL0998N ,其中包含原因码 09 和子代码 " "。
  • 解决方案: 请检查LD_ASSUME_KERNEL未设置环境变量。
    如果已设置,请使用 unset 命令从环境中移除此变量,并确保修改概要文件脚本,以便此变量保持未设置状态。

发出 IBM Db2 错误消息 SQL0998NSQL1248N

过程

  • 场景: 当您尝试将全局协调的消息流与 IBM Db2 数据库配合使用时,会收到以下某个错误消息:
    • SQL0998N,其原因码为 09 且子码为 ""
    • SQL1248N,其消息指示未使用事务管理器定义数据库
  • 解决方案: 使用 配置与 IBM Db2 的全局协调 中的指示信息来配置数据库和 XAResourceManager 节。

发出 IBM Db2 错误消息 SQL1040N

过程

  • 场景: 您正在使用 IBM Db2 数据库,并且发出了错误消息 BIP2322 ,但发生了错误 SQL1040N
  • 解释: 以下 IBM Db2 消息表明已达到 IBM Db2 数据库配置参数 最大应用程序数 的值:
    "SQL1040N The maximum number of applications is already connected to the database.
    SQLSTATE=57030"

    IBM Db2 已拒绝尝试进行连接。

  • 解决方案:
    1. 停止所有连接到受影响的数据库的集成节点。
    2. 请增大 最大应用程序数 配置参数的值。
      同时,检查关联参数 maxagents 的值,并依据 maxappls 来增加该值。
    3. 重新启动 IBM Db2 数据库。
    4. 重新启动集成节点。

连接到 IBM Db2 时发出了 IBM Db2 错误消息 SQL1224N

过程

  • 当您连接到 IBM Db2 数据库时发出 场景: IBM Db2 错误消息 SQL1224N 。 此错误指示无法启动数据库代理进程,或者该进程由于数据库关闭或强制命令已结束。
  • 解决方案: AIX®上,使用 TCP/IP 连接到 IBM Db2 数据库,以避免共享内存限制为 10 个连接。
    要设置 AIXIBM Db2 回送以使用 TCP/IP 连接,请执行以下操作:
    1. IBM Db2 配置为使用 TCP/IP ,并启动 TCP/IP 侦听器。
      在数据库服务器机器上,以 IBM Db2 实例所有者身份登录,通常db2inst1,并发出以下命令:
      db2set DB2COMM=tcpip
      db2stop
      db2start
    2. 如果未在以下项中定义 IBM Db2 连接端口: /etc/services, 请编辑服务文件以添加 IBM Db2 连接和中断端口。 必须使用唯一的名称,以及服务文件中没有定义过的端口号;例如:
      db2svc1     3700/tcp          # DB2 Connection Service
      db2isvc1    3701/tcp          # DB2 Interrupt Service
      
    3. 请更新 IBM Db2 配置; 例如:
      db2 update dbm cfg using svcename db2svc1 
      其中,db2svc1是以下项中 IBM Db2 连接端口服务的名称: /etc/services.

      或者,可以直接指定端口号。

    4. 使用以下命令停止并重新启动数据库:
      db2stop
      db2start
    5. 对新的 TCP/IP 连接节点进行编目:
      db2 catalog tcpip node NODENAME remote HOSTNAME server db2svc1
      其中:
      nodeName
      是新的 TCP/IP 连接节点的名称。 您可以使用local作为节点名称 (如果它是唯一标识)。
      HOSTNAME
      是计算机的名称。
      db2svc1
      是以下项中 IBM Db2 连接端口服务的名称:/etc/services.

      此命令成功完成后,将显示消息 DB20000I

    6. 使用新的别名对数据库编目,例如:
      db2 catalog database DATABASE as DBALIAS at node NODENAME
      其中:
      数据库
      是数据库的物理名称。
      DBALIAS
      是要使用的数据库别名。

      请在对本地数据库的所有后续引用中指定新的别名。

    7. 停止并启动 IBM Db2:
      db2 terminate
      db2stop
      db2start
    8. 使用运行集成节点的用户标识登录。
    9. 更新每个集成节点的 ODBC 配置文件,以添加数据库的定义:
      1. 在文件的开头部分,添加数据库别名的定义:
        DBALIAS=IBM DB2 ODBC Driver
      2. 添加数据库别名的新节:
         [DBALIAS]
        Driver=INSTHOME/sqllib/lib/db2o.o
        Description=Database Alias
        Database=DBALIAS
        其中 INSTHOMEIBM Db2 实例目录的路径。
    10. 更新消息流以指定别名数据库名称,将 BAR 文件重新部署到集成节点并测试流。

z/OS 上发出 IBM Db2 或 ODBC 错误消息

过程

  • 场景: IBM Db2 或 ODBC 消息在 z/OS® 上发出,指示以下一个或多个错误:
    • 发出数据库 SQL 连接命令时捕获异常。
    • 发生的数据库错误,其 ODBC 返回码为 -1、SQL 状态为 58004,且本机错误码为 -99999。
  • 解决方案: 如果显示了 ODBC 消息:
    1. 打开 ODBC 应用程序跟踪,以生成 Traceodbc 文件。
    2. 找到 Traceodbc 文件,该文件将写入 /输出 子目录。
      例如,完整路径可能是 /u/argo/VCP0BRK/output/traceodbc
    3. 转至此文件的底部并搜索 SQLerror 的前一个实例。
    常见 IBM Db2 问题包括:
    • ODBC 返回码 -1、SQL state 58004、本机错误码 -99999
      可能由于下列原因返回了这些代码:
      • 没有 SQL 代码。 未启动子系统 IBM Db2
      • RRS 没有启动。
    • SQLCODE 922。

      启动式任务的用户标识未授权使用规划 DSNACLI。

    • ODBC 返回码 -1、SLQ 状态 42503、本机错误码 -553

      如果启动式任务的用户标识无权使用当前 SQL 标识,那么可能会返回这些代码。 重新配置集成节点并指定DB2_TABLE_NAME作为有效名称,或者创建 RACF ® 组,并将启动式任务用户标识连接到此组。

您不知道集成节点需要多少个数据库连接

过程

  • 场景: 您不知道要为集成节点设置多少个数据库连接。
  • 解决方案: 确定集成节点在容量和资源规划方面需要的数据库连接数。 在 IBM Db2上,所执行的缺省操作是将与数据库的并发连接数限制为 最大应用程序数 配置参数的值; 最大应用程序数 的缺省值为 40。 关联的参数 maxagents 也会影响当前连接数。

    单个集成节点的连接需求如下:

    • 内部集成节点线程需要五个连接。
    • 每个消息流线程的单独 ODBC 数据源名称的每个数据库访问节点需要一个连接(即,如果不同的节点使用相同的 DSN,使用相同的连接)。

要将 XA 与 IBM Db2 数据库配合使用

过程

  • 场景: 您希望将 XA 与一个或多个 IBM Db2 数据库配合使用。
  • 解决方案: 确保您的队列管理器配置为使用 控制线程 = 线程数
    • Linux 平台UNIX 平台LinuxUNIX 系统上,在集成节点队列管理器的文件 qm.ini 中的 XAResourceManager 节中配置此参数。
    • Windows 平台窗口 系统上,在 WebSphere® MQ Explorer 中配置此参数。

无法装入具有 IBM Db2 个数据库的 XA 需要的 db2swit 文件

过程

  • 场景:IBM MQ 队列管理器错误日志中存在错误消息,指示无法装入 db2swit 文件。
  • 解释: IBM Integration Bus 提供了一个预构建的交换机装入文件,该文件用于具有 IBM Db2的 XA。 如果无法装入此文件,那么 XA 事务无法进行。
  • 解决方案: 此情况可能 2 的原因有两个:
    1. IBM Integration BusIBM MQ 可能未正确地配置。 要建立正确的配置,请参阅 配置与 IBM Db2 的全局协调中的指示信息。
    2. IBM Integration Bus 一起提供的交换机装入文件 db2swit可能与您正在运行的 IBM Db2 版本不兼容。 如果是这个原因,您必须构建自己的 db2swit 文件版本。 有关构建您自己的 db2swit 文件的指示信息,请参阅 IBM Integration Bus 安装中的 sample/xatm/readme.db2 文件。

如果在集成节点正在运行时数据库重新启动,那么 XA 协调将失败

过程

  • 场景: XA 全局协调失败,并且您会收到类似以下示例的错误,该错误来自 IBM Db2 数据库:
    Database error: SQL State '40003'; Native Error Code '-900';  Error Text '[IBM]
    [CLI Driver] SQL0900N  The application state  is in error. A database connection 
    does not exist.SQLSTATE=08003'.
  • 解释: 如果在集成节点仍在运行时重新启动数据库,那么全局协调的消息流无法自动重新连接到数据库。
  • 解决方案: 如果数据库发生故障,或者由于安排的维护而停机,请停止并重新启动集成节点。

访问 z/OS 上的 IBM Db2 时发出错误消息 BIP2322

过程

  • 场景: 您正在运行一个消息流,在该消息流中,节点尝试访问 IBM Db2 数据共享组上的表。
    如果 ODBC 跟踪是打开的,错误消息写到 traceodbc 文件:
    SQLError( hEnv=0, hDbc=0, hStmt=1, pszSqlState=&302f8ecc, pfNativeError=&302f8ec8,
    pszErrorMsg=&28f6a6d0, cbErrorMsgMax=1024, pcbErrorMsg=&302f8eb4 )  
    SQLError( pszSqlState="51002", pfNativeError=-805, pszErrorMsg="{DB2 for OS/390}
    {ODBC Driver}{DSN06011}
     DSNT408I SQLCODE = -805, ERROR:  DBRM OR PACKAGE NAME DSN610GH..DSNCLICS.16877-
              BE5086005F4 NOT FOUND IN PLAN DSNACLI. REASON 02                      
     DSNT418I SQLSTATE   = 51002 SQLSTATE RETURN CODE                               
     DSNT415I SQLERRP    = DSNXEPM SQL PROCEDURE DETECTING ERROR                    
     DSNT416I SQLERRD    = -350  0  0  -1  0  0 SQL DIAGNOSTIC INFORMATION          
     DSNT416I SQLERRD    = X'FFFFFEA2'  X'00000000'  X'00000000'  X'FFFFFFFF'       
              X'00000000'  X'00000000' SQL DIAGNOSTIC INFORMATION  
    
    伴随此错误发生 syslog 中的下列 BIP2322 错误消息:
    BIP2322E: DATABASE ERROR: SQL STATE '51002'; NATIVE ERROR CODE '-805'
  • 解释: 如果尚未以正确方式绑定 DSNACLI 计划,那么会发生此错误。
  • 解决方案: 请确保正确绑定了 DSNACLI 计划。
    请参阅 绑定 IBM Db2 计划以在 z/OS 上使用数据共享组 以获取有关如何完成此任务的信息。

当您连接到 Informix 数据库时发出错误消息 BIP2322 IM004

过程

  • 场景: 您正在使用 mqsicvp 命令连接到 Informix® 数据库,并且您会看到以下错误消息。
    BIP2322E: Database error: SQL State 'IM004'; Native Error Code '0'; Error Text '[DataDirect][ODBC lib] 
    Driver's SQLAllocHandle on SQL_HANDLE_ENV failed'. The error has the following diagnostic information: 
    SQL State 'IM004' SQL Native Error Code '0' SQL Error Text '[DataDirect][ODBC lib] Driver's SQLAllocHandle 
    on SQL_HANDLE_ENV failed'. 
  • 解释: 此错误可能是由于尚未初始化数据库的环境而引起的。
  • 解决方案: 请查看集成节点系统上客户机的文档,以了解必须执行的操作的详细信息。 例如,可能必须指定以下环境变量:
    export INFORMIXDIR=/installation_directory_of_informix_client_software
    export PATH=${INFORMIXDIR}/bin:${PATH}
    export INFORMIXSERVER=server_name
    export INFORMIXSQLHOSTS=${INFORMIXDIR}/etc/sqlhosts     
    export TERMCAP=${INFORMIXDIR}/etc/termcap
    export TERM=vt100
    export LIBPATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:
                   ${INFORMIXDIR}/lib/cli:$LIBPATH

    其中 server_name 在文件 sqlhosts 中定义(此必需值通常为机器名),文件 sqlhosts 的位置作为 安装过程的一部分来设置。

    要将系统配置为每次会话启动时运行此设置,请将这些语句添加到要运行集成节点的用户登录概要文件中。

    有关更多信息,请参阅 运行数据库设置脚本

在 Oracle 上,即使行存在,数据库操作也未能返回任何行

过程

  • 场景: 您正在消息流中使用 Oracle 数据库,并且 ESQL 针对声明为数据类型 CHAR 的列进行绑定,这些参数标记在 WHERE 子句中被引用。 即使行存在,数据库操作也未能返回任何行。
  • 解释: 必须在 Oracle 上使用空白字符填充固定长度的字符串,此类型的比较才能成功。
  • 解决方案: 将 CHAR 列定义为 VARCHAR2 列,或者将包含空白字符的 ESQL 变量填充到必需的列长度,以便比较从表中找到必需的行。

Integration node commands fail when the Oracle 10g Release 2 client runs on POWER 上的 Linux with Red Hat Enterprise Linux Advanced Server V4.0

过程

  • 场景: 在 2 Red Hat Enterprise Linux Advanced Server V4.0的 POWER ® 上的 Linux 上运行 Oracle 10g R2 客户机的环境中,集成节点命令失败。
    可能会创建内容类似于以下数据的异常结束文件:
    /opt/mqsi/lib/libCommonServices.so(.ImbAbendSignalHandler+0x10)[0x800017d3c0] 
    [0x80022b33f0]
    /lib64/tls/libpthread.so.0[0x80cc2339d8]
    /lib64/tls/libpthread.so.0[0x80cc230e4c]
    /lib64/tls/libpthread.so.0[0x80cc22af54]
    bipservice[0x10005e38]
    /lib64/tls/libpthread.so.0[0x80cc22a1d8]
    /lib64/tls/libc.so.6[0x80cc0dd3e4]
    
    /opt/mqsi/lib/libImbCmdLib.so(._ZN15ImbCreateTables15createAllTablesEv+0x38)
    [0x800014c9bc]mqsicreatebroker[0x10023324]mqsicreatebroker[0x1002c0c4]
    /opt/mqsi/lib/libImbCmdLib.so(._ZN10ImbCmdBase20processCommandStringEv+0x6c)
    [0x80001dcad4]mqsicreatebroker[0x1000d728]/lib64/tls/libc.so.6[0x80cc02423c]
    /lib64/tls/libc.so.6[0x80cc0243c4]
  • 解释: Oracle 安装库包含 利布格克 库文件的副本。 Oracle 用户概要文件会将这些文件所在的目录添加到环境变量 LD_LIBRARY_PATH 中。 此操作会导致 libgcc 库文件先于系统库被找到,并导致集成节点命令失败且生成异常结束文件。
  • 解决方案: 请确保将 /lib64 添加到环境变量 LD_LIBRARY_PATH 中的 Oracle 库路径之前。 请在运行 mqsiprofile 之前在其中包括类似以下内容的字符串:
    /lib64::/usr/lib:/oracle/app/oracle/product/10.2.0/db_1/lib
    其中,/lib64 位于 Oracle 库目录之前。

错误消息 BIP2322Driver not capable在使用 Informix 数据库时发出

过程

  • 场景: 当您尝试从消息流中的节点访问 Informix 数据库时,会发出以下错误消息:
    BIP2322E: Database error: SQL State 'HYC00'; Native Error Code '-11092';  
    Error Text '[Informix][Informix ODBC Driver]Driver not capable.'.
  • 解释: 集成节点使用事务语句,因此必须创建数据库并将其配置为启用日志记录。
  • 解决方案: 请咨询您的数据库管理员以确保已在集成节点尝试访问的 Informix 数据库上启用事务日志记录。
    例如,创建使用缓存日志的数据库:
    create database with [buffered] log;

数据库更新没有按所要求的落实

过程

  • 场景: 您已在消息流中包含了 数据库 节点, 计算 节点或 过滤器 节点,并且已将 交易 属性设置为 落实。 消息流发生异常并回滚,但没有落实更新。
  • 解释: 交易 设置为 落实时,将在节点成功完成时落实节点所执行的数据库更新。 如果在节点完成之前发生异常,并且此异常导致消息流回滚,那么将不执行落实操作,并且数据库更新也将回滚。 在下列条件下会发生这种情况:
    • 节点本身导致发生异常。 将不执行落实。
    • ESQL 包含 PROPAGATE 语句。 直到沿着传播消息的路径进行的所有处理完成,并且控制权返回到节点后,此语句才完成。 只有到那到,才会执行落实。 如果这条路径上发生异常,将不返回控制权,并且数据库更新也将作为消息流的一部分回滚。
  • 解决方案: 请复查执行数据库更新的节点的操作。
    例如,您可能能够将工作分摊到两个节点上进行,第一个节点更新数据库,而第二个节点传播输出消息。 考虑更改 ESQL 代码,以用另一种方式处理消息。

您希望列出集成节点占用的数据库连接

过程

  • 场景: 您希望列出集成节点所拥有的数据库连接。
  • 解决方案: 集成节点没有任何功能来列示它与数据库的连接。 请使用您的数据库提供的工具以列出连接。 要了解如何执行此任务,请参阅数据库文档。

您希望知道是否按预期为数据库设置的密码

过程

  • 场景: 您要检查为与集成节点关联的数据库设置的密码是否为您期望的密码。
  • 解决方案: mqsireportdbparms 命令与集成节点名称,用户标识和密码配合使用。 此命令将报告所输入的密码是否正确。 有关更多信息,请参阅 正在检查集成节点使用的资源的密码

队列管理器发现针对 窗口 上具有 IBM Db2 的 XA 配置的 XA 资源管理器不可用

过程

  • 场景: 您已在 窗口 计算机上配置用于与 IBM Db2 进行 XA 协调的队列管理器。
    重新启动队列管理器时,它将在队列管理器错误日志中报告错误 AMQ7604。 在 WebSphere MQIBM Db2 之间进行 XA 协调的所有后续尝试都失败。

    此错误消息具有以下内容或类似的内容:

    23/09/2008 15:43:54 - Process(5508.1) User(MUSR_MQADMIN) Program(amqzxma0.exe)
    AMQ7604: The XA resource manager 'DB2 MQBankDB database' was not available 
    when called for xa_open. 
    The queue manager is continuing without this resource manager.
  • 解释: 运行 WebSphere MQ 服务进程 amqmsrvn.exe(缺省值为 MUSR_MQADMIN) 的用户标识正在使用不包含该组的组成员资格信息的访问令牌运行 DB2USERS。
  • 解决方案: 检查 WebSphere MQ 服务用户标识是否为组的成员 DB2USERS,停止 WebSphere MQ 服务 (例如,通过发出命令 net stop "IBM MQSeries") 以及正在同一用户标识下运行的所有其他进程,然后重新启动这些进程。
    您可以在检查用户标识状态后重新启动计算机以停止然后重新启动这些进程,但通常情况下不需要执行此操作。

使用样本时,当您尝试除去 窗口 上的 IBM Db2 数据库时接收到错误消息

过程

  • 场景: 您正在运行一个样本,并且正在尝试除去 窗口 计算机上的 IBM Db2 数据库,并且您接收到 BIP9835E 错误消息,其中包含错误代码 SQLSTATE=57019

    此错误消息具有类似以下数据的内容:

    BIP9830I: Deleting the DB2 Database <Your database name>.
    BIP9835E: The DB2 batch command failed with the error code SQLSTATE=57019.
    The database <Your database name> could not be created/deleted. 
    The error code SQLSTATE=57019 was returned from the DB2 batch command.
  • 解释: 如果使用 IBM Db2 控制中心来执行查询,那么会针对数据库打开一个连接。 此连接将保持打开状态,直到 IBM Db2 控制中心关闭为止,此时将结束此连接。
  • 解决方案: 关闭 IBM Db2 Control Center 应用程序,然后再次尝试运行样本。

发出 IBM Db2 错误消息 SQL7008N

过程

  • 在 iSeries 上更新或插入表时, 场景: 您正在使用 IBM Db2 并迂到错误 SQL7008N
  • 当 iSeries 服务器上正在访问的表未记入日志时, 解释: SQL7008N 是常见错误。
  • 解决方案: 要更正错误,请执行下列其中一个步骤:
    • 对表创建日志。
    • 将隔离级别更改为未落实。 您可以通过使用以下 IBM Db2 命令将 ODBC 数据源所引用的数据库别名的隔离级别更改为 无落实 :
      db2 update cli cfg for section <db_alias> using TxnIsolation 32

在 z/OS 上访问 DB2 时,发出 SQLCODE -981

过程

  • 场景: 您正在运行使用 ODBC 数据库交互的消息流。 尝试落实或回滚时, DB2 会报告 SQLCODE=-981 和 SQLSTATE=57015的错误。 看到类似于以下内容的错误消息: {DB2 FOR OS/390®}{ODBC DRIVER}{DSN09015} DSNT408I sqlcode = -981 ,错误: SQL 语句失败,因为 RRSAF 连接未处于以下状态: 允许 SQL 操作,原因: 00C12219
  • 解释: 您可以选择要落实或回滚的 ODBC 数据库操作,而不考虑整个消息流事务的成功或失败。 如果您尝试在单个消息流线程上使用多个不协调的 ODBC 数据库连接,那么可能会出现此错误。
  • 解决方案: 每个线程仅支持一个未协调的 ODBC 数据库连接。 请更新消息流,以便仅在消息流事务外部对一个数据库执行 ODBC 数据库操作。 支持任意数目的不同数据库作为协调消息流事务的组成部分。