OceanBase 直连 Oracle DBLink踩坑实录
01 引言
在企业数字化转型的浪潮中,数据集成成为了关键挑战。作为分布式数据库的领军者,OceanBase 不仅具备强大的分布式能力,还能通过 DBLink 技术与传统 Oracle 数据库实现无缝对接。
最近因为业务需要,要在 OceanBase 中通过 DBLink 直接查询远端 Oracle 数据库的数据。本以为是一条CREATE DATABASE LINK就能搞定的事,结果却踩了不少的坑。本文将完整复盘这次排错过程,并提炼出关键知识点,希望能帮助你避开同样的坑。
02 准备工作
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-instantclient19.27*
Preparing... ################################# [100%] Updating / installing...
1:oracle-instantclient19.27-basic-19################################# [ 50%]
2:oracle-instantclient19.27-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 库。
03 结语
通过本文的介绍,相信您已经掌握了 OceanBase Oracle 租户创建 DBLink 连接 Oracle 数据库的完整流程。这一功能为企业级应用提供了更加灵活的数据集成方案,使 OceanBase 能够与传统 Oracle 数据库无缝协作。在实际应用中,建议根据具体场景合理使用 DBLink,注意性能优化和安全配置,以确保系统的稳定运行。
更多推荐



所有评论(0)