【问题标题】:Oracle RAC Failover with CLOB query使用 CLOB 查询的 Oracle RAC 故障转移
【发布时间】:2014-02-18 03:06:34
【问题描述】:

全部。 我们有一个 Oracle RAC 集群安装,并且我们正在使用 TAF 在 SELECT 上测试 RAC 故障转移。我们使用 OCI 驱动程序即时客户端版本 11.2,以及具有 2 个副本节点的 RAC。

我们尝试使用 C 语言编写一个简单的基于 OCI 的应用程序来连接到我们的数据库并从表中检索所有记录。如果我们不在 SELECT 中包含 CLOB 列,一切都会正常工作。

如果我们对 CLOB 列执行 SELECT 并遍历结果集以打印其内容,则 OCI 驱动程序似乎无法在节点出现故障时正确恢复查询。

不断出现以下错误代码:

ORA-25408: can not safely replay call

在 OCILobLocatorIsInit / OCILobGetLength / OCILobRead 期间。

出现此错误后,OCIStmtFetch 上的迭代恢复,但出现故障转移异常的记录未恢复。

这是 OCI 驱动程序故障转移实现的预期行为吗? 或者我们是否需要修改/增强从 CLOB 检索缓冲区数据的方式?

这是我们正在使用的 OCI 调用的片段:

checkerr(errhp, 
   OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, 
                  (OCISnapshot*)NULL, (OCISnapshot*)NULL, (ub4)OCI_DEFAULT), 
   __LINE__);

do { 
   checkerr(errhp, 
      OCILobLocatorIsInit((dvoid*)envhp, errhp, lobl, &flag), 
      __LINE__); 

   checkerr(errhp, 
      OCILobGetLength(svchp, errhp, lobl, &loblen), 
      __LINE__); 

   amtp = loblen;

   checkerr(errhp, 
      OCILobRead(svchp, errhp, lobl, &amtp, 1, (dvoid*)buf, 
                (loblen < MAX_SIZE ? loblen : MAX_SIZE), 0, 0, 0, SQLCS_IMPLICIT),
      __LINE__); 

   buf[amtp]='\0';   
   printf("value=%d, text=%s\n", custno, buf); 
} while (
    (status = OCIStmtFetch(stmthp, errhp, (ub4)1, (ub4)OCI_FETCH_NEXT, (ub4)OCI_DEFAULT)) == OCI_SUCCESS || 
    status == OCI_SUCCESS_WITH_INFO);

典型的程序输出类似于:

value = 306, text=ID_#306
value = 307, text=ID_#307
Error - ORA-25408: can not safely replay call
value = 308, text=
value = 309, text=ID_#309

非常感谢,

卢卡。

【问题讨论】:

    标签: sql oracle oracle-call-interface


    【解决方案1】:

    这是预期的行为。 Failover does not work if a LOB column is part of the select list.

    在这种情况下,您可能需要手动重新运行查询 (see documentation)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多