pg社区从来就不缺乏,先进的技术体验,只有想不到,没有做不到。
pg 数据库如何从oracle 数据库同步数据,本次转pg涉及到部分关联系统还在oracle 上运行,
之前的同义词,db-link ,视图, 都已经不合适了,如何让pg能够连到oracle 数据库上,如何同步这些数据是需要考虑的。
pg 社区 发布了 oracle_fdw 。
目前已经发布到0.95版本,还是一个beta 版本。 支持oracle 10g 11g 数据库。
安装上还有有些不方便。 最主要的,我们追求更高的性能,迁到linux as 6 系统,多少带来一些阻碍,
最终我们还是测试安装成功。 记录如下:
下载 oracle_fdw 源代码。
http://pgfoundry.org/frs/?group_id=1000600
oracle_fdw 是以pg 的组件方式发布的,安装方式用到了pg 的组件的安装结构。
oracle_fdw 需要用到oracle 的客户端组件。
我们需要先安装oracle 的客户端
从oracle 网站上下载oracle 10.2.0.4 的客户端,解压安装,发现已经无法安装了。
oracle 10g 的只能装在as 3 ,as 4 上,as5 上需要修改redhat-releace 文件,as6上修改了这个文件也没有用了。
于是安装oracle 11gR2的客户端,结果安装过程中报错了,关于OCI的部分无法安装,oracle 的检测报告了一大堆的错误,
不过我们忽略了这些错误,然后安装了,由于oci 的包缺乏,所以oracle_fdw 无法编译。
需要从racle 的网站上下载已经编译好的oci表,和sdk 放到相应的目录:
下载 instantclient-basic-linux-x86-64-11.2.0.2.0.zip 解压后放到$ORACLE_HOME/oci/include 目录下面。
下载 instantclient-sdk-linux-x86-64-11.2.0.2.0.zip 解压后放到 $ORACLE_HOME/sdk 目录下面
如果没有oci/include 和 sdk 目录,就自己建一个啦。
设置环境变量:
vi .bash_profile :[code]
export PGDATA=/usr/local/pgsql/data
export ORACLE_HOME=/data/oracle/product/11.2.0
PATH=$PATH:$HOME/bin:/usr/local/pgsql/bin:$ORACLE_HOME/bin
export PATH
export PGPORT=5432
export LANG=en_US.utf8
export PGHOME=/usr/local/pgsql
export
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export DATE=`date +"%Y%m%d%H%M"`
[/code]主要是设置ORACLE_HOME 和LD_LIBRARY_PATH ,PATH 变量
包括oracle 的路径。
这些都搞定了,就可以编译 oracle_fdw 了。
cd /data/pg_pacakage/postgresql-9.1.3/contrib/oracle_fdw-0.9.5
su - root
souce /home/postgres/.bash_profile
这个是让root 取到pg的环境变量, 在编译的时候需要用$PGHOME/bin/pg_config 来读取pg的安装时的配置信息。
make install[code]
[root@postgres-11-17 ~]# cd /data/pg_package/postgresql-9.1.3/contrib/oracle_fdw-0.9.5/
[root@postgres-11-17 oracle_fdw-0.9.5]# . /home/postgres/.bash_profile
[root@postgres-11-17 oracle_fdw-0.9.5]# make install
/bin/mkdir -p '/data/postgresql-9.1.3/lib'
/bin/mkdir -p '/data/postgresql-9.1.3/share/extension'
/bin/mkdir -p '/data/postgresql-9.1.3/share/doc/extension'
/bin/sh
/data/postgresql-9.1.3/lib/pgxs/src/makefiles/../../config/install-sh
-c -m 755 oracle_fdw.so '/data/postgresql-9.1.3/lib/oracle_fdw.so'
/bin/sh
/data/postgresql-9.1.3/lib/pgxs/src/makefiles/../../config/install-sh
-c -m 644 ./oracle_fdw.control '/data/postgresql-9.1.3/share/extension/'
/bin/sh
/data/postgresql-9.1.3/lib/pgxs/src/makefiles/../../config/install-sh
-c -m 644
./oracle_fdw--1.0.sql '/data/postgresql-9.1.3/share/extension/'
/bin/sh
/data/postgresql-9.1.3/lib/pgxs/src/makefiles/../../config/install-sh
-c -m 644 ./README.oracle_fdw
'/data/postgresql-9.1.3/share/doc/extension/'
[root@postgres-11-17 oracle_fdw-0.9.5]#
[/code]到这里就安装完成了。
说点小插曲,我在编译的过程中,一台机器,我安装了oracle 客户端,然后我就把安装包copy到另一台机器上,结果就编译不了
报错:[code]
[postgres@postgres-11-17 oracle_fdw-0.9.5]$ make install
gcc
-O2 -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wformat-security
-fno-strict-aliasing -fwrapv -fpic
-I/data/oracle/product/11.2.0/sdk/include
-I/data/oracle/product/11.2.0/oci/include
-I/data/oracle/product/11.2.0/rdbms/public -I. -I.
-I/data/postgresql-9.1.3/include/server
-I/data/postgresql-9.1.3/include/internal -D_GNU_SOURCE
-I/usr/include/libxml2 -c -o oracle_fdw.o oracle_fdw.c
gcc -O2
-Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement
-Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -fpic
-I/data/oracle/product/11.2.0/sdk/include
-I/data/oracle/product/11.2.0/oci/include
-I/data/oracle/product/11.2.0/rdbms/public -I. -I.
-I/data/postgresql-9.1.3/include/server
-I/data/postgresql-9.1.3/include/internal -D_GNU_SOURCE
-I/usr/include/libxml2 -c -o oracle_utils.o oracle_utils.c
gcc -O2
-Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement
-Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -fpic
-shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o
-L/data/postgresql-9.1.3/lib -Wl,--as-needed
-Wl,-rpath,'/data/postgresql-9.1.3/lib',--enable-new-dtags -L/data/oracle/product/11.2.0
-L/data/oracle/product/11.2.0/bin -L/data/oracle/product/11.2.0/lib
-lclntsh
/usr/bin/ld: cannot find -lclntsh
collect2: ld returned 1 exit status
make: *** [oracle_fdw.so] Error 1
[/code]直接从安装好的那台上把编译好的包放到pg的目录下面[code]
[postgres@postgres-11-17 ~]$ psql
psql (9.1.3)
Type "help" for help.
postgres=# create EXTENSION oracle_fdw ;
ERROR: could
not load library "/data/postgresql-9.1.3/lib/oracle_fdw.so":
libnnz11.so: cannot open shared object file: No such file or directory
postgres=# \q
[/code]所以别省事,还是老老实实的安装oracle 的客户端。
安装完成后,就可以到pg 里看看:
psql[code]
[postgres@postgres-11-17 ~]$ psql
psql (9.1.3)
Type "help" for help.
postgres=# create EXTENSION oracle_fdw ;
ERROR: could not load library "/share/postgresql/lib/oracle_fdw.so": cannot open shared object file: No such file or directory
postgres=# \q
[/code]奇怪的是我们的pg是安装在/usr/local/下面的,怎么会到/share/postgresql/下面去找so文件呢?
去到/share/postgresql下面一看,果然有这个目录,还是pg的一个完整的lib 目录呢。
rpm -qa | grep postgresql 果然是linux 自带的pg 在里面。[code]
[root@postgres-11-17 ~]# rpm -qa |grep post
postgresql-libs-8.4.9-1.el6_1.1.x86_64
postfix-2.6.6-2.2.el6_1.x86_64
[root@postgres-11-17 ~]# yum remove postgresql-libs-8.4.9-1.el6_1.1.x86_64
Loaded plugins: product-id, security, subscription-manager
Updating certificate-based repositories.
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package postgresql-libs.x86_64 0:8.4.9-1.el6_1.1 will be erased
--> Finished Dependency Resolution
http://192.168.10.150/rehas6u2X64/img/Packages/repodata/repomd.xml:
[Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404"
Trying other mirror.
Dependencies Resolved
====================================================================================================================================
Package Arch Version
Repository Size
====================================================================================================================================
Removing:
postgresql-libs x86_64 8.4.9-1.el6_1.1
@anaconda-RedHatEnterpriseLinux-201111171049.x86_64/6.2 607 k
Transaction Summary
====================================================================================================================================
Remove 1 Package(s)
Installed size: 607 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Erasing
: postgresql-libs-8.4.9-1.el6_1.1.x86_64
1/1
Installed products updated.
Removed:
postgresql-libs.x86_64
0:8.4.9-1.el6_1.1
Complete!
[root@postgres-11-17 ~]#
[/code]删掉这个然后清空/share/postgresql 目录,然后就ok啦。[code]
[postgres@postgres-11-17 ~]$ psql
psql (9.1.3)
Type "help" for help.
postgres=# create EXTENSION oracle_fdw ;
CREATE EXTENSION
postgres=#
[/code]下面就来演示一下吧:[code]
[postgres@postgres-11-17 ~]$ psql -d cyp_app
psql (9.1.3)
Type "help" for help.
cyp_app=# create EXTENSION oracle_fdw ;
CREATE EXTENSION
cyp_app=# grant all on foreign data wrapper oracle_fdw to cyp_app;
GRANT
cyp_app=# \c cyp_app cyp_app
You are now connected to database "cyp_app" as user "cyp_app".
cyp_app=>
cyp_app=> CREATE SERVER ora_cyp FOREIGN DATA WRAPPER oracle_fdw
OPTIONS (dbserver '//192.168.x.x:1521/tesxx');
CREATE SERVER
cyp_app=> CREATE USER MAPPING FOR cyp_app SERVER ora_cyp
OPTIONS (user 'cyxxxxxp', password 'xxxxx');
CREATE USER MAPPING
cyp_app=> CREATE FOREIGN TABLE "ora_pp_ad" (
"id" bigint NOT NULL,
"area_id" bigint NOT NULL,
"brand_id" bigint NOT NULL,
"type" bigint,
"display" varchar(200),
"link" varchar(200),
"pos" bigint,
"color" varchar(200),
"product_id" bigint,
"company_id" bigint,
"company_name" varchar(100),
"company_phone" varchar(100),
"company_logo" varchar(1000),
"company_link" varchar(1000),
"company_pos" bigint,
"company_color" varchar(20),
"company_message" varchar(500),
"create_date" timestamp,
"contract_id" varchar(100),
"amount" double precision,
"cancel_date" timestamp,
"logo_cancel_date" timestamp,
"relation_start_date" timestamp,
"cyp_id" bigint,
"company_logo_link" varchar(1000),
"company_address" varchar(2000)
) SERVER ora_cyp OPTIONS (table 'pp_ad');
CREATE FOREIGN TABLE
cyp_app=> select count(*) from ora_pp_ad where relation_start_date > now() - interval '30days';
count
-------
309
(1 row)
cyp_app=> select oracle_close_connections();
oracle_close_connections
--------------------------
(1 row)
[/code]