背景

  最近在负责公司数据Oracle转PG;老平台数据库:Oracle11g;新平台数据库:PostgreSQL12。由于平台统计规则有变动;所以正在推广的游戏数据无法全部迁移过来;只能在老平台上运行。而支付数据接口升级;统一进入新平台数据PG。需要将部分支付数据由PostgreSQL同步到Oracle。

  简而言之:PostgreSQL增量同步表到Oracle。首先声明我不是反“去IOE”潮流。我想到两种方案

一、安装Oracle客户端

1、下载地址
http://www.oracle.com/technetwork/database/database-technologies/instant-client/overview/index.html
2、 安装步骤
2.1 创建安装目录
[root@Postgres201 ~]# mkdir -p /u01/app/
[root@Postgres201 ~]# cd /u01/app/
2.2 上传软件包并解压
[root@Postgres201 app]# unzip instantclient-basic-linux.x64-11.2.0.4.0.zip
[root@Postgres201 app]# unzip instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
[root@Postgres201 app]# unzip instantclient-sdk-linux.x64-11.2.0.4.0.zip
[root@Postgres201 app]# mv instantclient_11_2/ oracle
[root@Postgres201 app]# cd oracle
2.3 配置网络文件
[root@Postgres201 app]# cd oracle
[root@Postgres201 oracle]# mkdir -p network/admin
[root@Postgres201 oracle]# cd network/admin/
[root@Postgres201 admin]# vi tnsnames.ora
ora221 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.221)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
2.4 配置用户环境变量
export ORACLE_HOME=/u01/app/oracle
export TNS_ADMIN=$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME:$PATH

二、安装oracle_fdw

  从PostgreSQL9.3开始;Oracle_fdw支持在外部表执行 INSERT, UPDATE 和 DELETE等操作;正好符合我们PostgresQL TO Oracle的方案

1、下载地址
http://pgxn.org/dist/oracle_fdw/
2、安装步骤
[root@Postgres201 opt]# unzip oracle_fdw-2.0.0.zip
[root@Postgres201 opt]# cd oracle_fdw-2.0.0
#加载环境变量后执行 pg_config是否在对应PGHOME/bin目录下。编译后会在对应的目录下面
[root@Postgres201 oracle_fdw-2.0.0]# source /home/postgres/.bashrc
[root@Postgres201 oracle_fdw-2.0.0]# pg_config
[root@Postgres201 oracle_fdw-2.0.0]# make
[root@Postgres201 oracle_fdw-2.0.0]# make install
FAQ:执行make若出现“/usr/bin/ld: cannot find -lclntsh”;原因是找不到库liblclntsh文件;
解决方案:
1. 检查环境变量,看ORACLE有关的环境变量是否设置正确
2. 是否文件名字后有oracle版本信息;需要改名字
该文件在oracle安装目录下;本例是需要改名字即可
[root@Postgres201 oracle]# ln -sv libclntsh.so.11.1 libclntsh.so
[root@Postgres201 oracle_fdw-2.0.0]# make
[root@Postgres201 oracle_fdw-2.0.0]# make install
3、创建外部扩展
adsas=# create extension oracle_fdw;
ERROR: could not load library "/app/pg12/lib/postgresql/oracle_fdw.so": libclntsh.so.11.1: cannot open shared object file: No such file or directory
解决方案:
1、创建文件/etc/ld.so.conf.d/oracle.conf
2、添加内容;libclntsh.so.11.1文件所在的路径
/app/oracle
3、执行加载ldconfig
4、再登录psql执行
adsas=# create extension oracle_fdw;
CREATE EXTENSION

三、创建外部表

CREATE FOREIGN TABLE fdw_game_pay_log (
ID int8 OPTIONS(key 'true'),
PAY_TIME timestamp NOT NULL,
APPID int2 NOT NULL,
QN varchar(20) NOT NULL,
ACCOUNTID varchar(64) NOT NULL,
AMOUNT decimal(6,2),
ORDER_NO text NOT NULL,
CP_ORDER_NO text
) server oradb OPTIONS (schema 'ADSAS', table 'TBL_GAME_PAY_LOG');

注意的是:

  • 其中schemaname,tablename;需要大写
  • 需要指定在postgres9.3版本以后oracle_fdw支持对外部表的 Insert ,delete ,update ;增加表操作项 options(key 'true') (当值设置为 true|on|yes 表示不可以做增删改操作)

四、限制

1、不支持直接 insert ... select

adsas=> insert into fdw_game_pay_log select * from tbl_game_pay_log;
ERROR: error executing query: OCIStmtExecute failed to execute remote query
DETAIL: ORA-08177: can't serialize access for this transaction

这是远程oracle默认的事务隔离级别是repeatable read;不支持“can't serialize access for this transaction”

解决方法:将语句添加到事务中

adsas=> begin;
BEGIN
adsas=> insert into fdw_game_pay_log select * from tbl_game_pay_log;
INSERT 0 1
adsas=> end;
COMMIT

五、同步脚本

CREATE OR REPLACE PROCEDURE "easou"."P_SYNC_TABLE_DATA" ()
AS $BODY$
/***********************************************************
将表tbl_game_pay_log增量复制到fdw_game_pay_log;
达到PG-Oracle数据增量同步
***********************************************************/
DECLARE
vn_old_id int8;
vn_new_id int8;
BEGIN
BGEIN
-- 获取上次提取的id
SELECT
lid INTO vn_old_id
FROM
easou.tbl_sync_record
WHERE
tbl_name = 'tbl_game_pay_log';
-- 截取本次提取的最大id
SELECT
COALESCE(max(id), 0) INTO vn_new_id
FROM
easou.tbl_game_pay_log;
-- 将本次提取的记录插入外部表
INSERT INTO easou.fdw_game_pay_log (id, PAY_TIME, APPID, QN, ACCOUNTID, AMOUNT, ORDER_NO, CP_ORDER_NO)
SELECT
id,
PAY_TIME,
APPID,
QN,
ACCOUNTID,
AMOUNT,
ORDER_NO,
CP_ORDER_NO
FROM
easou.tbl_game_pay_log
WHERE
id > vn_old_id;
-- 更新本次提取的id
UPDATE
easou.tbl_sync_record
SET
lid = vn_new_id
WHERE
tbl_name = 'tbl_game_pay_log';
END;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO tbl_error_log (error_time, error_desc, proc_name, deal_status)
VALUES (now()::timestamp, SQLERRM, 'P_SYNC_TABLE_DATA', 0);
END; $BODY$
LANGUAGE plpgsql

最后通过使用pg_cron或者go_cron添加一个任务。就可以完成准实时的增量同步

PG TO Oracle 增量同步-外部表的更多相关文章

  1. 实现从Oracle增量同步数据到GreenPlum

    简介: GreenPlum是一个基于PostgreSQL数据库开发的MPP架构的数据库仓库,适用于OLAP系统,支持50PB(1PB=1000TB)级海量数据的存储和处理. 背景: 目前有一个业务是需 ...

  2. Oracle外部表详解(转载)

    (外部表创建主要注意创建目录访问权限问题.目录路径格式无空格等不相关字符,即必须是当前表访问用户可以访问:关于表中行数的限制问题,如果不加限制注意添加reject limit unlimited:表中 ...

  3. Oracle 之 外部表

    一.外部表概述 外部表只能在Oracle 9i 之后来使用.简单地说,外部表,是指不存在于数据库中的表. 通过向Oracle 提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数 据库表 ...

  4. Oracle外部表详解

    外部表概述 外部表只能在Oracle 9i之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数 ...

  5. postgres外部表如何修改源码适配pg升级

    postgres中外部表的应用如下: 但是许多在github上的fdw开源代码都是基于9.3以及9.4版本开发,原作者没有随着pg的版本升级而将外部表扩展升级,那只能靠自己去手动修改源码来让这些扩展能 ...

  6. 几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484377&idx=1&sn=199bc88 ...

  7. 管理外部表(External Tables)

    Oracle数据库允许对外部表中的数据进行只读访问.外部表定义为不驻留在数据库中的表,并且可以是为其提供访问驱动程序的任何格式.通过为数据库提供描述外部表的元数据,数据库能够公开外部表中的数据,就好像 ...

  8. Oracle数据加载之外部表的介绍

    环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 目录: 一. 创建外部表 1.1 创建外部表需要的目录 1.2 创建外部表 1.3 创建外部表源文件 1.4 查询外部表 二. 加载 ...

  9. Oracle的外部表

    一.外部表特性 数据文件位于操作系统之外,并且具有一定的格式分割的文本文件或其他类型文件.ORACLE的外部表通过SQL的形式访问数据文件中的数据,数据并不需要加载到数据库中且数据是可读的,所以不用D ...

随机推荐

  1. java NIO理解分析与基本使用

    我前段时间的一篇博客java网络编程--多线程数据收发并行总结了服务端与客户端之间的收发并行实践.原理很简单,就是针对单一客户端,服务端起两个线程分别负责read和write操作,然后线程保持阻塞等待 ...

  2. vue-父组件传递参数到子组件

    案例: 父组件 <template> <div id="app"> <h1>vuex</h1> <h3>count:{{ ...

  3. 解决 node-sass 安装失败

    在项目下新建.npmrc文件内容如下: sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ phantomjs_cdnurl=http ...

  4. 数据挖掘 决策树 Decision tree

    数据挖掘-决策树 Decision tree 目录 数据挖掘-决策树 Decision tree 1. 决策树概述 1.1 决策树介绍 1.1.1 决策树定义 1.1.2 本质 1.1.3 决策树的组 ...

  5. .NET Core项目部署到Linux(Centos7)(三)创建.NET Core API项目

    目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...

  6. 面试刷题37:微服务是什么?springcloud,springboot是什么?

    面试中被问到为什么要使用微服务架构?springcloud的核心组件有哪些? 拿我们国家的兵种来说,如何把战争这个单体架构微服务化,就是根据适用的场景,拆分出不同的兵种(微服务) 然后每个兵种之间通过 ...

  7. 世界疫情app柱形图显示

    访问云服务器的mysql实现数据的获取.最后通过柱形图的形式将数据显示在页面上: 遇到的主要困难时对于云服务器的mysql连接本地的navicat之间事情,最后通过网上的各种解决办法完成了相关的内容. ...

  8. javascript 入门 之 bootstrap 第一个程序

    <table data-toggle="table"> <thead> <tr> <th>Item ID</th> &l ...

  9. python3中的nonlocal 与 global

    nonlocal 与 global nonlocal翻译是非本地,global翻译是全局,它们都是python3的新特性.如果以类C语言的思维去看这2个关键字,很可能觉得它们差不多.但实际上它们很不一 ...

  10. 计算机网络-CSMA/CD

    假定1km长的CSMA/CD网络的传输速率为1Gbit/s.设信号在网络上的传播速率为200000km/s,则能够使用此协议的最短帧长是? 答案:2×104bit/s 解析:C=2×105km/s,即 ...