背景

  最近在负责公司数据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. iOS hash

    一.iOS hash 下图列出 Hash 在 iOS 中的应用分析整理 知乎上的一句话: 算法.数据结构.通信协议.文件系统.驱动等,虽然自己不写那些东西,但是了解其原理对于排错.优化自己的代码有很大 ...

  2. iOS 构建动态库

    一.构建步骤 创建一个动态库 MyDynamicFramework 创建一个测试类 在 MyDynamicFramework.h(默认生成,可统一暴露头文件) 中 #import "Pers ...

  3. 曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java一样的效果

    概要 最近写了spring系列,这个系列还在进行中,然后有些同学开始叫我大神,然后以为我各方面都比较厉害,当然了,我是有自知之明的,大佬大神什么的,当作一个称呼就好,如果真的以为自己就是大神,那可能就 ...

  4. Codeforces Round #629 (Div. 3)

    A. Divisibility Problem time limit per test 1 second memory limit per test 256 megabytes input stand ...

  5. Java构造方法的姿势与易错点

    <Java基础复习>-类与对象&初始化 关于类和对象的基本理念,就不再赘述(如果你学习过还忘了,就是一种特殊的本领了),没有学习过的可以去搜索一下OOP或者类和对象,百科的知识就已 ...

  6. jmeter术语

    1.负载:模拟业务请求操作对服务器造成压力的过程 2.性能测试(performance testing):模拟用户负载来测试系统在负载情况下,系统的响应时间.吞吐量等指标是否满足性能要求 3.负载测试 ...

  7. PTA数据结构与算法题目集(中文) 7-24

    PTA数据结构与算法题目集(中文)  7-24 7-24 树种统计 (25 分)   随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树 ...

  8. C9K Stackwise Virtual(一)

    一.SV技术基本说明 思科Catalyst9K平台的Stackwise Virtual技术是将两个物理的交换机虚拟成一个逻辑的实体(从网络控制层面和管理的角度来看),这两个交换机合二为一之后,将共享相 ...

  9. Kylin 新定位:分析型数据仓库

    亲爱的各位社区朋友: Apache Kylin 在 2014 年 10 月开源并加入 Apache 软件基金会的孵化器,一年后从孵化器毕业成为 Apache 顶级项目.从第一天起,Kylin 的标语是 ...

  10. golang--安装golang并安装grpc-grpcgateway环境

    安装goland环境 下载golang安装包,国内环境打开https://studygolang.com/dl,国外环境打开https://golang.google.cn/dl/下载对应系统的安装包 ...