暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DBLink迁移之Oracle至MogDB

原创 由迪 2023-11-06
272

原作者:师庆栋

附件(1)

oracle_fdw

…rar

  • 实验环境
    • OS
    • DB
  • 背景
  • 问题
  • 解决方案
  • 步骤
    • 配制Oracle客户端
      • 准备好文件
      • 分别解压
      • 配制环境变量
      • 配制动态链接库
    • 增加 oracle_fdw.so
    • 使用 oracle_fdw
      • 加载扩展
      • 创建服务器对象
      • 创建用户映射
      • 生成外部表
      • 运行原Oracle中使用DBLink的语句
  • 注意

实验环境

OS

[root@mogdb-01 ~]# lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID:	CentOS
Description:	CentOS Linux release 7.6.1810 (Core) 
Release:	7.6.1810
Codename:	Core

DB

stone=> select version();
                                                                     version                                                                      
--------------------------------------------------------------------------------------------------------------------------------------------------
 (MogDB 3.0.0 build 25635e6b) compiled at 2022-07-08 22:28:37 commit 0 last mr   on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
(1 row)

背景

1、Oracle迁移至MogDB
2、Oracle代码中使用了DBLink
3、远端为Oracle 本地相关Oracle库均已迁至MogDB

问题

目前MogDB不支持同Oracle中一样的DBLink功能
如:

select * from dept@scott130

解决方案

使用外部表来代替

步骤

MogDB中默认安装包中没有Oracle_fdw,需要自己增加

配制Oracle客户端

在root用户下配制

准备好文件

客户端下载地址
https://www.oracle.com/cn/database/technologies/instant-client/linux-x86-64-downloads.html
[root@mogdb-01 u01]# ll instantclient-*-linux.x64-12.2.0.1* -rw-r--r-- 1 root root 68965195 Aug 18 22:37 instantclient-basic-linux.x64-12.2.0.1.0.zip -rw-r--r-- 1 root root 904309 Aug 18 22:33 instantclient-sqlplus-linux.x64-12.2.0.1.0.zip [root@mogdb-01 u01]# pwd /u01
第二个文件里有sqlplus命令,可以用来测试环境配制是否成功

分别解压

unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
unzip instantclient-sqlplus-linux.x64-12.2.0.1.0.zip

配制环境变量

export ORACLE_HOME="/u01/instantclient_12_2"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${ORACLE_HOME}
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"

PATH=$PATH:$HOME/bin:${ORACLE_HOME}

export PATH

配制动态链接库

在 etc/ld.so.conf里添加 /u01/instantclient_12_2/

[root@mogdb-01 ~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib
/u01/instantclient_12_2/

执行 ldconfig

[root@mogdb-01 ~]# ldconfig 

增加 oracle_fdw.so

把编译好的文件分别放入以下目录

[omm@mogdb-01 postgresql]$ ll /opt/mogdb/app/lib/postgresql/oracle_fdw.so 
-rwx------ 1 omm dbgrp 2282152 Apr  9 16:18 /opt/mogdb/app/lib/postgresql/oracle_fdw.so
[omm@mogdb-01 postgresql]$ ll ll /opt/mogdb/app/share/postgresql/extension/oracle_fdw*.*
ls: cannot access ll: No such file or directory
-rwx------ 1 omm dbgrp  231 Apr  9 16:19 /opt/mogdb/app/share/postgresql/extension/oracle_fdw--1.0--1.1.sql
-rwx------ 1 omm dbgrp 1003 Apr  9 16:18 /opt/mogdb/app/share/postgresql/extension/oracle_fdw--1.1.sql
-rwx------ 1 omm dbgrp  133 Apr  9 16:23 /opt/mogdb/app/share/postgresql/extension/oracle_fdw.control

使用 oracle_fdw

加载扩展

stone=> create extension oracle_fdw;
CREATE EXTENSION

创建服务器对象

stone=> create server orcl_fdw foreign data wrapper oracle_fdw options(dbserver '//192.168.56.130:1521/orcl');
CREATE SERVER

创建用户映射

stone=> create user mapping for scott server orcl_fdw options(user 'scott',password 'tiger');
CREATE USER MAPPING

报错处理

Please create usermapping.key.cipher file with gs_guc and gs_ssh, such as :gs_ssh -c “gs_guc generate -S XXX -D $GAUSSHOME/bin -o usermapping”

[omm@mogdb-01 bin]$ gs_guc generate -S Stone@123 -D $GAUSSHOME/bin -o usermapping
The gs_guc run with the following arguments: [gs_guc -S ******** -D /opt/mogdb/app/bin -o usermapping generate ].
gs_guc generate -S *** 

生成外部表

需要注意,表名大写

create foreign table "dept@scott130"
(
deptno number(2),
dname varchar2(14),
loc varchar2(13) 
)
server orcl_fdw
options (schema 'SCOTT',table 'DEPT');

运行原Oracle中使用DBLink的语句

insert into emp_bak(empno,ename,job,mgr,hiredate,sal,comm,deptno,dname)
(
with a as
(
select empno,ename,job,mgr,hiredate,sal,comm,e.deptno,d.dname
  from scott.emp e
 inner join dept@scott130 d on d.deptno = e.deptno
)
select * from a
);

注意

oracle_fdw针对不同的OS MogDB不同版本 Oracle客户端不同版本 需要分别编译。
此处Oracle_fdw来自同事 彭冲

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论