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,注意性能优化和安全配置,以确保系统的稳定运行。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐