a foolish sync method about sync data from PostgreSQL to Oracle

使用以下脚步从PostgreSQL同步到Oracle的数据不一致。

 原因分析在后面

#!/bin/bash

. /home/enterprisedb/.bash_profile
EMAIL="noc@xxx.com dba@xxx.com"

# check running mark
test -f /home/enterprisedb/script/run/tbl_charge_xxxx.run
if [ $? -eq 0 ]; then
SYNC_TIME_CHECK="'`ls -1 -l --time-style=+%F\ %T /home/enterprisedb/script/run/tbl_charge_xxxx.run|awk '{print $6" "$7}'`'"
psql -t -h /tmp -p 1921 -U enterprisedb -d edb <<EOF 1>/home/enterprisedb/script/tbl_charge_xxxx.timeoutstats 2>&1
select 'sync_time_out' where now()-$SYNC_TIME_CHECK::timestamp without time zone>interval '1 hour';
EOF
TIME_OUT_ERROR=0
TIME_OUT_ERROR=`grep -c "sync_time_out" /home/enterprisedb/script/tbl_charge_xxxx.timeoutstats`
if [ $TIME_OUT_ERROR -ne 0 ]; then
echo -e "`cat /home/enterprisedb/script/tbl_charge_xxxx.timeoutstats`\n\n`date +%F%T`\n sync xxxx xltj.msss.sa_sales_info_xxxx timeout!\n\nPlease Call Digoal!\n"|mutt -s "Sync xxxx XLTJ timeout!" $EMAIL
echo -e "sync timeout"
fi
exit 3
fi

# create running mark
touch /home/enterprisedb/script/run/tbl_charge_xxxx.run

MAX_T="'`psql -t -h /tmp -p 1921 -U enterprisedb -d edb -c "select max(id) from msss.tbl_charge_xxxx_recent@edb.xl_local"|sed -e 's/ //g'`'"
echo $MAX_T

psql -t -h /tmp -p 1921 -U enterprisedb -d edb <<EOF 1>/home/enterprisedb/script/tbl_charge_xxxx.stats 2>&1
begin;
select 'start sync: '||now();
delete from msss.tbl_charge_xxxx_recent@edb.xl_local
where
id < $MAX_T ;

insert into msss.tbl_charge_xxxx_recent@edb.xl_local
(id,mobile,xxxxxx,xxxx,mobi_factory,mobi_mode,hsv,org_id,ver,send_date,create_date,MODEVER,BUILDTIME)
select id,trim(coalesce(phonenum,'nvl')),trim(xxxxxx),trim(xxxx),trim(coalesce(hsman,'nvl')),trim(coalesce(hstype,'nvl')),to_number(hsversion,'99999999999999999999'),trim(hsman),to_number(appversion,'99999999999999999999'),to_char(motime,'yyyymmddhh24miss'),to_char(createtime,'yyyymmddhh24miss'),trim(coalesce(SOFTVERSION,'nvl')),trim(coalesce(SOFTCOMPILETIME,'nvl'))
from xxxx.tbl_charge_xxxx@edb.xxxx_pg
where
id > ${MAX_T}
and appid=810007
;

insert into msss.SA_SALES_INFO_xxxx@edb.xl_local
(id,mobile,xxxxxx,xxxx,mobi_factory,mobi_mode,hsv,org_id,ver,mccid,MODEVER,BUILDTIME)
select
id,coalesce(mobile,'nvl'),xxxxxx,xxxx,coalesce(mobi_factory,'nvl'),coalesce(mobi_mode,'nvl'),hsv,org_id,ver,case substring(xxxx,1,3) when ('234','235') then '234' when ('310','311','312','313','314','315','316') then '310' when ('430','431') then '430' when ('440','441') then '440' when ('460','461') then '460' else substring(xxxx,1,3) end,MODEVER,BUILDTIME
from msss.tbl_charge_xxxx_recent@edb.xl_local
where
id > ${MAX_T} ;
commit;
EOF

# logging
cat /home/enterprisedb/script/tbl_charge_xxxx.stats >> /home/enterprisedb/script/tbl_charge_xxxx.log

# delete running mark
sleep 10
rm -f /home/enterprisedb/script/run/tbl_charge_xxxx.run

ERROR=0
ERROR=`grep -c "ROLLBACK" /home/enterprisedb/script/tbl_charge_xxxx.stats`
if [ $ERROR -ne 0 ]; then
echo -e "`cat /home/enterprisedb/script/tbl_charge_xxxx.stats`\n\n`date +%F%T`\n sync xxxx xltj error!\n\nPlease Call Digoal!\n"|mutt -s "Sync xxxx XLTJ error!" $EMAIL
echo -e "sync error"
fi

逻辑大概是这样的:

根据PostgreSQL里面需要同步的表的PK,增量同步数据到Oracle。

看起来很美好,增量的,健康的。

问题就出在增量这里。如果系统中只有一个SESSION对这个表操作时,ID确实是随着时间递增的。

但是当有多个SESSION同时操作一个表时,SEQUENCE分配给多个SESSION,但是SESSION的COMMIT顺序可能与SEQUENCE的分配顺序不一致。从而抽取数据时会出现空隙的现象。

例如,有两个SESSION

session 1 获取到得SEQID是1-10

session 2 获取到得SEQID是11-20

session 2先提交,在session 1提交之前,数据同步到ORACLE了。

接下来同步取id>20的数据,因此1-10的数据就漏掉了。

另外,使用记录创建时间来抽取也存在类似问题,因为记录创建时间是事务的启动时间,不是提交时间。

时间: 2025-01-31 06:04:20

a foolish sync method about sync data from PostgreSQL to Oracle的相关文章

Replica small data to PostgreSQL from Oracle&#039;s Big table

有时候会遇到从Oracle同步数据到PostgreSQL数据库的需求, 当Oracle那边的表是大表的时候,  即使同步到PostgreSQL的数据量很小也可能很慢. 原因可能是 1. Oracle那边的执行计划可能不优. 比如走全表扫描了. 或者走的索引不对.  2. 条件没有正确的转换给Oracle, 那就惨了, 数据全部取过来然后在PostgreSQL中过滤. 例如我们需要同步的是前一天的数据, 实际上走分区的全表扫描可能比走索引快. 但是又不好写HINT. 那么怎么来解决这种问题呢? 来

Blockdump - 8.x Data Segment Header in Oracle

oracle Subject: QREF: Blockdump - 8.x Data Segment Header in Oracle Creation Date: 25-APR-2000 CACHE BLOCK:See Note: 47132.1 type: 0x10=DATA SEGMENT HEADER - UNLIMITEDEXTENT CONTROL: Extent Header:: spare1: 0 space2: 0 #extents: 13 #blocks: 1429 last

[example]Sync data from PostgreSQL database to another PostgreSQL database

利用EDB的database link实现从PostgreSQL到PostgreSQL的数据同步.源数据是持续插入,无更新操作的记录.将create_time作为同步标记.并且需要定期清除同步来的历史数据. Source Database : PostgreSQLDestination Database : PostgreSQLSync Database : EnterpriseDB SD_table :                                       Table "

C# VS2010中,用微软自带的System.Data.OracleClient来连接Oracle数据库

由于微软在.Net框架4.0中已经决定撤销使用System.Data.OracleClient,造成在VS2010中无法连接Oracle数据库,但它还依旧存在于.Net架构中,我们可以通过自己引用  C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.OracleClient.dll 来获得对Oracle数据库的支持. 方法: 1.在VS2010中打开[解决方案管理器]--右击[引用]--[添加引用]   2.选择[浏览]找到"C:

migrate Data From PostgreSQL to mongoDB using PG&#039;s copy AND mongoimport

最近有个项目启用了mongoDB主要用作查询缓存.需要将部分PostgreSQL中的数据导入到mongoDB中,写程序来处理的话确实是比较烦.对应格式如下:  还好mongoDB有一个比较好的工具mongoimport可以导入格式csv , tsc , json 等格式的文件. 1. 使用csv格式导入,这里遇到了数据类型的问题,比如某字段需要导入为string类型,进去变成了数值类型.(这里的话应该是可以搞的,暂时没找到好的办法)首先从PostgreSQL导出到文件,由于"createTime

[20161228]奇怪log file sync等待事件.txt

[20161228]奇怪log file sync等待事件.txt --这个来自链接:http://www.itpub.net/thread-2073857-1-1.html的讨论,很奇怪的问题: Top 10 Foreground Events by Total Wait Time Event                                              Waits    Total Wait Time (sec)    Wait Avg(ms)    % DB t

Golang中的sync.WaitGroup用法实例_Golang

WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成. 官方对它的说明如下: A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and

AndroidStudio 使用过程中出现的异常(Gradle sync failed)处理办法_Android

AndroidStudio使用过程中出现的异常 异常信息: Gradle sync failed: Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer to the user guide chapter on th

微软与福特汽车推普通话车载系统SYNC

微软与福特日前联合宣布,将推出车载系统SYNC中文普通话版,新系统将在本周的亚洲通信展亮相.自从2007年首次发布福特SYNC以来,该系统已经搭载了超过500万辆汽车.在接下来几年,到2015年左右的两三年时间,微软预计会有另外900万部车会运行SYNC系统.      SYNC和后装的简单导航仪不同,这是微软嵌入式操作系统Windows Embedded开发的主要产品之一.它的功能也在结合云和端的链接,通过云端的海量信息给用户一个智能的运算结果.     这次是SYNC正式进入中国市场,而与