Oracle数据库之间数据同步

源库(ENV库)中定义如下包:

包定义如下:

CREATE OR REPLACE PACKAGE PKG_DATA_REPORT IS

— Author : JOHNFNASH
— Created : 2017/6/8 17:48:03
— Purpose : DATA REPORT TO YW

–数据同步存储过程
PROCEDURE SP_DATA_RESPORT;

–数据增量同步存储过程
PROCEDURE SP_DATA_INCREMENTAL_REPORT;

END PKG_DATA_REPORT;
包具体实现如下:

CREATE OR REPLACE PACKAGE BODY PKG_DATA_REPORT IS

–数据同步存储过程
PROCEDURE SP_DATA_RESPORT IS

NODE_NAME VARCHAR(40) := ‘BASIC_DATA_SYNC’;
V_START_TIME DATE;
V_END_TIME DATE := SYSDATE;
DATA_ROW T_DATA_SYNC_RECORD%ROWTYPE;
V_ERRORTEXT VARCHAR(200);

BEGIN
–锁住记录防止并发上报
SELECT *
INTO DATA_ROW
FROM T_DATA_SYNC_RECORD R
WHERE R.DATA_SYNC_NAME = NODE_NAME
AND R.NUM = 1
FOR UPDATE;

IF DATA_ROW.RESULT IS NULL THEN
–如果上一次数据同步成功,则开始本次数据同步
V_START_TIME := DATA_ROW.END_TIME;
ELSE
–如果上一次数据同步失败,则继续上一次数据同步
V_START_TIME := DATA_ROW.START_TIME;
V_END_TIME := DATA_ROW.END_TIME;
END IF;

——————- 部门数据同步 ——————-
–删除之前的记录
PROC_TRUNCATE_REMOTE_TAB@DBL_YW(‘T_DEPARTMENT’);
–DELETE FROM T_DEPARTMENT@DBL_YW;
–重新写入记录
INSERT INTO T_DEPARTMENT@DBL_YW
SELECT D.ID,
D.NAMECN,
D.NAMEEN,
D.CODE,
D.PARENTID,
D.NAMENPATH,
D.NAMCNPATH
FROM T_DEPARTMENT D;

——————- 设备数据同步 ——————-
–写入记录
MERGE INTO T_DEVICE@DBL_LCMYW T1
USING (SELECT * FROM T_DEVICE) T2
ON ( T1.ID=T2.ID)
WHEN MATCHED THEN
UPDATE SET T1.STATUS = T2.STATUS, T1.TIMESTAMEP=T2.TIMESTAMEP
WHEN NOT MATCHED THEN
INSERT (ID, NAME, LABID, REGION, STATUS, CREATETIME, TIMESTAMEP, CREATOR)
VALUES(T2.ID,T2.NAME,T2.LABID,T2.REGION,T2.STATUS,T2.CREATETIME,T2.TIMESTAMEP,T2.CREATOR);
–写入本次数据同步结果
INSERT INTO T_DATA_SYNC_RECORD
VALUES
(NODE_NAME, SYSDATE, V_START_TIME, V_END_TIME, NULL, 0);
–执行序号加1
UPDATE T_DATA_SYNC_RECORD
SET NUM = NUM + 1
WHERE DATA_SYNC_NAME = NODE_NAME;

COMMIT;

EXCEPTION
WHEN OTHERS THEN
ROLLBACK; –事物回滚

V_ERRORTEXT := SUBSTR(SQLERRM, 1, 200); –错误信息
–写入本次数据同步结果
INSERT INTO T_DATA_SYNC_RECORD
VALUES
(NODE_NAME, SYSDATE, V_START_TIME, V_END_TIME, V_ERRORTEXT, 0);
–执行序号加1
UPDATE T_DATA_SYNC_RECORD
SET NUM = NUM + 1
WHERE DATA_SYNC_NAME = NODE_NAME;

COMMIT;
END;
END SP_ENV_OPY_REPORT;

END PKG_DATA_REPORT

其中涉及到的目标库(YW库) truncate表的存储过程 PROC_TRUNCATE_REMOTE_TAB@DBL_YW 定义如下:

CREATE OR REPLACE PROCEDURE PROC_TRUNCATE_REMOTE_TAB(P_TNAME IN VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE ‘TRUNCATE TABLE ‘ || P_TNAME;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, SQLERRM);
END PROC_TRUNCATE_REMOTE_TAB;
由于表中数据量较大时,使用delete删除数据比较慢,使用truncate操作更快,但是oracle不允许执行远程库

的truncate。换个方式,在远程库建立存储过程,执行对该库中数据表的truncate操作,其它库建立dblink之后

,可以调用该存储过程,实现对远程库表的truncate操作。
下面对上面的比较关键的地方进行说明:
1) T_DATA_SYSNC_RECORD
刚进入存储过程时,锁住该表的记录,防止并发上报;然后根据上一次的执行结果确定本次执行的起始时间

、结束时间,特别是对于增量同步,每次只将时间段内的数据同步到目标库

(详见SP_DATA_INCREMENTAL_REPORT存储过程)

表的定义如下:
— Create table

create table T_DATA_SYNC_RECORD
(
data_sync_name VARCHAR2(40) not null,
timestamp DATE,
start_time DATE,
end_time DATE,
result VARCHAR2(200),
num NUMBER
);
— Add comments to the columns
comment on column T_DATA_SYNC_RECORD.data_sync_name
is ‘数据同步任务名称’;
comment on column T_DATA_SYNC_RECORD.timestamp
is ‘任务执行时间’;
comment on column T_DATA_SYNC_RECORD.start_time
is ‘数据同步开始时间’;
comment on column T_DATA_SYNC_RECORD.end_time
is ‘数据同步结束时间’;
comment on column T_DATA_SYNC_RECORD.result
is ‘数据同步执行结果,为空表示成功’;
comment on column T_DATA_SYNC_RECORD.num
is ‘序号,从1开始,每执行一次之前同一同步任务的序号加1’;
2) 源库中需建立与目标库的dblink
Create database link create database link DBL_YW connect to YW

identified by password

using ‘ILCM’;
3) 数据同步的形式
根据业务的不同,同步的方式可能有好几种,如删除目标库之前所有数据,重新写入(如果只是少量字段

的值可能有修改,可以使用merge into进行数据同步,如上);增量同步,每次只同步新增的记录到目标库

(适用于历史数据只读的情况)

4) 当有多个库的数据要汇总到同一个目标库时,可以在数据库添加一个表示来源于哪个节点的字段,每个库

的同步存储过程为这个字段设置不同的值,就可以区分数据是来源于哪个数据库。不过这种情况下,直接对

目标库进行truncate操作就不合适了,因为可能会导致数据丢失。这种情况怎么处理,这里就不叙述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、脚本运行环境python3.6 2、脚本忽略LOB字段数据 3、脚本生成以^为分割符的csv格式文件 4、脚本避免转义字符将‘\’替换为‘/’,数据中存在分割符:^转换为# 5、特殊字符处理:删除:'\u0000','"',oracle数据回车符:'\r','\n' 6、支持按分区导入 7、支持内存处理数据导入greenplum,导入失败生成csv格式文件,方便排错 8、支持生成csv格式文件导入greenplum。 9、传递不同配置文件,多次执行达到并行处理(注意内存溢出) 例: 执行脚本 生成日志目录 配置文件 python3 Main_Mem.py ProcessLog1 config1.ini & python3 Main_Mem.py ProcessLog2 config2.ini & python3 Main_Mem.py ProcessLog3 config3.ini & python3 Main_Mem.py ProcessLog4 config4.ini & 10、采用python 中的copy_from方法实现导入greenplum 11、各目录用途: conf :存放配置文件 etl_dat: 存放导出数据 log :存放输出日志 py_tool 存放编写工具脚本: DBconn: 数据库连接池配置及查询返回方法 DumpCsv:导出csv文件方法 Log:日志输出方法 DataBase:判断表是否存在、表或分区表是否有数据、是否为分区表、数据导出、表分区遍历、指定分区表导出等方法 py_main:主程序目录: Main_Mem.py:主程序目录: 运行:python3 Main_Mem.py ProcessLog1 config.ini 12、主程序需要修改目录参数: if __name__ == '__main__': #引用编写的包 sys.path.append('/home/oracle/PyETL2.0/py_tool') import Log,DataBase,DumpCsv #输出日志路径: path = '/home/oracle/PyETL2.0/log/'+sys.argv[1] isExists = os.path.exists(path) if not isExists: os.makedirs(path) #shutil.move(path,path+) logger = Log.log(path) #读取配置文件 config = Confile('/home/oracle/PyETL2.0/conf/', sys.argv[2]) 13、后期还会更新,欢迎提供宝贵意见。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值