原作者:师庆栋
附件(1)
oracle_fdw
…rar
- 实验环境
- OS
- DB
- 背景
- 问题
- 解决方案
- 步骤
- 配制Oracle客户端
- 准备好文件
- 分别解压
- 配制环境变量
- 配制动态链接库
- 增加 oracle_fdw.so
- 使用 oracle_fdw
- 加载扩展
- 创建服务器对象
- 创建用户映射
- 生成外部表
- 运行原Oracle中使用DBLink的语句
- 配制Oracle客户端
- 注意
实验环境
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来自同事 彭冲




