基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
Oracle 兼容应用错误处理规范
更新时间:2026-04-15 17:16:58
本节主要介绍 Oracle 兼容应用的错误处理规范。
OceanBase 数据库从 V2.0 版本开始全面兼容 Oracle 数据库,提供 Oracle 兼容租户模式。在错误码方面,尽量保证错误码、SQLSTATE、错误消息三个信息均与 Oracle 数据库保持一致。因此,作为我们的产品设计原则,应用错误处理规范可参考 Oracle 数据库的处理规范。但是,作为一个分布式数据库,OceanBase 数据库与集中式 Oracle 数据库有着本质的不同,一些分布式环境下特有的错误无法用 Oracle 数据库的错误码来表达,故将这类内部错误码映射为错误码 ORA-00600,表明它是 OceanBase 数据库特有的错误码。
在 OceanBase 数据库的 Oracle 租户模式中,错误消息格式与 Oracle 数据库兼容,会以 "前缀 + 数字编码" 的形式返回。如果错误源于 SQL,则会返回以 ORA 开头的错误消息;如果错误源于存储过程,则会返回以 PLS 开头的错误消息。OceanBase 数据库服务器端在 Oracle 租户模式下完整的错误码清单,请参见 错误信息概述。
对于 ORA-00600 错误码,应用程序需要从错误消息中提取具体的内部错误码。例如,在下面这个错误消息中,内部错误码为 6210。
ORA-00600: internal error code, arguments: -6210, Transaction timeout occurred, please rollback the transaction, set the variable ob_trx_timeout to a larger value and then restart the transaction
获取错误码信息
不同语言的驱动程序提供了不同的 API 以获取错误信息,关于各驱动的详细介绍请参见 连接方式概述 中的 驱动 章节。
Java 驱动库
使用 JDBC 的 Java 应用程序执行 SQL 语句失败时,可以捕获 SQLException 异常,且该异常包含了错误码、SQLSTATE、错误信息三种信息,关于 SQLException 异常的详细信息请参见 JDBC API 文档。
捕获 SQLException 异常的方法如下:
- 调用 getErrorCode() 获取错误码
- 调用 getSQLState() 获取 SQLSTATE
- 调用 getMessage() 获取错误消息
OBCI 驱动库
OBCI 提供了与 Oracle OCI 兼容的 C 语言驱动库。当函数调用返回 OCI_ERROR 时,应用程序通过函数 OCIErrorGet() 的输出参数获取错误信息:
- 通过输出参数 errcodep 获取错误码
- 通过输出参数 sqlstate 获取 SQLSTATE
- 通过输出参数 bufp 获取错误消息
错误处理规范
对于 OceanBase 数据库 Oracle 租户模式下的大多数错误码,应用程序不需要做专门处理,可以直接对外报错。 为了容错和增强应用程序的健壮性,对于某些错误码,根据不同的场景和错误性质,可以采用如下四种不同的策略:
策略一:根据语句类型处理。
如果是执行
SELECT语句时报超时错误,因为没有副作用,可以重试。如果是远程或分布式执行
UPDATE等修改语句时报超时错误,则语句究竟是否执行成功是不确定的,需要回滚事务(如果修改语句的语义是幂等的,可以尝试重试该语句)。如果是执行
COMMIT或ROLLBACK语句时报超时错误,由于事务状态是未知的,需要直接对外报错。
策略二:任何语句执行报错,回滚当前事务,然后重试事务。
策略三:任何语句执行报错,重试当前语句。
策略四:任何语句执行报错,关闭当前连接,然后重建连接。
特别地,由于开发习惯,很多使用 OCI 接口开发的服务类应用会使用长连接,若数据库服务端发生了运行时异常而不做处理,可能会造成服务无法自动恢复。对于这类应用,需要按照下面 OceanBase 数据库特有的错误码 和 Oracle 兼容错误码 中的建议进行错误处理。
OceanBase 数据库特有的错误码
以下错误码是常见的 OceanBase 数据库服务端特有的运行时异常的错误码,根据下表中不同的“内部错误码”,应用程序可以按照“处理策略”的建议进行处理。
| 错误码 | 内部错误码 | 含义 | 语句执行结果 | 事务状态 | 处理策略 |
|---|---|---|---|---|---|
| ORA-00600 | 4012 | 执行超时 | 未知 | 未知 | 策略一 |
| ORA-00600 | 4038 | 当前副本非主副本,不能提供服务。一般在副本发生切主时可能出现。 | 失败 | 不变 | 策略三 |
| ORA-00600 | 4225 | 分区不存在。一般在副本发生迁移时可能出现。 | 失败 | 不变 | 策略三 |
| ORA-00600 | 6210 | 事务执行超过限制时长 | 失败 | 不变 | 策略二 |
| ORA-00600 | 6231 | 副本数据不可读。一般在副本发生迁移时可能出现。 | 失败 | 不变 | 策略三 |
| ORA-00600 | 8001~8004 | 连接不可恢复 | 失败 | 未知 | 策略四 |
注意
对于这些 ORA-00600 错误码,应用程序需要从错误消息中提取具体的内部错误码。通过下面的格式化字符串,提取占位符 `%d` 位置的整数,即为内部错误码。
ORA-00600: internal error code, arguments: %d
Oracle 兼容错误码
对于一般 Oracle 数据库兼容的错误码,请遵循与 Oracle 数据库相同的处理方式。特别的,以下一些错误码是 OceanBase 数据库 Oracle 租户模式下常见的异常,应用程序可以按照下表中“处理策略”的建议进行处理。
| 错误码 | 含义 | 语句执行结果 | 事务状态 | 处理策略 |
|---|---|---|---|---|
| ORA-01555 | 读取到的快照版本太旧 | 失败 | 不变 | 策略三 |
| ORA-24761 | 事务被系统内部回滚 | 失败 | 被回滚 | 策略二 |
| ORA-08177 | 当前事务无法串行化。一般在 RR(Repeatable Read) 和 Serializable 隔离级别有事务并发冲突时可能出现。 关于事务隔离级别的详细介绍,请参见 事务隔离级别概述。 |
失败 | 不变 | 策略二 |
对于使用了 OBCI 的应用程序,驱动端内会返回一些 Oracle 数据库兼容的错误码,也遵循 Oracle 数据库相同的处理方式。特别的,应用程序需要关注以下错误码。
| 错误码 | 含义 | 处理策略 |
|---|---|---|
| ORA-03113 | 与服务端连接断开 | 重建连接 |
| ORA-01403 | 期望的行数大于返回结果的行数 | 报错或检查应用程序逻辑是否正确 |
| ORA-01405 | 列值为空 | 处理 NULL 值问题 |
| ORA-01406 | 返回的结果超过缓冲区长度 | 加大接收数据的缓冲区长度 |