对于DBA来说,pg和oracle之间,必备技能之一就是学会用插件oracle_fdw,此文章可供入门参考。
环境介绍:
pg端:redhat7.4+pg12.4+oracle_fdw2.4通过repmgr管理的主备两节点
oracle端:oracle11.2.0.4,oradb,orauser/abcd1234
项目需求:目前主库pg和oracle之间通过每天同步一次的方法更新,数据不实时,且每需一个数据就要开发一次程序。很麻烦,效率低。
解决方案:PG库直接通过dblink访问oracle数据库,根据需要查询实时信息
安装步骤:(以下只需要在pg端做)
1.下载oracle12.2.0.1客户端(建议11g以上版本)
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
instantclient-basic-linux.x64-12.2.0.1.0.zip --必须
instantclient-sdk-linux.x64-12.2.0.1.0.zip --必须
instantclient-sqlplus-linux.x64-12.2.0.1.0.zip --可选,方便直接连oracle查看库表信息,连接命令参考:sqlplus orauser/password@//192.168.208.40:1521/oradb
2.下载oracle_fdw最新源码,以及官方的安装参考
https://github.com/laurenz/oracle_fdw
3.介质上传到pg端,比如/opt/oracle下,解压改名,添加环境变量/etc/profile,编译oracle_fdw
vi /etc/profile
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
export PATH=$GCC_HOME/bin:$CMAKE_HOME/bin:$PROTOBUF_HOME/bin:$PROTOBUFC_HOME/bin:$ORACLE_HOME:$PATH
4.登录pg库,创建扩展插件oracle_fdw–此操作只需在主库操作即可,备库自动同步。
create extension oracle_fdw;
5.创建连接oracle的外部表相关–此操作只需在主库操作即可,备库自动同步。
CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//192.168.207.39:1521/oradb');
GRANT USAGE ON FOREIGN SERVER oradb TO pguser;
CREATE USER MAPPING FOR pguser SERVER oradb OPTIONS (user 'orauser', password 'abcd1234');
两种创建方式:第2种更方便,无需列出字段及类型。
1) CREATE FOREIGN TABLE TEST1(
LOGDATE DATE ,
FLDID VARCHAR,
xxx... ) SERVER oradb OPTIONS (SCHEMA 'ORAUSER', TABLE 'TEST1');--注意大写字母SCHEMA 'ORAUSER', TABLE 'TEST1'
2)IMPORT FOREIGN SCHEMA "ORAUSER" LIMIT TO (TEST1,TEST2) FROM SERVER oradb INTO public;--SCHEMA需要注意大写和双引号,否则失败,除了可导入表还可以是视图,很方便。如需要,可考虑增加option参数:
OPTIONS (case 'lower', readonly 'true',max_long '32767',sample_percent '100', prefetch '0');
如下:
testdb=# IMPORT FOREIGN SCHEMA ORAUSER LIMIT TO (TEST1) FROM SERVER oradb INTO public;
ERROR: remote schema "orauser" does not exist
HINT: Enclose the schema name in double quotes to prevent case folding.
testdb=# IMPORT FOREIGN SCHEMA "orauser" LIMIT TO (TEST1) FROM SERVER oradb INTO public;
ERROR: remote schema "orauser" does not exist
HINT: Enclose the schema name in double quotes to prevent case folding.
testdb=# IMPORT FOREIGN SCHEMA orauser LIMIT TO (TEST1) FROM SERVER oradb INTO public;
ERROR: remote schema "orauser" does not exist
HINT: Enclose the schema name in double quotes to prevent case folding.
检查配置
\det+
\des+
\deu+
\dew+
关于IMPORT FOREIGN SCHEMA问题,在问答中有参考:https://www.modb.pro/issue/13960
以下为实操记录(已替换敏感信息,遇到的问题及处理都按如下操作记录展示)
[user@pgdb ~]$ sudo -i -u root
[sudo] password for user:
Last login: Mon Mar 7 15:59:49 CST 2022 on pts/3
[root@pgdb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-root 20G 9.9G 11G 50% /
devtmpfs 48G 0 48G 0% /dev
tmpfs 48G 616K 48G 1% /dev/shm
tmpfs 48G 4.1G 44G 9% /run
tmpfs 48G 0 48G 0% /sys/fs/cgroup
/dev/sda1 1011M 179M 833M 18% /boot
/dev/mapper/sftp-lv_sftp 1.1T 784G 316G 72% /sftp
/dev/mapper/VolGroup-home 10G 2.6G 7.5G 26% /home
/dev/mapper/VolGroup-tmp 10G 33M 10G 1% /tmp
/dev/mapper/VolGroup-opt 40G 379M 40G 1% /opt
/dev/mapper/VolGroup-app 609G 465G 145G 77% /app
/dev/mapper/VolGroup-var 10G 3.3G 6.8G 33% /var
tmpfs 9.5G 0 9.5G 0% /run/user/2001
tmpfs 9.5G 0 9.5G 0% /run/user/1000
tmpfs 9.5G 0 9.5G 0% /run/user/1011
tmpfs 9.5G 0 9.5G 0% /run/user/1016
tmpfs 9.5G 0 9.5G 0% /run/user/1015
tmpfs 9.5G 0 9.5G 0% /run/user/1014
tmpfs 9.5G 0 9.5G 0% /run/user/2002
tmpfs 9.5G 0 9.5G 0% /run/user/1010
[root@pgdb ~]# cd /opt
[root@pgdb opt]# mkdir oracle
[root@pgdb opt]# chmod -R 777 /opt/oracle
[root@pgdb opt]# cd oracle/
[root@pgdb oracle]# ll
total 69044
-rw-r--r-- 1 user user 68965195 Mar 9 16:35 instantclient-basic-linux.x64-12.2.0.1.0.zip
-rw-r--r-- 1 user user 674743 Mar 9 16:35 instantclient-sdk-linux.x64-12.2.0.1.0.zip
-rw-r--r-- 1 user user 904309 Mar 9 16:35 instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
-rw-r--r-- 1 user user 150692 Mar 9 16:40 oracle_fdw-2.4.0.zip
[root@pgdb oracle]# mv oracle_fdw-2.4.0.zip ../
[root@pgdb oracle]# unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
Archive: instantclient-basic-linux.x64-12.2.0.1.0.zip
inflating: instantclient_12_2/adrci
inflating: instantclient_12_2/BASIC_README
inflating: instantclient_12_2/genezi
inflating: instantclient_12_2/libclntshcore.so.12.1
inflating: instantclient_12_2/libclntsh.so.12.1
inflating: instantclient_12_2/libipc1.so
inflating: instantclient_12_2/libmql1.so
inflating: instantclient_12_2/libnnz12.so
inflating: instantclient_12_2/libocci.so.12.1
inflating: instantclient_12_2/libociei.so
inflating: instantclient_12_2/libocijdbc12.so
inflating: instantclient_12_2/libons.so
inflating: instantclient_12_2/liboramysql12.so
inflating: instantclient_12_2/ojdbc8.jar
inflating: instantclient_12_2/uidrvci
inflating: instantclient_12_2/xstreams.jar
[root@pgdb oracle]# unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
Archive: instantclient-sdk-linux.x64-12.2.0.1.0.zip
creating: instantclient_12_2/sdk/
inflating: instantclient_12_2/sdk/ott
extracting: instantclient_12_2/sdk/ottclasses.zip
inflating: instantclient_12_2/sdk/SDK_README
creating: instantclient_12_2/sdk/demo/
inflating: instantclient_12_2/sdk/demo/setuporamysql.sh
inflating: instantclient_12_2/sdk/demo/occiobj.typ
inflating: instantclient_12_2/sdk/demo/occidml.cpp
inflating: instantclient_12_2/sdk/demo/occidemo.sql
inflating: instantclient_12_2/sdk/demo/occiobj.cpp
inflating: instantclient_12_2/sdk/demo/occidemod.sql
inflating: instantclient_12_2/sdk/demo/oraaccess.xml
inflating: instantclient_12_2/sdk/demo/demo.mk
inflating: instantclient_12_2/sdk/demo/cdemo81.c
creating: instantclient_12_2/sdk/include/
inflating: instantclient_12_2/sdk/include/occiControl.h
inflating: instantclient_12_2/sdk/include/oro.h
inflating: instantclient_12_2/sdk/include/ociapr.h
inflating: instantclient_12_2/sdk/include/occiCommon.h
inflating: instantclient_12_2/sdk/include/occiData.h
inflating: instantclient_12_2/sdk/include/oci8dp.h
inflating: instantclient_12_2/sdk/include/ociextp.h
inflating: instantclient_12_2/sdk/include/orl.h
inflating: instantclient_12_2/sdk/include/nzt.h
inflating: instantclient_12_2/sdk/include/ldap.h
inflating: instantclient_12_2/sdk/include/occi.h
inflating: instantclient_12_2/sdk/include/ociap.h
inflating: instantclient_12_2/sdk/include/odci.h
inflating: instantclient_12_2/sdk/include/ocixstream.h
inflating: instantclient_12_2/sdk/include/nzerror.h
inflating: instantclient_12_2/sdk/include/oci1.h
inflating: instantclient_12_2/sdk/include/ori.h
inflating: instantclient_12_2/sdk/include/ocixmldb.h
inflating: instantclient_12_2/sdk/include/ocidem.h
inflating: instantclient_12_2/sdk/include/occiAQ.h
inflating: instantclient_12_2/sdk/include/ocidef.h
inflating: instantclient_12_2/sdk/include/occiObjects.h
inflating: instantclient_12_2/sdk/include/oci.h
inflating: instantclient_12_2/sdk/include/oratypes.h
inflating: instantclient_12_2/sdk/include/orid.h
inflating: instantclient_12_2/sdk/include/xa.h
inflating: instantclient_12_2/sdk/include/ocikpr.h
inflating: instantclient_12_2/sdk/include/ocidfn.h
inflating: instantclient_12_2/sdk/include/ort.h
creating: instantclient_12_2/sdk/admin/
inflating: instantclient_12_2/sdk/admin/oraaccess.xsd
[root@pgdb oracle]# unzip instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
Archive: instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
inflating: instantclient_12_2/glogin.sql
inflating: instantclient_12_2/libsqlplusic.so
inflating: instantclient_12_2/libsqlplus.so
inflating: instantclient_12_2/sqlplus
inflating: instantclient_12_2/SQLPLUS_README
[root@pgdb oracle]# ll
total 68900
drwxr-xr-x 3 root root 4096 Mar 10 09:35 instantclient_12_2
-rw-r--r-- 1 user user 68965195 Mar 9 16:35 instantclient-basic-linux.x64-12.2.0.1.0.zip
-rw-r--r-- 1 user user 674743 Mar 9 16:35 instantclient-sdk-linux.x64-12.2.0.1.0.zip
-rw-r--r-- 1 user user 904309 Mar 9 16:35 instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
[root@pgdb oracle]# mv instantclient_12_2/ instantclient
[root@pgdb oracle]# vi /etc/profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`/usr/bin/id -u`
UID=`/usr/bin/id -ru`
fi
USER="`/usr/bin/id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge
export TZ=Asia/Shanghai
export TMOUT=0
PATH=$PATH:/app/pgsql/bin
export PROTOBUF_HOME=/usr/local/protobuf-3.10.1
export PATH=$GCC_HOME/bin:$PROTOBUF_HOME/bin:$PATH
export PROTOBUF_HOME=/usr/local/protobuf-3.10.1
export PROTOBUFC_HOME=/usr/local/protobuf-c-1.3.2
export PATH=$PROTOBUFC_HOME/bin:$GCC_HOME/bin:$PROTOBUF_HOME/bin:$PROTOBUFC_HOME/bin:$PATH
export CMAKE_HOME=/usr/local/cmake-3.21.1
export PATH=$GCC_HOME/bin:$CMAKE_HOME/bin:$PROTOBUF_HOME/bin:$PROTOBUFC_HOME/bin:$PATH
export PKG_CONFIG_PATH=/usr/local/protobuf-c-1.3.2/lib/pkgconfi:/usr/local/protobuf-3.10.1/lib/pkgconfig:/usr/local/sqlite/lib/pkgconfig:$PKG_CONFIG_PATH
export PGDATA=/app/pgsql/data
export PGHOME=/app/pgsql
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
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
export PATH=$GCC_HOME/bin:$CMAKE_HOME/bin:$PROTOBUF_HOME/bin:$PROTOBUFC_HOME/bin:$ORACLE_HOME:$PATH
"/etc/profile" 96L, 2850C written
[root@pgdb oracle]# source /etc/profile
[root@pgdb oracle]# echo $ORACLE_HOME
/opt/oracle/instantclient
[root@pgdb oracle]# pwd
/opt/oracle
[root@pgdb oracle]# cd /opt
[root@pgdb opt]# ll
total 148
drwxrwxrwx 5 root root 125 Sep 8 2021 dcits
drwxrwxrwx 3 root root 183 Mar 10 09:35 oracle
-rw-r--r-- 1 user user 150692 Mar 9 16:40 oracle_fdw-2.4.0.zip
drwxr-xr-x. 2 root root 6 Mar 26 2015 rh
[root@pgdb opt]# unzip oracle_fdw-2.4.0.zip
Archive: oracle_fdw-2.4.0.zip
creating: oracle_fdw-2.4.0/
inflating: oracle_fdw-2.4.0/TODO
creating: oracle_fdw-2.4.0/expected/
inflating: oracle_fdw-2.4.0/expected/oracle_join.out
inflating: oracle_fdw-2.4.0/expected/oracle_fdw.out
inflating: oracle_fdw-2.4.0/expected/oracle_gis.out
inflating: oracle_fdw-2.4.0/expected/oracle_import.out
creating: oracle_fdw-2.4.0/msvc/
inflating: oracle_fdw-2.4.0/msvc/oracle_fdw.sln
inflating: oracle_fdw-2.4.0/msvc/oracle_fdw.vcxproj
inflating: oracle_fdw-2.4.0/msvc/oracle_msvc.c
inflating: oracle_fdw-2.4.0/msvc/oracle_fdw.props
inflating: oracle_fdw-2.4.0/Makefile
inflating: oracle_fdw-2.4.0/CHANGELOG
inflating: oracle_fdw-2.4.0/oracle_fdw.h
inflating: oracle_fdw-2.4.0/oracle_fdw--1.0--1.1.sql
inflating: oracle_fdw-2.4.0/oracle_fdw--1.1--1.2.sql
inflating: oracle_fdw-2.4.0/oracle_fdw.c
inflating: oracle_fdw-2.4.0/oracle_fdw.control
inflating: oracle_fdw-2.4.0/oracle_fdw--1.2.sql
inflating: oracle_fdw-2.4.0/oracle_gis.c
inflating: oracle_fdw-2.4.0/META.json
creating: oracle_fdw-2.4.0/sql/
inflating: oracle_fdw-2.4.0/sql/oracle_join.sql
inflating: oracle_fdw-2.4.0/sql/oracle_gis.sql
inflating: oracle_fdw-2.4.0/sql/oracle_fdw.sql
inflating: oracle_fdw-2.4.0/sql/oracle_import.sql
inflating: oracle_fdw-2.4.0/oracle_utils.c
inflating: oracle_fdw-2.4.0/LICENSE
inflating: oracle_fdw-2.4.0/README.md
inflating: oracle_fdw-2.4.0/README.oracle_fdw
[root@pgdb opt]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@pgdb opt]# cd oracle_fdw-2.4.0/
[root@pgdb oracle_fdw-2.4.0]# make
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -I"/opt/oracle/instantclient/sdk/include" -I"/opt/oracle/instantclient/oci/include" -I"/opt/oracle/instantclient/rdbms/public" -I"/opt/oracle/instantclient/" -I/usr/include/oracle/21/client64 -I/usr/include/oracle/19.12/client64 -I/usr/include/oracle/19.12/client -I/usr/include/oracle/19.11/client64 -I/usr/include/oracle/19.11/client -I/usr/include/oracle/19.10/client64 -I/usr/include/oracle/19.10/client -I/usr/include/oracle/19.9/client -I/usr/include/oracle/19.9/client64 -I/usr/include/oracle/19.8/client -I/usr/include/oracle/19.8/client64 -I/usr/include/oracle/19.6/client -I/usr/include/oracle/19.6/client64 -I/usr/include/oracle/19.3/client -I/usr/include/oracle/19.3/client64 -I/usr/include/oracle/18.5/client -I/usr/include/oracle/18.5/client64 -I/usr/include/oracle/18.3/client -I/usr/include/oracle/18.3/client64 -I/usr/include/oracle/12.2/client -I/usr/include/oracle/12.2/client64 -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/app/pgsql/include/server -I/app/pgsql/include/internal -D_GNU_SOURCE -c -o oracle_fdw.o oracle_fdw.c
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -I"/opt/oracle/instantclient/sdk/include" -I"/opt/oracle/instantclient/oci/include" -I"/opt/oracle/instantclient/rdbms/public" -I"/opt/oracle/instantclient/" -I/usr/include/oracle/21/client64 -I/usr/include/oracle/19.12/client64 -I/usr/include/oracle/19.12/client -I/usr/include/oracle/19.11/client64 -I/usr/include/oracle/19.11/client -I/usr/include/oracle/19.10/client64 -I/usr/include/oracle/19.10/client -I/usr/include/oracle/19.9/client -I/usr/include/oracle/19.9/client64 -I/usr/include/oracle/19.8/client -I/usr/include/oracle/19.8/client64 -I/usr/include/oracle/19.6/client -I/usr/include/oracle/19.6/client64 -I/usr/include/oracle/19.3/client -I/usr/include/oracle/19.3/client64 -I/usr/include/oracle/18.5/client -I/usr/include/oracle/18.5/client64 -I/usr/include/oracle/18.3/client -I/usr/include/oracle/18.3/client64 -I/usr/include/oracle/12.2/client -I/usr/include/oracle/12.2/client64 -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/app/pgsql/include/server -I/app/pgsql/include/internal -D_GNU_SOURCE -c -o oracle_utils.o oracle_utils.c
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -I"/opt/oracle/instantclient/sdk/include" -I"/opt/oracle/instantclient/oci/include" -I"/opt/oracle/instantclient/rdbms/public" -I"/opt/oracle/instantclient/" -I/usr/include/oracle/21/client64 -I/usr/include/oracle/19.12/client64 -I/usr/include/oracle/19.12/client -I/usr/include/oracle/19.11/client64 -I/usr/include/oracle/19.11/client -I/usr/include/oracle/19.10/client64 -I/usr/include/oracle/19.10/client -I/usr/include/oracle/19.9/client -I/usr/include/oracle/19.9/client64 -I/usr/include/oracle/19.8/client -I/usr/include/oracle/19.8/client64 -I/usr/include/oracle/19.6/client -I/usr/include/oracle/19.6/client64 -I/usr/include/oracle/19.3/client -I/usr/include/oracle/19.3/client64 -I/usr/include/oracle/18.5/client -I/usr/include/oracle/18.5/client64 -I/usr/include/oracle/18.3/client -I/usr/include/oracle/18.3/client64 -I/usr/include/oracle/12.2/client -I/usr/include/oracle/12.2/client64 -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/app/pgsql/include/server -I/app/pgsql/include/internal -D_GNU_SOURCE -c -o oracle_gis.o oracle_gis.c
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o oracle_gis.o -L/app/pgsql/lib -Wl,--as-needed -Wl,-rpath,'/app/pgsql/lib',--enable-new-dtags -L"/opt/oracle/instantclient/" -L"/opt/oracle/instantclient/bin" -L"/opt/oracle/instantclient/lib" -L"/opt/oracle/instantclient/lib/amd64" -lclntsh -L/usr/lib/oracle/21/client64/lib -L/usr/lib/oracle/19.12/client64/lib -L/usr/lib/oracle/19.12/client/lib -L/usr/lib/oracle/19.11/client64/lib -L/usr/lib/oracle/19.11/client/lib -L/usr/lib/oracle/19.10/client64/lib -L/usr/lib/oracle/19.10/client/lib -L/usr/lib/oracle/19.9/client/lib -L/usr/lib/oracle/19.9/client64/lib -L/usr/lib/oracle/19.8/client/lib -L/usr/lib/oracle/19.8/client64/lib -L/usr/lib/oracle/19.6/client/lib -L/usr/lib/oracle/19.6/client64/lib -L/usr/lib/oracle/19.3/client/lib -L/usr/lib/oracle/19.3/client64/lib -L/usr/lib/oracle/18.5/client/lib -L/usr/lib/oracle/18.5/client64/lib -L/usr/lib/oracle/18.3/client/lib -L/usr/lib/oracle/18.3/client64/lib -L/usr/lib/oracle/12.2/client/lib -L/usr/lib/oracle/12.2/client64/lib -L/usr/lib/oracle/12.1/client/lib -L/usr/lib/oracle/12.1/client64/lib -L/usr/lib/oracle/11.2/client/lib -L/usr/lib/oracle/11.2/client64/lib -L/usr/lib/oracle/11.1/client/lib -L/usr/lib/oracle/11.1/client64/lib -L/usr/lib/oracle/10.2.0.5/client/lib -L/usr/lib/oracle/10.2.0.5/client64/lib -L/usr/lib/oracle/10.2.0.4/client/lib -L/usr/lib/oracle/10.2.0.4/client64/lib -L/usr/lib/oracle/10.2.0.3/client/lib -L/usr/lib/oracle/10.2.0.3/client64/lib
/bin/ld: cannot find -lclntsh
collect2: error: ld returned 1 exit status
make: *** [oracle_fdw.so] Error 1
[root@pgdb oracle_fdw-2.4.0]# cd /opt/oracle/instantclient/
[root@pgdb instantclient]# ln -sv libclntsh.so.12.1 libclntsh.so
‘libclntsh.so’ -> ‘libclntsh.so.12.1’
[root@pgdb instantclient]# ll libclntsh.so
lrwxrwxrwx 1 root root 17 Mar 10 09:48 libclntsh.so -> libclntsh.so.12.1
[root@pgdb instantclient]# cd /opt/oracle_fdw-2.4.0
[root@pgdb oracle_fdw-2.4.0]# make
gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o oracle_gis.o -L/app/pgsql/lib -Wl,--as-needed -Wl,-rpath,'/app/pgsql/lib',--enable-new-dtags -L"/opt/oracle/instantclient/" -L"/opt/oracle/instantclient/bin" -L"/opt/oracle/instantclient/lib" -L"/opt/oracle/instantclient/lib/amd64" -lclntsh -L/usr/lib/oracle/21/client64/lib -L/usr/lib/oracle/19.12/client64/lib -L/usr/lib/oracle/19.12/client/lib -L/usr/lib/oracle/19.11/client64/lib -L/usr/lib/oracle/19.11/client/lib -L/usr/lib/oracle/19.10/client64/lib -L/usr/lib/oracle/19.10/client/lib -L/usr/lib/oracle/19.9/client/lib -L/usr/lib/oracle/19.9/client64/lib -L/usr/lib/oracle/19.8/client/lib -L/usr/lib/oracle/19.8/client64/lib -L/usr/lib/oracle/19.6/client/lib -L/usr/lib/oracle/19.6/client64/lib -L/usr/lib/oracle/19.3/client/lib -L/usr/lib/oracle/19.3/client64/lib -L/usr/lib/oracle/18.5/client/lib -L/usr/lib/oracle/18.5/client64/lib -L/usr/lib/oracle/18.3/client/lib -L/usr/lib/oracle/18.3/client64/lib -L/usr/lib/oracle/12.2/client/lib -L/usr/lib/oracle/12.2/client64/lib -L/usr/lib/oracle/12.1/client/lib -L/usr/lib/oracle/12.1/client64/lib -L/usr/lib/oracle/11.2/client/lib -L/usr/lib/oracle/11.2/client64/lib -L/usr/lib/oracle/11.1/client/lib -L/usr/lib/oracle/11.1/client64/lib -L/usr/lib/oracle/10.2.0.5/client/lib -L/usr/lib/oracle/10.2.0.5/client64/lib -L/usr/lib/oracle/10.2.0.4/client/lib -L/usr/lib/oracle/10.2.0.4/client64/lib -L/usr/lib/oracle/10.2.0.3/client/lib -L/usr/lib/oracle/10.2.0.3/client64/lib
[root@pgdb oracle_fdw-2.4.0]# make install
/bin/mkdir -p '/app/pgsql/lib'
/bin/mkdir -p '/app/pgsql/share/extension'
/bin/mkdir -p '/app/pgsql/share/extension'
/bin/mkdir -p '/app/pgsql/share/doc/extension'
/bin/install -c -m 755 oracle_fdw.so '/app/pgsql/lib/oracle_fdw.so'
/bin/install -c -m 644 .//oracle_fdw.control '/app/pgsql/share/extension/'
/bin/install -c -m 644 .//oracle_fdw--1.2.sql .//oracle_fdw--1.0--1.1.sql .//oracle_fdw--1.1--1.2.sql '/app/pgsql/share/extension/'
/bin/install -c -m 644 .//README.oracle_fdw '/app/pgsql/share/doc/extension/'
[root@pgdb oracle_fdw-2.4.0]#
[root@pgdb oracle_fdw-2.4.0]# ll oracle_fdw.so
-rwxr-xr-x 1 root root 165504 Mar 10 09:48 oracle_fdw.so
[root@pgdb oracle_fdw-2.4.0]#
[root@pgdb oracle_fdw-2.4.0]# su - postgres
Last login: Thu Mar 10 09:45:01 CST 2022
[postgres@pgdb ~]$ repmgr cluster show
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string
----+------+---------+-----------+----------+----------+----------+----------+------------------------------------------------------------------
1 | pgdb | primary | * running | | default | 100 | 11 | host=192.168.208.7 user=postgres dbname=postgres connect_timeout=2
2 | pg08 | standby | running | pgdb | default | 100 | 11 | host=192.168.208.8 user=postgres dbname=postgres connect_timeout=2
[postgres@pgdb ~]$ psql -h pgdb
Password for user postgres:
psql (12.4)
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
testdb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | pubuser=CTc/postgres +
| | | | | jzshuser=CTc/postgres
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =T/postgres +
| | | | | postgres=CTc/postgres
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
wyzcdb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres+
| | | | | wyzc=CTc/postgres
(5 rows)
postgres=# \c testdb
You are now connected to database "testdb" as user "postgres".
testdb=# \dx
List of installed extensions
Name | Version | Schema | Description
----------------+---------+------------+------------------------------------------------------------
pgrouting | 2.6.3 | public | pgRouting Extension
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 3.1.3 | public | PostGIS geometry and geography spatial types and functions
postgis_raster | 3.1.3 | public | PostGIS raster types and functions
postgis_sfcgal | 3.1.3 | public | PostGIS SFCGAL functions
(5 rows)
testdb=# create extension oracle_fdw;
ERROR: could not load library "/app/pgsql/lib/oracle_fdw.so": libclntsh.so.12.1: cannot open shared object file: No such file or directory
testdb=# \q
[postgres@pgdb ~]$ exit
logout
处理办法:
----------------------------------------------------------------------------------上述
[root@pgdb oracle_fdw-2.4.0]# echo $ORACLE_HOME > /etc/ld.so.conf.d/oracle.conf
[root@pgdb oracle_fdw-2.4.0]# cat /etc/ld.so.conf.d/oracle.conf
/opt/oracle/instantclient
[root@pgdb oracle_fdw-2.4.0]# ldconfig
----------------------------------------------------------------------------------
[root@pgdb oracle_fdw-2.4.0]# su - postgres
Last login: Thu Mar 10 09:50:01 CST 2022
[postgres@pgdb ~]$ psql -h pgdb
Password for user postgres:
psql (12.4)
Type "help" for help.
postgres=# \c testdb
You are now connected to database "testdb" as user "postgres".
testdb=# \dx
List of installed extensions
Name | Version | Schema | Description
----------------+---------+------------+------------------------------------------------------------
pgrouting | 2.6.3 | public | pgRouting Extension
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 3.1.3 | public | PostGIS geometry and geography spatial types and functions
postgis_raster | 3.1.3 | public | PostGIS raster types and functions
postgis_sfcgal | 3.1.3 | public | PostGIS SFCGAL functions
(5 rows)
testdb=# create extension oracle_fdw;
CREATE EXTENSION
testdb=# \dx
List of installed extensions
Name | Version | Schema | Description
----------------+---------+------------+------------------------------------------------------------
oracle_fdw | 1.2 | public | foreign data wrapper for Oracle access
pgrouting | 2.6.3 | public | pgRouting Extension
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 3.1.3 | public | PostGIS geometry and geography spatial types and functions
postgis_raster | 3.1.3 | public | PostGIS raster types and functions
postgis_sfcgal | 3.1.3 | public | PostGIS SFCGAL functions
(6 rows)
testdb=#
pg配置连接oracle数据库的操作:
testdb=> \c testdb postgres
Password for user postgres:
You are now connected to database "testdb" as user "postgres".
testdb=# \dx
List of installed extensions
Name | Version | Schema | Description
------------+---------+------------+-------------------------------------------------------------------
oracle_fdw | 1.2 | public | foreign data wrapper for Oracle access
pg_trgm | 1.4 | public | text similarity measurement and index searching based on trigrams
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(3 rows)
testdb=# CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//192.168.208.40:1521/oradb');
CREATE SERVER
testdb=# \dew
List of foreign-data wrappers
Name | Owner | Handler | Validator
------------+----------+--------------------+----------------------
oracle_fdw | postgres | oracle_fdw_handler | oracle_fdw_validator
(1 row)
testdb=# GRANT USAGE ON FOREIGN SERVER oradb TO postgres;
GRANT
testdb=# GRANT USAGE ON FOREIGN SERVER oradb TO pguser;
GRANT
testdb=# \deu
List of user mappings
Server | User name
--------+-----------
(0 rows)
testdb=# \def
invalid command \def
Try \? for help.
testdb=# \des
List of foreign servers
Name | Owner | Foreign-data wrapper
------------+----------+----------------------
oradb | postgres | oracle_fdw
(1 row)
testdb=# \des+
List of foreign servers
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description
------------+----------+----------------------+---------------------+------+---------+--------------------------------------------+-------------
oradb | postgres | oracle_fdw | postgres=U/postgres+| | | (dbserver '//192.168.208.40:1521/oradb') |
| | | pguser=U/postgres | | | |
(1 row)
testdb=# \det
List of foreign tables
Schema | Table | Server
----------+--------------------------+------------
pguser | TEST1 | oradb
(1 row)
testdb=# \det+
List of foreign tables
Schema | Table | Server | FDW options | Description
----------+--------------------------+------------+-----------------------------------------------------+-------------
pguser | TEST1 | oradb | (schema 'orauser', "table" 'TEST1') |
(1 row)
testdb=# \des+
List of foreign servers
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description
------------+----------+----------------------+---------------------+------+---------+--------------------------------------------+-------------
oradb | postgres | oracle_fdw | postgres=U/postgres+| | | (dbserver '//192.168.208.40:1521/oradb') |
| | | pguser=U/postgres | | | |
(1 row)
testdb=# \deu+
List of user mappings
Server | User name | FDW options
------------+-----------+-------------------------------------------
oradb | pguser | ("user" 'orauser', password 'abcd1234')
oradb | postgres | ("user" 'orauser', password 'abcd1234')
(2 rows)
testdb=# \dew+
List of foreign-data wrappers
Name | Owner | Handler | Validator | Access privileges | FDW options | Description
------------+----------+---------------------------+-----------------------------+-------------------+-------------+-----------------------------
oracle_fdw | postgres | public.oracle_fdw_handler | public.oracle_fdw_validator | | | Oracle foreign data wrapper
(1 row)
testdb=# set search_path=pguser;
SET
testdb=# show search_path;
search_path
-------------
pguser
(1 row)
testdb=# \dt
List of relations
Schema | Name | Type | Owner
----------+----------------------------------+-------+----------
pguser | j | table | pguser
(36 rows)
testdb=# \c
You are now connected to database "testdb" as user "postgres".
testdb=# IMPORT FOREIGN SCHEMA "orauser" LIMIT TO (TEST1) FROM SERVER oradb INTO pguser;
ERROR: remote schema "orauser" does not exist
HINT: Enclose the schema name in double quotes to prevent case folding.
[postgres@ydw02 ~]$ psql -h 192.168.208.7 -U postgres testdb
Password for user postgres:
psql (12.4)
Type "help" for help.
testdb=# show search_path;
search_path
-----------------
"$user", public
(1 row)
testdb=# set search_path=pguser;
SET
testdb=# \dt
List of relations
Schema | Name | Type | Owner
----------+----------------------------------+-------+----------
pguser | j | table | pguser
testdb=# \des
List of foreign servers
Name | Owner | Foreign-data wrapper
------------+----------+----------------------
oradb | postgres | oracle_fdw
(1 row)
testdb=#CREATE FOREIGN TABLE TEST1(
LOGDATE DATE ,
FLDID VARCHAR,
FLDTAG VARCHAR,
ENBCODE VARCHAR,
ENBNAME VARCHAR,
STATION_ID VARCHAR,
VENDORNAME VARCHAR,
METYPE VARCHAR,
IPADDR VARCHAR,
NETWORKMASK VARCHAR,
GATEWAYIP VARCHAR,
EGRESSMBR VARCHAR,
REMOTEADDR1 VARCHAR,
REMOTEADDR2 VARCHAR,
SWVERSION VARCHAR,
RADIOMODE VARCHAR,
OPERATIONALSTATE VARCHAR,
STATE VARCHAR,
SOURCE_IDENTIFICATION VARCHAR,
SOURCE_TYPE VARCHAR,
SOURCE_VENDER VARCHAR,
SOURCE_NAME VARCHAR,
DISTRICT VARCHAR,
MAINTENANCE_AREA VARCHAR,
MAINTENANCE VARCHAR,
TENDERS VARCHAR,
AREA VARCHAR,
COVER_TYPE VARCHAR,
BTSID VARCHAR,
BSC VARCHAR,
RADIUS VARCHAR,
LONGITUDE numeric,
LATITUDE numeric,
CPU_LOAD VARCHAR,
CPU_LOAD_PJ VARCHAR,
BTSTYPENAME VARCHAR,
OBJECTID VARCHAR,
CHECK_STATE VARCHAR,
SHAPE_PARAM VARCHAR,
ISADD VARCHAR,
ISPROSTATE VARCHAR,
L800 VARCHAR,
USERLABEL VARCHAR,
SALES_UNIT VARCHAR,
CREATETIME DATE ,
ISDELETE VARCHAR,
SITE VARCHAR,
INTERSECTION VARCHAR,
INTERSECTION_TIME VARCHAR,
SITE_NAME VARCHAR,
USERLABEL_XY VARCHAR,
USER_TYPES VARCHAR,
SOURCE_NUMBER numeric,
COMMUNITY_TYPE VARCHAR,
COMMUNITY_RRU numeric,
STATION_NAME VARCHAR,
UPDATEMAIN_DATE DATE ,
IMPTYPE VARCHAR,
GRID_LAYOUT VARCHAR,
IS_TY_CHANGE VARCHAR,
OLD_STATE VARCHAR,
BREAKDAYS numeric,
BREAKTIME DATE ,
BUILDER VARCHAR,
BREAKREASON VARCHAR,
SJ_LONGITUDE numeric,
SJ_LATITUDE numeric,
WG_LONGITUDE numeric,
WG_LATITUDE numeric,
COOR_TYPE VARCHAR,
CURRMONTH_BREAKDAYS numeric,
PROGRAMENUM VARCHAR,
DESIGNER VARCHAR,
SUPERVISOR VARCHAR,
DCIP VARCHAR,
DCOMC VARCHAR,
BSNUM VARCHAR
) SERVER oradb OPTIONS (SCHEMA 'ORAUSER', TABLE 'TEST1');
testdb=# select * from TEST1 limit 2 offset 0;
logdate | fldid | fldtag | enbcode | enbname | station_id | vendorname | metype | ipaddr | networkmask | gatewayip | egressmbr | remoteaddr1
| remoteaddr2 | swversion | radiomode | operationalstate | state | source_identification | source_type | source_vender | source_name | district | maintenance_a
rea | maintenance | tenders | area | cover_type | btsid | bsc | radius | longitude | latitude | cpu_load | cpu_load_pj | btstypename | objectid | check_state | shape_p
aram | isadd | isprostate | l800 | userlabel | sales_unit | createtime | isdelete | site | intersection | intersection_time | site_name |
userlabel_xy | user_types | source_number | community_type | community_rru | station_name | updatemain_date | imptype | grid_layout | is_ty_change | old_state | breakdays | break
time | builder | breakreason | sj_longitude | sj_latitude | wg_longitude | wg_latitude | coor_type | currmonth_breakdays | programenum | designer | supervisor | dcip | dcomc | bs
num
------------+-------------------+---------+---------+------------------+------------+------------+--------+-------------+-----------------+-------------+-----------+-------------
+-------------+------------------------------+-----------+------------------+-------+-----------------------+-------------+---------------+-------------+----------+--------------
----+-------------+---------+--------+------------+--------+-----+--------+-----------+----------+----------+-------------+-------------+----------+-------------+----------------
-------------+-------+------------+------+-----------+--------------+------------+----------+--------------------+--------------+---------------------+-------------------------+-
-------------+------------+---------------+----------------+---------------+--------------+-----------------+---------+-------------+--------------+-----------+-----------+------
-----+---------+-------------+--------------+-------------+--------------+-------------+-----------+---------------------+-------------+----------+------------+------+-------+---
----
2020-05-07 | 99999999182369779 | orauser002 | 113847 | ZHT_DX大兴 | 20248811 | ZTE | BS8700 | 6.1.10.206 | 255.255.255.252 | 6.1.103.205 | 1000 | 6...
(2 rows)
testdb=# \det TEST1
List of foreign tables
Schema | Table | Server
----------+--------------------------+------------
pguser | TEST1 | oradb
(1 row)
testdb=# \dt
List of relations
Schema | Name | Type | Owner
----------+----------------------------------+-------+----------
pguser | j | table | pguser
(36 rows)
testdb=# select * from TEST1 limit 1 offset 0;
logdate | fldid | fldtag | enbcode | enbname | station_id | vendorname | metype | ipaddr | networkmask | gatewayip | egressmbr | remoteaddr1
| remoteaddr2 | swversion | radiomode | operationalstate | state | source_identification | source_type | source_vender | source_name | district | maintenance_a
rea | maintenance | tenders | area | cover_type | btsid | bsc | radius | longitude | latitude | cpu_load | cpu_load_pj | btstypename | objectid | check_state | shape_p
aram | isadd | isprostate | l800 | userlabel | sales_unit | createtime | isdelete | site | intersection | intersection_time | site_name |
userlabel_xy | user_types | source_number | community_type | community_rru | station_name | updatemain_date | imptype | grid_layout | is_ty_change | old_state | breakdays | break
time | builder | breakreason | sj_longitude | sj_latitude | wg_longitude | wg_latitude | coor_type | currmonth_breakdays | programenum | designer | supervisor | dcip | dcomc | bs
num
------------+-------------------+---------+---------+------------------+------------+------------+--------+-------------+-----------------+-------------+-----------+-------------
+-------------+------------------------------+-----------+------------------+-------+-----------------------+-------------+---------------+-------------+----------+--------------
----+-------------+---------+--------+------------+--------+-----+--------+-----------+----------+----------+-------------+-------------+----------+-------------+----------------
-------------+-------+------------+------+-----------+--------------+------------+----------+--------------------+--------------+---------------------+-------------------------+-
-------------+------------+---------------+----------------+---------------+--------------+-----------------+---------+-------------+--------------+-----------+-----------+------
-----+---------+-------------+--------------+-------------+--------------+-------------+-----------+---------------------+-------------+----------+------------+------+-------+---
----
2020-05-07 | 99999999182369779 | orauser002 | 113847 | ZHT_DX大兴 | 20248811 | ZTE | BS8700 | 6.1.10.206 | 255.255.255.252 | 6.1.103.205 | 1000 | 6
(1 row)
testdb=# show search_path;
search_path
-------------
pguser
(1 row)
testdb=#
testdb=# IMPORT FOREIGN SCHEMA "orauser"
testdb-# LIMIT TO (TEST1)
testdb-# FROM SERVER oradb
testdb-# INTO public
testdb-# OPTIONS (case 'lower', readonly 'true',max_long '32767',sample_percent '1', prefetch '0');
IMPORT FOREIGN SCHEMA
testdb=# \det
List of foreign tables
Schema | Table | Server
--------+--------------------------+------------
public | TEST1 | oradb
(1 row)
testdb=# select * from TEST1 limit 1 offset 0;
logdate | fldid | fldtag | enbcode | enbname | station_id | vendorname | metype | ipaddr | networkmask | gatewayip | egressmbr | remoteaddr
1 | remoteaddr2 | swversion | radiomode | operationalstate | state | source_identification | source_type | source_vender | source_name | district | maintenance_area |
maintenance | tenders | area | cover_type | btsid | bsc | radius | longitude | latitude | cpu_load | cpu_load_pj | btstypename | objectid | check_state | shape_param
| isadd | isprostate | l800 | userlabel | sales_unit | createtime | isdelete | site | intersection | intersection_time | site_name | user
label_xy | user_types | source_number | community_type | community_rru | station_name | updatemain_date | imptype | grid_layout | is_ty_change | old_state | breakdays | breaktime |
builder | breakreason | sj_longitude | sj_latitude | wg_longitude | wg_latitude | coor_type | currmonth_breakdays | programenum | designer | supervisor | dcip | dcomc | bsnum
---------------------+-------------------+---------+---------+------------------+------------+------------+--------+-------------+-----------------+-------------+-----------+-----------
--+-------------+------------------------------+-----------+------------------+-------+-----------------------+-------------+---------------+-------------+----------+------------------+
-------------+---------+--------+------------+--------+-----+--------+--------------+-------------+----------+-------------+-------------+----------+-------------+----------------------
-------+-------+------------+------+-----------+--------------+---------------------+----------+--------------------+--------------+---------------------+-------------------------+-----
---------+------------+---------------+----------------+---------------+--------------+---------------------+---------+-------------+--------------+-----------+-----------+-----------+-
--------+-------------+--------------+-------------+--------------+-------------+-----------+---------------------+-------------+----------+------------+------+-------+-------
2020-05-07 | 99999999182369779 | orauser002 | 113847 | ZHT_DX大兴 | 20248811 | ZTE | BS8700 | 6.1.10.206 | 255.255.255.252 | 6.1.103.205 | 1000 | 6
(1 row)
testdb=# drop foreign table TEST1;
DROP FOREIGN TABLE
testdb=# IMPORT FOREIGN SCHEMA "ORAUSER" LIMIT TO (TEST1) FROM SERVER oradb INTO public;
IMPORT FOREIGN SCHEMA
testdb=# drop foreign table TEST1;
DROP FOREIGN TABLE
testdb=# IMPORT FOREIGN SCHEMA orauser LIMIT TO (TEST1) FROM SERVER oradb INTO public;
ERROR: remote schema "orauser" does not exist
HINT: Enclose the schema name in double quotes to prevent case folding.
testdb=# IMPORT FOREIGN SCHEMA "orauser" LIMIT TO (TEST1) FROM SERVER oradb INTO public;
ERROR: remote schema "orauser" does not exist
HINT: Enclose the schema name in double quotes to prevent case folding.
testdb=# create schema jyc;
CREATE SCHEMA
testdb=# IMPORT FOREIGN SCHEMA "ORAUSER" LIMIT TO (TEST1) FROM SERVER oradb INTO jyc;
IMPORT FOREIGN SCHEMA
testdb=# set search_path=jyc;
SET
testdb=# \dt
Did not find any relations.
testdb=# \det
List of foreign tables
Schema | Table | Server
--------+--------------------------+------------
jyc | TEST1 | oradb
(1 row)
testdb=# select * from TEST1 limit 1;
logdate | fldid | fldtag | enbcode | enbname | station_id | vendorname | metype | ipaddr | networkmask | gatewayip | egressmbr | remoteaddr
1 | remoteaddr2 | swversion | radiomode | operationalstate | state | source_identification | source_type | source_vender | source_name | district | maintenance_area |
maintenance | tenders | area | cover_type | btsid | bsc | radius | longitude | latitude | cpu_load | cpu_load_pj | btstypename | objectid | check_state | shape_param
| isadd | isprostate | l800 | userlabel | sales_unit | createtime | isdelete | site | intersection | intersection_time | site_name | user
label_xy | user_types | source_number | community_type | community_rru | station_name | updatemain_date | imptype | grid_layout | is_ty_change | old_state | breakdays | breaktime |
builder | breakreason | sj_longitude | sj_latitude | wg_longitude | wg_latitude | coor_type | currmonth_breakdays | programenum | designer | supervisor | dcip | dcomc | bsnum
---------------------+-------------------+---------+---------+------------------+------------+------------+--------+-------------+-----------------+-------------+-----------+-----------
--+-------------+------------------------------+-----------+------------------+-------+-----------------------+-------------+---------------+-------------+----------+------------------+
-------------+---------+--------+------------+--------+-----+--------+--------------+-------------+----------+-------------+-------------+----------+-------------+----------------------
-------+-------+------------+------+-----------+--------------+---------------------+----------+--------------------+--------------+---------------------+-------------------------+-----
---------+------------+---------------+----------------+---------------+--------------+---------------------+---------+-------------+--------------+-----------+-----------+-----------+-
--------+-------------+--------------+-------------+--------------+-------------+-----------+---------------------+-------------+----------+------------+------+-------+-------
2020-05-07 | 99999999182369779 | orauser002 | 113847 | ZHT_DX大兴 | 20248811 | ZTE | BS8700 | 6.1.10.206 | 255.255.255.252 | 6.1.103.205 | 1000 | 6
(1 row)
testdb=#
testdb=# SELECT a.attnum,
testdb-# a.attname AS field,
testdb-# t.typname AS type,
testdb-# a.attlen AS length,
testdb-# a.atttypmod AS lengthvar,
testdb-# a.attnotnull AS notnull,
testdb-# b.description AS comment
testdb-# FROM pg_class c,
testdb-# pg_attribute a
testdb-# LEFT OUTER JOIN pg_description b ON a.attrelid=b.objoid AND a.attnum = b.objsubid,
testdb-# pg_type t
testdb-# WHERE c.relname = 'TEST1'
testdb-# and a.attnum > 0
testdb-# and a.attrelid = c.oid
testdb-# and a.atttypid = t.oid
testdb-# ORDER BY a.attnum;
attnum | field | type | length | lengthvar | notnull | comment
--------+-----------------------+-----------+--------+-----------+---------+---------
1 | logdate | date | 4 | -1 | f |
1 | logdate | timestamp | 8 | 0 | f |
2 | fldid | varchar | -1 | -1 | f |
2 | fldid | varchar | -1 | 36 | t |
3 | fldtag | varchar | -1 | 68 | f |
3 | fldtag | varchar | -1 | -1 | f |
4 | enbcode | varchar | -1 | 260 | f |
4 | enbcode | varchar | -1 | -1 | f |
5 | enbname | varchar | -1 | 260 | f |
5 | enbname | varchar | -1 | -1 | f |
6 | station_id | varchar | -1 | 260 | f |
6 | station_id | varchar | -1 | -1 | f |
7 | vendorname | varchar | -1 | 260 | f |
7 | vendorname | varchar | -1 | -1 | f |
8 | metype | varchar | -1 | 260 | f |
8 | metype | varchar | -1 | -1 | f |
9 | ipaddr | varchar | -1 | 260 | f |
9 | ipaddr | varchar | -1 | -1 | f |
10 | networkmask | varchar | -1 | -1 | f |
10 | networkmask | varchar | -1 | 260 | f |
11 | gatewayip | varchar | -1 | -1 | f |
11 | gatewayip | varchar | -1 | 260 | f |
12 | egressmbr | varchar | -1 | 260 | f |
12 | egressmbr | varchar | -1 | -1 | f |
13 | remoteaddr1 | varchar | -1 | -1 | f |
13 | remoteaddr1 | varchar | -1 | 260 | f |
14 | remoteaddr2 | varchar | -1 | 260 | f |
14 | remoteaddr2 | varchar | -1 | -1 | f |
15 | swversion | varchar | -1 | -1 | f |
15 | swversion | varchar | -1 | 260 | f |
16 | radiomode | varchar | -1 | 260 | f |
16 | radiomode | varchar | -1 | -1 | f |
17 | operationalstate | varchar | -1 | -1 | f |
17 | operationalstate | varchar | -1 | 260 | f |
18 | state | varchar | -1 | 260 | f |
18 | state | varchar | -1 | -1 | f |
19 | source_identification | varchar | -1 | -1 | f |
19 | source_identification | varchar | -1 | 260 | f |
20 | source_type | varchar | -1 | 260 | f |
20 | source_type | varchar | -1 | -1 | f |
21 | source_vender | varchar | -1 | -1 | f |
21 | source_vender | varchar | -1 | 260 | f |
22 | source_name | varchar | -1 | -1 | f |
22 | source_name | varchar | -1 | 260 | f |
23 | district | varchar | -1 | -1 | f |
23 | district | varchar | -1 | 260 | f |
24 | maintenance_area | varchar | -1 | -1 | f |
24 | maintenance_area | varchar | -1 | 260 | f |
25 | maintenance | varchar | -1 | -1 | f |
25 | maintenance | varchar | -1 | 260 | f |
26 | tenders | varchar | -1 | -1 | f |
26 | tenders | varchar | -1 | 260 | f |
27 | area | varchar | -1 | 260 | f |
27 | area | varchar | -1 | -1 | f |
28 | cover_type | varchar | -1 | -1 | f |
28 | cover_type | varchar | -1 | 260 | f |
29 | btsid | varchar | -1 | 260 | f |
29 | btsid | varchar | -1 | -1 | f |
30 | bsc | varchar | -1 | -1 | f |
30 | bsc | varchar | -1 | 260 | f |
31 | radius | varchar | -1 | -1 | f |
31 | radius | varchar | -1 | 260 | f |
32 | longitude | numeric | -1 | 1048588 | f |
32 | longitude | numeric | -1 | -1 | f |
33 | latitude | numeric | -1 | 1048588 | f |
33 | latitude | numeric | -1 | -1 | f |
34 | cpu_load | varchar | -1 | 260 | f |
34 | cpu_load | varchar | -1 | -1 | f |
35 | cpu_load_pj | varchar | -1 | 260 | f |
35 | cpu_load_pj | varchar | -1 | -1 | f |
36 | btstypename | varchar | -1 | -1 | f |
36 | btstypename | varchar | -1 | 260 | f |
37 | objectid | varchar | -1 | -1 | f |
37 | objectid | varchar | -1 | 24 | f |
38 | check_state | varchar | -1 | 68 | f |
38 | check_state | varchar | -1 | -1 | f |
39 | shape_param | varchar | -1 | -1 | f |
39 | shape_param | varchar | -1 | 132 | f |
40 | isadd | varchar | -1 | 36 | f |
40 | isadd | varchar | -1 | -1 | f |
41 | isprostate | varchar | -1 | 36 | f |
41 | isprostate | varchar | -1 | -1 | f |
42 | l800 | varchar | -1 | 68 | f |
42 | l800 | varchar | -1 | -1 | f |
43 | userlabel | varchar | -1 | 260 | f |
43 | userlabel | varchar | -1 | -1 | f |
44 | sales_unit | varchar | -1 | -1 | f |
44 | sales_unit | varchar | -1 | 260 | f |
45 | createtime | timestamp | 8 | 0 | f |
45 | createtime | date | 4 | -1 | f |
46 | isdelete | varchar | -1 | 68 | f |
46 | isdelete | varchar | -1 | -1 | f |
47 | site | varchar | -1 | -1 | f |
47 | site | varchar | -1 | 68 | f |
48 | intersection | varchar | -1 | 260 | f |
48 | intersection | varchar | -1 | -1 | f |
49 | intersection_time | varchar | -1 | -1 | f |
49 | intersection_time | varchar | -1 | 1028 | f |
50 | site_name | varchar | -1 | 1028 | f |
50 | site_name | varchar | -1 | -1 | f |
51 | userlabel_xy | varchar | -1 | -1 | f |
51 | userlabel_xy | varchar | -1 | 1028 | f |
52 | user_types | varchar | -1 | 1028 | f |
52 | user_types | varchar | -1 | -1 | f |
53 | source_number | numeric | -1 | -1 | f |
53 | source_number | numeric | -1 | 1572868 | f |
54 | community_type | varchar | -1 | 1028 | f |
54 | community_type | varchar | -1 | -1 | f |
55 | community_rru | numeric | -1 | 1572868 | f |
55 | community_rru | numeric | -1 | -1 | f |
56 | station_name | varchar | -1 | 1028 | f |
56 | station_name | varchar | -1 | -1 | f |
57 | updatemain_date | timestamp | 8 | 0 | f |
57 | updatemain_date | date | 4 | -1 | f |
58 | imptype | varchar | -1 | -1 | f |
58 | imptype | varchar | -1 | 68 | f |
59 | grid_layout | varchar | -1 | -1 | f |
59 | grid_layout | varchar | -1 | 1028 | f |
60 | is_ty_change | varchar | -1 | 1028 | f |
60 | is_ty_change | varchar | -1 | -1 | f |
61 | old_state | varchar | -1 | 260 | f |
61 | old_state | varchar | -1 | -1 | f |
62 | breakdays | int4 | 4 | -1 | f |
62 | breakdays | numeric | -1 | -1 | f |
63 | breaktime | date | 4 | -1 | f |
63 | breaktime | timestamp | 8 | 0 | f |
64 | builder | varchar | -1 | 132 | f |
64 | builder | varchar | -1 | -1 | f |
65 | breakreason | varchar | -1 | 132 | f |
65 | breakreason | varchar | -1 | -1 | f |
66 | sj_longitude | numeric | -1 | 1048588 | f |
66 | sj_longitude | numeric | -1 | -1 | f |
67 | sj_latitude | numeric | -1 | 1048588 | f |
67 | sj_latitude | numeric | -1 | -1 | f |
68 | wg_longitude | numeric | -1 | -1 | f |
68 | wg_longitude | numeric | -1 | 1048588 | f |
69 | wg_latitude | numeric | -1 | -1 | f |
69 | wg_latitude | numeric | -1 | 1048588 | f |
70 | coor_type | varchar | -1 | 14 | f |
70 | coor_type | varchar | -1 | -1 | f |
71 | currmonth_breakdays | int2 | 2 | -1 | f |
71 | currmonth_breakdays | numeric | -1 | -1 | f |
72 | programenum | varchar | -1 | -1 | f |
72 | programenum | varchar | -1 | 68 | f |
73 | designer | varchar | -1 | -1 | f |
73 | designer | varchar | -1 | 68 | f |
74 | supervisor | varchar | -1 | -1 | f |
74 | supervisor | varchar | -1 | 68 | f |
75 | dcip | varchar | -1 | -1 | f |
75 | dcip | varchar | -1 | 260 | f |
76 | dcomc | varchar | -1 | 260 | f |
76 | dcomc | varchar | -1 | -1 | f |
77 | bsnum | varchar | -1 | 128 | f |
77 | bsnum | varchar | -1 | -1 | f |
(154 rows)
testdb=# set search_path=pguser;
SET
testdb=# \det
List of foreign tables
Schema | Table | Server
----------+--------------------------+------------
pguser | TEST1 | oradb
(1 row)
检查表结构的SQL语句参考:
testdb=# SELECT a.attnum,
a.attname AS field,
t.typname AS type,
a.attlen AS length,
a.atttypmod AS lengthvar,
a.attnotnull AS notnull,
b.description AS comment
FROM pg_class c,
pg_attribute a
LEFT OUTER JOIN pg_description b ON a.attrelid=b.objoid AND a.attnum = b.objsubid,
pg_type t
WHERE c.relname = 'TEST1'
and a.attnum > 0
and a.attrelid = c.oid
and a.atttypid = t.oid
ORDER BY a.attnum;
attnum | field | type | length | lengthvar | notnull | comment
--------+-----------------------+-----------+--------+-----------+---------+---------
1 | logdate | date | 4 | -1 | f |
1 | logdate | timestamp | 8 | 0 | f |
2 | fldid | varchar | -1 | -1 | f |
2 | fldid | varchar | -1 | 36 | t |
3 | fldtag | varchar | -1 | 68 | f |
3 | fldtag | varchar | -1 | -1 | f |
4 | enbcode | varchar | -1 | 260 | f |
4 | enbcode | varchar | -1 | -1 | f |
5 | enbname | varchar | -1 | 260 | f |
5 | enbname | varchar | -1 | -1 | f |
6 | station_id | varchar | -1 | 260 | f |
6 | station_id | varchar | -1 | -1 | f |
7 | vendorname | varchar | -1 | 260 | f |
7 | vendorname | varchar | -1 | -1 | f |
8 | metype | varchar | -1 | 260 | f |
8 | metype | varchar | -1 | -1 | f |
9 | ipaddr | varchar | -1 | 260 | f |
9 | ipaddr | varchar | -1 | -1 | f |
10 | networkmask | varchar | -1 | -1 | f |
10 | networkmask | varchar | -1 | 260 | f |
11 | gatewayip | varchar | -1 | -1 | f |
11 | gatewayip | varchar | -1 | 260 | f |
12 | egressmbr | varchar | -1 | 260 | f |
12 | egressmbr | varchar | -1 | -1 | f |
13 | remoteaddr1 | varchar | -1 | -1 | f |
13 | remoteaddr1 | varchar | -1 | 260 | f |
14 | remoteaddr2 | varchar | -1 | 260 | f |
14 | remoteaddr2 | varchar | -1 | -1 | f |
15 | swversion | varchar | -1 | -1 | f |
15 | swversion | varchar | -1 | 260 | f |
16 | radiomode | varchar | -1 | 260 | f |
16 | radiomode | varchar | -1 | -1 | f |
17 | operationalstate | varchar | -1 | -1 | f |
17 | operationalstate | varchar | -1 | 260 | f |
18 | state | varchar | -1 | 260 | f |
18 | state | varchar | -1 | -1 | f |
19 | source_identification | varchar | -1 | -1 | f |
19 | source_identification | varchar | -1 | 260 | f |
20 | source_type | varchar | -1 | 260 | f |
20 | source_type | varchar | -1 | -1 | f |
21 | source_vender | varchar | -1 | -1 | f |
21 | source_vender | varchar | -1 | 260 | f |
22 | source_name | varchar | -1 | -1 | f |
22 | source_name | varchar | -1 | 260 | f |
23 | district | varchar | -1 | -1 | f |
23 | district | varchar | -1 | 260 | f |
24 | maintenance_area | varchar | -1 | -1 | f |
24 | maintenance_area | varchar | -1 | 260 | f |
25 | maintenance | varchar | -1 | -1 | f |
25 | maintenance | varchar | -1 | 260 | f |
26 | tenders | varchar | -1 | -1 | f |
26 | tenders | varchar | -1 | 260 | f |
27 | area | varchar | -1 | 260 | f |
27 | area | varchar | -1 | -1 | f |
28 | cover_type | varchar | -1 | -1 | f |
28 | cover_type | varchar | -1 | 260 | f |
29 | btsid | varchar | -1 | 260 | f |
29 | btsid | varchar | -1 | -1 | f |
30 | bsc | varchar | -1 | -1 | f |
30 | bsc | varchar | -1 | 260 | f |
31 | radius | varchar | -1 | -1 | f |
31 | radius | varchar | -1 | 260 | f |
32 | longitude | numeric | -1 | 1048588 | f |
32 | longitude | numeric | -1 | -1 | f |
33 | latitude | numeric | -1 | 1048588 | f |
33 | latitude | numeric | -1 | -1 | f |
34 | cpu_load | varchar | -1 | 260 | f |
34 | cpu_load | varchar | -1 | -1 | f |
35 | cpu_load_pj | varchar | -1 | 260 | f |
35 | cpu_load_pj | varchar | -1 | -1 | f |
36 | btstypename | varchar | -1 | -1 | f |
36 | btstypename | varchar | -1 | 260 | f |
37 | objectid | varchar | -1 | -1 | f |
37 | objectid | varchar | -1 | 24 | f |
38 | check_state | varchar | -1 | 68 | f |
38 | check_state | varchar | -1 | -1 | f |
39 | shape_param | varchar | -1 | -1 | f |
39 | shape_param | varchar | -1 | 132 | f |
40 | isadd | varchar | -1 | 36 | f |
40 | isadd | varchar | -1 | -1 | f |
41 | isprostate | varchar | -1 | 36 | f |
41 | isprostate | varchar | -1 | -1 | f |
42 | l800 | varchar | -1 | 68 | f |
42 | l800 | varchar | -1 | -1 | f |
43 | userlabel | varchar | -1 | 260 | f |
43 | userlabel | varchar | -1 | -1 | f |
44 | sales_unit | varchar | -1 | -1 | f |
44 | sales_unit | varchar | -1 | 260 | f |
45 | createtime | timestamp | 8 | 0 | f |
45 | createtime | date | 4 | -1 | f |
46 | isdelete | varchar | -1 | 68 | f |
46 | isdelete | varchar | -1 | -1 | f |
47 | site | varchar | -1 | -1 | f |
47 | site | varchar | -1 | 68 | f |
48 | intersection | varchar | -1 | 260 | f |
48 | intersection | varchar | -1 | -1 | f |
49 | intersection_time | varchar | -1 | -1 | f |
49 | intersection_time | varchar | -1 | 1028 | f |
50 | site_name | varchar | -1 | 1028 | f |
50 | site_name | varchar | -1 | -1 | f |
51 | userlabel_xy | varchar | -1 | -1 | f |
51 | userlabel_xy | varchar | -1 | 1028 | f |
52 | user_types | varchar | -1 | 1028 | f |
52 | user_types | varchar | -1 | -1 | f |
53 | source_number | numeric | -1 | -1 | f |
53 | source_number | numeric | -1 | 1572868 | f |
54 | community_type | varchar | -1 | 1028 | f |
54 | community_type | varchar | -1 | -1 | f |
55 | community_rru | numeric | -1 | 1572868 | f |
55 | community_rru | numeric | -1 | -1 | f |
56 | station_name | varchar | -1 | 1028 | f |
56 | station_name | varchar | -1 | -1 | f |
57 | updatemain_date | timestamp | 8 | 0 | f |
57 | updatemain_date | date | 4 | -1 | f |
58 | imptype | varchar | -1 | -1 | f |
58 | imptype | varchar | -1 | 68 | f |
59 | grid_layout | varchar | -1 | -1 | f |
59 | grid_layout | varchar | -1 | 1028 | f |
60 | is_ty_change | varchar | -1 | 1028 | f |
60 | is_ty_change | varchar | -1 | -1 | f |
61 | old_state | varchar | -1 | 260 | f |
61 | old_state | varchar | -1 | -1 | f |
62 | breakdays | int4 | 4 | -1 | f |
62 | breakdays | numeric | -1 | -1 | f |
63 | breaktime | date | 4 | -1 | f |
63 | breaktime | timestamp | 8 | 0 | f |
64 | builder | varchar | -1 | 132 | f |
64 | builder | varchar | -1 | -1 | f |
65 | breakreason | varchar | -1 | 132 | f |
65 | breakreason | varchar | -1 | -1 | f |
66 | sj_longitude | numeric | -1 | 1048588 | f |
66 | sj_longitude | numeric | -1 | -1 | f |
67 | sj_latitude | numeric | -1 | 1048588 | f |
67 | sj_latitude | numeric | -1 | -1 | f |
68 | wg_longitude | numeric | -1 | -1 | f |
68 | wg_longitude | numeric | -1 | 1048588 | f |
69 | wg_latitude | numeric | -1 | -1 | f |
69 | wg_latitude | numeric | -1 | 1048588 | f |
70 | coor_type | varchar | -1 | 14 | f |
70 | coor_type | varchar | -1 | -1 | f |
71 | currmonth_breakdays | int2 | 2 | -1 | f |
71 | currmonth_breakdays | numeric | -1 | -1 | f |
72 | programenum | varchar | -1 | -1 | f |
72 | programenum | varchar | -1 | 68 | f |
73 | designer | varchar | -1 | -1 | f |
73 | designer | varchar | -1 | 68 | f |
74 | supervisor | varchar | -1 | -1 | f |
74 | supervisor | varchar | -1 | 68 | f |
75 | dcip | varchar | -1 | -1 | f |
75 | dcip | varchar | -1 | 260 | f |
76 | dcomc | varchar | -1 | 260 | f |
76 | dcomc | varchar | -1 | -1 | f |
77 | bsnum | varchar | -1 | 128 | f |
77 | bsnum | varchar | -1 | -1 | f |
(154 rows)
testdb=#
小结:
使用oracle_fdw可以很方便的从pg库直接查询oracle中表和视图的信息,甚至对表dml增删改的操作。
另外对于迁移数据也很方便:创建外部表后,可以直接ctas的方式创建出符合pg格式的表。结合ora2pg工具https://ora2pg.darold.net/还可以大大提升迁移数据的速度http://www.migops.com/blog/2021/07/01/ora2pg-now-supports-oracle_fdw-to-increase-the-data-migration-speed/




