基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
OceanBase 数据库 Oracle 模式创建到 Oracle 的 DBLink
更新时间:2026-05-26 02:16
本文介绍 OceanBase 数据库 Oracle 模式创建到 Oracle 的 DBLink。
适用版本
OceanBase 数据库 V3.x、V4.x。
操作方法
OceanBase 数据库 Oracle 租户连接原生 Oracle 需要配置 OCI 库,该库将提供连接原生 Oracle 数据库的驱动支持。
步骤 1:下载 oracle instantclient
注: 如不方便下载,可以联系 OceanBase 技术支持同学获取现成的 rpm 文件。
OceanBase 数据库 V3.2.x 版本(x86 服务器)
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
点击 Version 11.2.0.4.0 后下载 oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm。
注意
- 建议使用此文档推荐的版本以避免不必要的问题,如必须使用其他版本请与技术同学确认。
- x86 Kylin Server V10 SP1 (Tercel) 等服务器如遇到无
/lib64/libnsl.so.1报错则需要先安装相关依赖。
OceanBase 数据库 V4.2.x 版本(x86 服务器)
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
点击 Version 12.2.0.1.0 后下载 oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm。
注意
- 建议使用此文档推荐的版本以避免不必要的问题,如必须使用其他版本请与技术同学确认。
- x86 Kylin Server V10 SP1 (Tercel) 等服务器如遇到无
/lib64/libnsl.so.1报错则需要先安装相关依赖。
OceanBase 数据库 V3.2.x 版本(arm 服务器) 和 OceanBase 数据库 V4.2.x 版本(arm 服务器)
https://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/aarch64/index.html
下载 oracle-instantclient19.10-basic-19.10.0.0.0-2.aarch64.rpm。
以下步骤以 OceanBase 数据库 V4.2.x 版本(x86 服务器)为例:

步骤 2:安装 oracle instantclient
注: 如不方便下载,可以联系技术 OceanBase 支持同学获取现成的 rpm 文件。
以下是以 x86 服务器安装 oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm 为例, arm 服务器需要安装 oracle-instantclient19.10-basic-19.10.0.0.0-2.aarch64.rpm,操作步骤类似。
安装并查看 oracle instantclient 安装目录。
sudo rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
rpm -ql oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64
例如:
$rpm -ql oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64
/usr/lib/oracle/12.2/client64/bin/adrci
/usr/lib/oracle/12.2/client64/bin/genezi
/usr/lib/oracle/12.2/client64/lib/libclntsh.so.12.1
/usr/lib/oracle/12.2/client64/lib/libclntshcore.so.12.1
/usr/lib/oracle/12.2/client64/lib/libipc1.so
/usr/lib/oracle/12.2/client64/lib/libmql1.so
/usr/lib/oracle/12.2/client64/lib/libnnz12.so
/usr/lib/oracle/12.2/client64/lib/libocci.so.12.1
/usr/lib/oracle/12.2/client64/lib/libociei.so
/usr/lib/oracle/12.2/client64/lib/libocijdbc12.so
/usr/lib/oracle/12.2/client64/lib/libons.so
/usr/lib/oracle/12.2/client64/lib/liboramysql12.so
/usr/lib/oracle/12.2/client64/lib/ojdbc8.jar
/usr/lib/oracle/12.2/client64/lib/xstreams.jar
步骤 3:配置 OCI 库
OCI 库,即 oracle instantclient lib 目录下 lib 文件。
admin 为 OceanBase 默认安装用户。如使用的是非 admin 用户,改成相应用户即可。
su - admin # OB Docker 已默认使用 root,不需要此步骤
创建 /home/admin/oceanbase/lib 目录。
mkdir -p /home/admin/oceanbase/lib && cd /home/admin/oceanbase/lib
将 /usr/lib/oracle/12.2/client64/lib 目录下 lib 文件 copy 到 /home/admin/oceanbase/lib。
cp -a /usr/lib/oracle/12.2/client64/lib/lib* /home/admin/oceanbase/lib/
cp -a /usr/lib/oracle/12.2/client64/lib/lib* /lib64/
执行如下命令。
cd /home/admin/oceanbase/lib
cp -a libclntsh.so.*.1 libclntsh.so
chown admin: lib* # OB Docker 已默认使用 root,不需要此步骤
chmod +x lib*
ldd libclntsh.so
echo 'export LD_LIBRARY_PATH="/home/admin/oceanbase/lib/:"' >> ~/.bash_profile
grep LD_LIBRARY_PATH ~/.bash_profile
source ~/.bash_profile
如下 ldd libclntsh.so 输出结果为正常。
$ ldd libclntsh.so
linux-vdso.so.1 => (0x00007fff58143000)
libnnz11.so => /home/admin/oceanbase/lib/libnnz11.so (0x00007f1b5b644000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f1b5b434000)
libm.so.6 => /lib64/libm.so.6 (0x00007f1b5b132000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1b5af16000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f1b5acfb000)
libc.so.6 => /lib64/libc.so.6 (0x00007f1b5a92e000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007f1b5a72c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1b5e381000)
$echo 'export LD_LIBRARY_PATH="/home/admin/oceanbase/lib/:"' >> ~/.bash_profile
$grep LD_LIBRARY_PATH ~/.bash_profile
export LD_LIBRARY_PATH="/home/admin/oceanbase/lib/:"
注意事项:
如输出结果中有 not found,需要手动相应安装缺失的包。例如:
yum install libnsl或dnf install libnsl。... libnsl.so.1 => not found ...LD_LIBRARY_PATH 输出前后不能多
:也不能少:。$grep LD_LIBRARY_PATH ~/.bash_profile export LD_LIBRARY_PATH="/home/admin/oceanbase/lib/:"以下两个均为不正确的。
# 后面少了 : export LD_LIBRARY_PATH="/home/admin/oceanbase/lib/" # 前面多了 : export LD_LIBRARY_PATH=":/home/admin/oceanbase/lib/:"
步骤 4:其他所有 OBServer 配置 OCI 库
其他所有 OBServer 按步骤 2 和步骤 3 配置 OCI lib。
集群中的每一个 observer 的安装目录下都要按照本文档方法配置 OCI 库,否则 proxy 一旦路由 SQL 到未配置 OCI 库的 observer 上会报错 -5976。
步骤 5:创建 DBLINK
创建 OceanBase Oracle 租户到 Oracle 的 DBLINK。
例如:sqlplus alxxx/abcxxx@orcl 对应 DBLINK 创建 SQL 如下。
obclient [ALVIN]> CREATE DATABASE LINK orcl_dblink CONNECT TO alxxx@oracle IDENTIFIED BY abcxxx OCI HOST '10.xx.xx.xx:1521/orcl';
Query OK, 1 row affected (0.359 sec)
关于创建 DBLink 的更多详细信息,参见 创建 DBLink。
obclient> CREATE DATABASE LINK dblink_name CONNECT TO user@oracle IDENTIFIED BY password OCI HOST 'ip:port/oracle_service_name';
- dblink_name:DBLink 的名称,长度不超过 128 个字符。
- user:远端 Oracle 数据库的用户名。
- oracle:连接 Oracle 数据库时,该值始终为 oracle。
- password:远端 Oracle 数据库用户的登录密码。密码中如果有 @#! 等除数字、字母以外的其他特殊字符时,需要使用双引号将密码括起来避免报语法出错。
- OCI:表示指定访问的远端数据库的类型为 Oracle。如果不指定该参数,则默认访问的远端数据库类型为 OceanBase。
- ip:指定远端 Oracle 数据库实例的 IP 地址。
- port:指定远端 Oracle 数据库实例的端口号。
- oracle_service_name:远端 Oracle 数据库服务的名称。
步骤 6:访问 DBLINK
表 test 为在 Oracle 已有的表。
obclient [ALVIN]> SELECT * FROM test@orcl_dblink;
+------+-----------+
| N1 | D1 |
+------+-----------+
| 10 | 07-MAR-23 |
生产环境 Oracle 到 OceanBase 的数据的同步建议使用 OMS。
测试环境大批量的同步建议使用 OMS,个别表的话可以使用 DBLINK。
常见问题处理方式
查看日志
如出现问题,获取对应的日志文本文件并提供给 OceanBase 技术支持以便进一步排查问题。
查看日志时建议通过 2881 端口直连数据库执行 SQL,以避免查询所有 OBServer 日志。
obclient -h10.x.x.61 -P2881 -uORACLEUSER@oraclet -pxxxxxxxx
通过 obclient 命令行或 ODC 中 obclient 命令行查看 traceid (通过 ODC SQL 窗口不可以,因与数据库交互较多导致查不到对应的 last trace id)。
obclient> SELECT * FROM test@orcl_dblink;
obclient> SELECT last_trace_id() FROM dual; -- e.g. YB42Cxxxxxxx-00060xxxxxxxxxx-0-0
然后根据 trace id 查看 OBServer 日志。如已安装 OCP,建议通过 OCP 查询日志 (系统管理 -> 日志服务)。
ls -lth /home/admin/oceanbase/log/|head
grep 'YB42Cxxxxxxx-00060xxxxxxxxxx-0-0' observer.log
# 如找不到,则是因为日志已经轮转,查询最近的一个 observer 日志
grep 'YB42Cxxxxxxx-00060xxxxxxxxxx-0-0' observer.log.20230828230936614
ORA-02019 - 未配置 OCI 库
obclient [ALVIN]> SELECT * FROM test@orcl_dblink;
ORA-02019: connection description for remote database not found
obclient> SELECT last_trace_id() FROM dual;
YB42Cxxxxxxx-00060xxxxxxxxxx-0-0
# grep 'YB42Cxxxxxxx-00060xxxxxxxxxx-0-0' observer.log
observer.log.20230828230936614:[2023-08-28 23:08:56.033833] WDIAG [SQL.RESV] ob_dml_resolver.cpp:8422 [2281][0][YB42Cxxxxxxx-00060xxxxxxxxxx-0-0] [lt=28] [dc=0][errcode=-5835] dblink not exist(ret=-5835, tenant_id=1001, dblink_name=ORCL_DBLINK)
是因为未配置 OCI 库。按以上步骤 1-7 操作即可。
dblink remote ora error code: -5976
obclient [ALVIN]> SELECT * FROM test@orcl_dblink;
ORA-00600: internal error code, arguments: -5975, dblink remote ora error code: -5976
仔细按步骤 3-5 检查每一步是否按文档操作。
将操作截图发保存,并提供给 OceanBase 技术支持以便进一步排查问题。
将查询的日志文本文件提供给 OceanBase 技术支持以便进一步排查问题。
failed to open lib libclntsh.so
日志报错:
[2023-08-29 18:16:56.261544] WDIAG [LIB.OCI] ob_oci_environment.cpp:990 [944][0][YB42Cxxxxxxx-00060xxxxxxxxxx-0-0] [lt=31] [dc=0][errcode=0] LD_LIBRARY PATH: (ObString(env_str)=/home/admin/oceanbase/lib:/usr/local/lib:/usr/lib:/usr/lib64:/usr/local/lib64:)
[2023-08-29 18:16:56.262743] WDIAG [LIB.OCI] ob_oci_environment.cpp:1110 [944][0][YB42Cxxxxxxx-00060xxxxxxxxxx-0-0] [lt=23] [dc=0][errcode=-5976] failed to open lib from path(ret=-5976, ObString(lib_path)=/home/admin/oceanbase/lib/libclntsh.so, ObString(dlerror())=libnsl.so.1: cannot open shared object file: No such file or directory)
首先,检查 LD_LIBRARY_PATH。
$ grep LD_LIBRARY_PATH ~/.bash_profile
export LD_LIBRARY_PATH="/home/admin/oceanbase/lib/:"
其次,执行以下命令。
ldd libclntsh.so
$ ldd libclntsh.so
linux-vdso.so.1 => (0x00007fff58143000)
libnnz11.so => /home/admin/oceanbase/lib/libnnz11.so (0x00007f1b5b644000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f1b5b434000)
libm.so.6 => /lib64/libm.so.6 (0x00007f1b5b132000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1b5af16000)
libnsl.so.1 => not found
libc.so.6 => /lib64/libc.so.6 (0x00007f1b5a92e000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007f1b5a72c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1b5e381000)
输出结果中有 not found ,按步骤 3 中注意事项 1 中处理。
执行以下命令。
yum install libnsl