FDW(Foreign Data Wrappers)插件允许在openGauss里访问其他异构数据库的表,openGauss支持Foreign Data Wrappers for oracle (oracle_fdw),Foreign Data Wrappers for MySQL(mysql_fdw)和Foreign Data Wrappers for PostgreSQL(Postgres_fdw),从而支持在openGauss中访问异构其他数据库。
使用postgres_fdw插件不需要重新编译openGauss,具有系统管理员权限用户直接使用create extension创建扩展组件,普通用户即可create server配置异构数据库连接参数,create user mapping创建异构用户映射关系,CREATE FOREIGN TABLE创建指定数据库的外表。
使用oracle_fdw和mysql_fdw插件需要安装相应数据库的客户端包,同时需要重新编译openGauss,在configure时配置enable_mysql_fdw和enable_oracle_fdw。数据库里创建扩展与上面使用postgres_fdw类似。
数据库客户端包安装
mysql(mariadb)头文件
opengauss源码编译开启enable_mysql_fdw需要依赖头文件mariadb_com.h
查找资料得知mariadb_com.h在这个包下
mariadb-connector-c-devel-3.0.10-1.el7.x86_64.rpm
# rpm -ql mariadb-connector-c-devel-3.0.10-1.el7 |grep mariadb_com.h
/usr/include/mysql/mariadb_com.h
Centos7.6下顺藤摸瓜按依赖安装
# rpm -ivh MariaDB-common-5.5.68-1.el7.centos.x86_64.rpm
# rpm -ivh crypto-policies-20170816-1.git2618a6c.el7.noarch.rpm
# rpm -ivh openssl11-libs-1.1.0i-1.el7.x86_64.rpm
# rpm -ivh mariadb-connector-c-3.0.10-1.el7.x86_64.rpm
# rpm -ivh mariadb-connector-c-devel-3.0.10-1.el7.x86_64.rpm
依赖包找不到的可以评论留言我
oracle客户端包
# yum install oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
# yum install oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
安装完上面两个包后,修改下动态库环境变量
# vi /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/lib/oracle/11.2/client64/lib
# ldconfig
opengauss-sever源码编译
configure配置enable_mysql_fdw和enable_oracle_fdw
./configure --prefix=/opt/og \
--gcc-version=8.2.0 \
--3rd=/opt/binarylibs \
--with-readline \
--with-zlib \
--with-libxml \
--enable-mysql-fdw \
--enable-oracle-fdw \
--enable-thread-safety \
CC=g++ CFLAGS="-O2 -g3"
make
make -sj
make -sj install
初始化
/opt/og/bin/gs_initdb --nodename=og_6432 \
--pgdata=/opt/ogdata \
--encoding=UTF-8 \
--locale=en_US.UTF-8 \
--username=omm \
--pwpasswd=Enmotech@2020 \
--security
vi /opt/ogdata/postgresql.conf
port=6432
listen_addresses = '0.0.0.0'
password_encryption_type = 0
启动服务
/opt/og/bin/gs_ctl start -D /opt/ogdata -l og_server.log &
创建用户
create user postgres sysadmin IDENTIFIED BY 'Enmotech@2020';
create user opengauss IDENTIFIED BY 'Enmotech@2020';
postgres用户具有管理权限,而已用来创建extension 及分配普通用户使用fdw的权限
opengauss普通用户可以创建server及使用外部表
FDW测试
mysql_fdw测试
创建扩展(用户必须有sysadmin权限)
$ gsql -p6432 -Upostgres postgres
postgres=> create extension mysql_fdw with schema public;
CREATE EXTENSION
查看扩展版本
postgres=> select mysql_fdw_version();
mysql_fdw_version
-------------------
20503
(1 row)
postgres用户(有sysadmin管理权限)赋予普通用户opengauss使用mysql_fdw权限
postgres=> grant USAGE on FOREIGN data wrapper mysql_fdw to opengauss;
GRANT
普通用户opengauss操作创建server
postgres=> create server server_mysql foreign data wrapper mysql_fdw options(host'172.19.0.100',port '3306');
CREATE SERVER
普通用户opengauss操作创建用户映射
postgres=> create user mapping for opengauss server server_mysql options(username 'root',password '123456');
CREATE USER MAPPING
普通用户opengauss创建外部表
postgres=> create foreign table f_mysql_t1(
id int
)server server_mysql
options (dbname 'mysql',table_name 't1');
CREATE FOREIGN TABLE
通过外部表查询mysql数据库表数据
postgres=> select * from f_mysql_t1;
id
------
1001
(1 row)
从opengauss端写入数据到mysql
postgres=> insert into f_mysql_t1 values(1002);
INSERT 0 1
注意mysql端表必须有主键或唯一索引,否则会报错
postgres=> insert into f_mysql_t1 values(1002);
ERROR: first column of remote table must be unique for INSERT/UPDATE/DELETE operation
再次查看数据
postgres=> select * from f_mysql_t1;
id
------
1001
1002
(2 rows)
oracle_fdw测试
与mysql_fdw类似,注意LD_LIBRARY_PATH配置了oracle的lib路径(/usr/lib/oracle/11.2/client64/lib)
创建扩展(用户必须有sysadmin权限)
$ gsql -p6432 -Upostgres postgres
postgres=# create extension oracle_fdw with schema public;
CREATE EXTENSION
查看扩展版本
postgres=> select oracle_diag();
oracle_diag
--------------------------------------------------------------
oracle_fdw 2.2.0, PostgreSQL 9.2.4, Oracle client 11.2.0.4.0
(1 row)
postgres用户(有sysadmin管理权限)赋予普通用户opengauss使用oracle_fdw权限
postgres=> grant USAGE on FOREIGN data wrapper oracle_fdw to opengauss;
GRANT
普通用户opengauss操作创建server
postgres=> create server server_oracle foreign data wrapper oracle_fdw options(dbserver '172.17.0.2:1521/lee');
CREATE SERVER
普通用户opengauss操作创建用户映射
postgres=> create user mapping for opengauss server server_oracle options(user 'system',password 'admin');
CREATE USER MAPPING
普通用户opengauss创建外部表
postgres=> create foreign table f_oracle_t2(
id int
)server server_oracle
OPTIONS (
schema 'SYSTEM',
"table" 'T2'
);
CREATE FOREIGN TABLE
通过外部表查询oracle数据库t2表数据
postgres=> select * from f_oracle_t2;
id
------
2001
(1 row)
从opengauss端写入数据到oracle数据库t2表
postgres=> insert into f_oracle_t2 values(2002);
INSERT 0 1
再次查看数据
postgres=> select * from f_oracle_t2 ;
id
------
2001
2002
(2 rows)