PostgreSQL+Oracle跨库连接实操

在我们异构数据库数据迁移的过程中,涉及大量的跨库查询操作的需求。常见的跨库连接有A连B,B连B,B连A的现实需求。本文带给大家的是PostgreSQL和oracle之间上述三种跨库连接的实战分享。


[PostgreSQL连接Oracle]


使用Oracle_FDW实现Postgres连接Oracle

Oracle_fdw的编译依赖系统中需要有pg_config和Oracle的环境,需要安装oracle客户端。


1、安装客户端需要如下3个文件包

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

unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip

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


2、配置环境变量

export ORACLE_HOME=/opt/oracle/instantclient

export OCI_LIB_DIR=$ORACLE_HOME

export OCI_INC_DIR=$ORACLE_HOME/sdk/include

export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH


3、下载oracle_fdw插件并安装

unzip oracle_fdw-2.0.0.zip

cd oracle_fdw-2.0.0

Make

Make install


--检查确认没有依赖未解决

ldd oracle_fdw.so


4、创建拓展

postgres=# create extension oracle_fdw ;


postgres=# \des

List of foreign servers

Name |  Owner   | Foreign-data wrapper

-------+----------+----------------------

oradb | postgres | oracle_fdw


5、创建外部数据源服务

postgres=# CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//192.168.217.120:1521/posdb');


6、建用户映射

postgres=# CREATE USER MAPPING FOR postgres SERVER oradb OPTIONS (user 'wen', password 'wen123');


7、创建外部表

postgres=# CREATE  FOREIGN TABLE "vol_audit_nbr_sum_qs" (

id int,

uuid character(32),

name character(32),

Minfo text) SERVER oradb OPTIONS (table 'vol_audit_nbr_sum_qs');


8、测试访问速度


测试结果:

1、使用postgres连接oracle查询2G的表,4520万行数据,全表扫描耗时9分钟23秒。

select * from vol_audit_nbr_sum_qs;


Time: 563775.627 ms (09:23.776)


2、建表时加入prefetch'10240' 参数后耗时5分22秒。

select * from vol_audit_nbr_sum_qs;


Time: 322470.280 ms (05:22.470)


[PostgreSQL连接PostgreSQL]


使用Postgres_FDW实现Postgresql连接Postgresql

Postgres_FDW为postgresql自带拓展可以直接创建。支持远程select和DML,和本地表操作一样。


1、创建拓展

postgres=# create extension postgres_fdw;


2、创建服务

postgres=# create server f_postgres foreign data wrapper postgres_fdw options (host '192.168.86.95',port '5433',dbname 'db_demo');


3、创建用户映射

postgres=# create user mapping if not exists for postgres server f_postgres options (user 'wen',password 'wen123');


4、创建外部表

postgres=# CREATE  FOREIGN TABLE "vol_audit_nbr_sum_qs" (

id int,

uuid character(32),

name character(32),

Minfo text) SERVER f_postgres OPTIONS (table_name 'vol_audit_nbr_sum_qs');


5、测试访问速度


测试结果:

1、使用postgres连接postgres查询2G的表,4520万行数据,全表扫描耗时12分钟59秒。

select * from vol_audit_nbr_sum_qs;


Time: 779932.685 ms (12:59.933)


2、建表时加入fetch_size'10240' 参数后耗时3分58秒。

select * from vol_audit_nbr_sum_qs;


Time: 238503.016 ms (03:58.503)


[Oracle连接PostgreSQL]


1、安装postgresql的odbc驱动包

--需要安装unixODBC 和 postgresql_odbc


yum install -y unixODBC.x86_64

yum install -y postgresql-odbc.x86_64


2、配置/etc/odbc.ini

[postgresql]

Description = PostgresSQLODBC

Driver = PostgreSQL

Database = testdb

Servername = 192.168.12.123

UserName = test

Password = test123

Port = 5432

ReadOnly = 0

ConnSettings = set client_encoding to UTF8


连接成功:

[root@localoracle ~]# isql postgresql

+---------------------------------------+

| Connected!                           |

|                                    |

| sql-statement                         |

| help [tablename]                      |

| quit                                 |

|                                    |

+---------------------------------------+


3、创建.odbc.ini文件

在/home/oracle下创建隐藏文件.odbc.ini

[PG_LINK]

Description        = PostgreSQL connection to SallyDB

Driver             = /usr/lib64/psqlodbc.so

Setup              = /usr/lib64/libodbcpsqlS.so

Database           = testdb

Servername         = 192.168.12.123

UserName           = test

Password           = test123

Port               = 5432

Protocol           = 12.2

ReadOnly           = No

RowVersioning      = No

ShowSystemTables   = No

ConnSettings       = set client_encoding to UTF8


4、配置透明网关

在$ORACLE_HOME/network/admin/下面创建initPG_LINK.ora文件,这个文件名字中的PG_LINK是上面自定义的名字

HS_FDS_CONNECT_INFO = PG_LINK

HS_FDS_TRACE_LEVEL = 255

HS_FDS_SHAREABLE_NAME=/usr/lib64/psqlodbc.so

HS_LANGUAGE=AMERICAN_AMERICA.ZHS16GBK

set ODBCINI=/home/oracle/.odbc.ini


5、配置tnsnames.ora文件

PG_LINK =

(DESCRIPTION=

(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.217.120)(PORT=1521))

(CONNECT_DATA=(SID=PG_LINK))

(HS=OK)

)


6、配置监听文件

SID_LIST_LISTENER=

(SID_LIST=

(SID_DESC=

(SID_NAME=PG_LINK)

(ORACLE_HOME=/u01/app/oracle/product/12.2/db_1)       (ENV="LD_LIBRARY_PATH=/usr/lib64/:/u01/app/oracle/product/12.2/db_1/bin/")        (PROGRAM=dg4odbc)

)

)


7、创建DBLINK

create database link to_pglink connect to "test" identified by "test123" using 'PG_LINK';


8、访问PG数据库

访问postgre的数据库表是需要表名字小写并加上双引号

select count(*) from "vol_audit_nbr_sum_qs"@to_pglink;


9、测试访问速度

测试结果:

使用oracle连接postgres查询2G的表,4520万行数据,全表扫描耗时10分钟37秒。

SQL> set timing on    

SQL> set autot trace

SQL> select "billing_cycle_id" from "vol_audit_nbr_sum_qs"@to_pglink;


45201535 rows selected.


Elapsed: 00:10:37.14


上一篇:.NET平台下的流程图及图表控件FlowChart


下一篇:PageRank算法及优化 综述报告