OceanBase 直连 Oracle DBLink

一、引言

在企业数字化转型的浪潮中,数据集成成为了关键挑战。作为分布式数据库的领军者, OceanBase 不仅具备强大的分布式能力,还能通过 DBLink 技术与传统 Oracle 数据库实现无缝对接。

最近因为业务需要,要在 OceanBase 中通过 DBLink 直接查询远端 Oracle 数据库的数据。本以为是一条 CREATE DATABASE LINK 就能搞定的事,结果却踩了 不少 的坑。本文将完整复盘这次排错过程,并提炼出关键知识点,希望能帮助你避开同样的坑

二、准备工作

1. 权限检查

创建 DBLink 的用户需要具备相应权限:

-- 授予普通用户创建 DBLink 的权限
grant   create   database   link to   username;

2. 环境配置

OceanBase 本身是自研数据库,要访问 Oracle,必须借助 Oracle 官方提供的 OCI(Oracle Call Interface) 驱动。OCI 是一套 C 语言 API,负责与 Oracle 服务端通信。OceanBase 的 DBLink 底层会动态加载 libclntsh.so 来建立连接 于是从 ORACLE官网下载客户端,本着装新不装旧的原则选了19.27的客户端,没想到就踩了第一个坑。

坑一: V4.2.1及之后版本x86环境选用ORACLE 12.2客户端,arm环境选用ORACLE19.10客户端

--在所有Observer上安装ORACLE客户端

[root@localhost ~]# rpm -ivh oracle-instantclient1 9 .2 7 *

Preparing...                          ################################# [100%]

Updating / installing...

   1:oracle-instantclient1 9 .2 7 -basic-1 9 ################################# [ 50%]

   2:oracle-instantclient1 9 .2 7 -sqlplus-################################# [100%]

--将lib文件全部拷贝至

[root@localhost lib]# cd /usr/lib/oracle/19.27/client64/lib

[root@localhost lib]# mkdir -p /home/admin/oceanbase/lib/

[root@localhost lib]# scp -r * /home/admin/oceanbase/lib/

[root@localhost lib]# cd /home/admin/oceanbase/

[root@localhost oceanbase]# chown -R admin:admin lib

--在admin用户下配置环境变量

export LD_LIBRARY_PATH=/home/admin/oceanbase/lib:$LD_LIBRARY_PATH

oracle上创建测试表

SQL> insert into test_link values (1,'zhangsan');

1 row created.

SQL> insert into test_link values (2,'lisi');

1 row created.

SQL> commit;

Commit complete.

oceanbase上创建dblink

obclient [LINK_TEST]> CREATE DATABASE LINK dblink_name CONNECT TO user@oracle IDENTIFIED BY remote_password OCI HOST 'ip:port/oracle_service_name';

Query OK, 1 row affected (0.905 sec)

使用说明:

dblink_name:DBLink 的名称,长度不超过 128 个字符。

user:远端 Oracle 数据库的用户名。

oracle:连接 Oracle 数据库时,该值始终为 oracle。

remote_password:远端 Oracle 数据库用户的登录密码。密码中如果有 @#! 等除数字、字母以外的其他特殊字符时,需要使用双引号将密码括起来避免报语法出错。

OCI:表示指定访问的远端数据库的类型为 Oracle。如果不指定该参数,则默认访问的远端数据库类型为 OceanBase。

ip:指定远端 Oracle 数据库实例的 IP 地址。

port:指定远端 Oracle 数据库实例的端口号。

oracle_service_name:远端 Oracle 数据库服务的名称。

连接测试

obclient [LINK_TEST]>  select * from test_link@to_oracle;

ORA-00600: internal error code, arguments: -5976, can not find the expected version of OCI LIB: the version of the loaded OCI LIB is not 12.2

坑二: 12.2版本的libclntsh.so需要做软链接

于是乎,又去下载了 12.2的客户端,替换了原来19的lib文件

obclient [LINK_TEST]>  select * from test_link@to_oracle;

ORA-00600: internal error code, arguments: -5976, can not find the expected version of OCI LIB: cant not find path of libclntsh.so

报错找不到 libclntsh.so,原来12.2的客户端lib没有这个文件,需要创建一个软链接指向libclntsh.so.12.1

[admin@localhost lib]$ ln -sf libclntsh.so.12.1 libclntsh.so

坑三:环境配置完成后需要重启 OBServer

再次测试,提示找不到 libmql1.so ,但是文件确实存在的,查了相关资料,要求重启 OBserver来加载lib库(不重启方式放在最后)

obclient [LINK_TEST]>  select * from test_link@to_oracle;

ORA-00600: internal error code, arguments: -5976, can not find the expected version of OCI LIB: libmql1.so: cannot open shared object file: No such file or directory

重启完成后再次测试,报错提示 oracle无监听。感觉希望就在前方了。

obclient [LINK_TEST]>  select * from test_link@to_oracle;

ORA-00600: internal error code, arguments: -5975,

dblink remote error code: 12541,

remote error msg: ORA-12541: TNS:no listener

经过对 ORACLE十分周密的检查,一切正常。于是对OB的dblink进行重建,终于!

obclient [LINK_TEST]>  select * from test_link@to_oracle;

+------+----------+

| ID   | NAME     |

+------+----------+

|    1 | zhangsan |

|    2 | lisi     |

+------+----------+

2 rows in set (0.319 sec)

不重启 OBServer方式:

将上述   $DIR/lib/  目录中 10 个 OCI 库的 so 文件全部通过 mv 命令移动到 /lib64 目录下,仅在 $DIR/lib/ 目录下保留 libclntsh.so 文件,即可做到不重启 OBServer 节点,该 OBServer 节点也能加载 OCI 库。

 

三、结语

通过本文的介绍,相信您已经掌握了 OceanBase Oracle 租户创建 DBLink 连接 Oracle 数据库的完整流程。这一功能为企业级应用提供了更加灵活的数据集成方案,使 OceanBase 能够与传统 Oracle 数据库无缝协作。在实际应用中,建议根据具体场景合理使用 DBLink,注意性能优化和安全配置,以确保系统的稳定运行。


请使用浏览器的分享功能分享到微信等