linux 环境 crontab+shell+sqlplus 调用oracle 存储过程实现数据同步

需求背景:与第三方厂商合作使用sql_loadv1.0进行数据加载,他们负责推数,我拉数。

执行流程:
1.ODS推数--------》sftp服务器
2.拉数--------》sftp服务器
3.将数据文件解析到临时表中
4.将临时表中的数据通过【存储过程】同步到目标表模型中
5.待全部加载同步完成后,进行逻辑SQL处理

目前情况:
每张表是并行执行的,无法判断哪张表会最后执行,但是每张表执行完成后,会在加载日志表中生成一条成功的记录。

文章目录

          • 一、设计总思路
            • 1.1. 总流程设计原则
            • 1.2. 方案选取
            • 1.3. 评估方案利弊及影响范围
            • 1.4. 总流程概要设计
            • 1.5. 存储过程概要设计
          • 二、监听和shell脚本
            • 2.1. 添加监听串
            • 2.2. 编写配置文件
            • 2.3. 编写存储过程
            • 2.4. 编写脚本
            • 2.5. 编写sql文件
            • 2.6. 手动执行脚本
          • 三、表设计
            • 3.1. 加载日志表
            • 3.2. 数据同步日志表
          • 四、存储过程
            • 4.1. 存储过程实现流程
            • 4.2. 存储过程案例
          • 五、定时调度
            • 5.1. 编辑定时文件
            • 5.2. 配置执行频次
            • 5.3.重新加载cron服务
            • 5.4. 查看当前用户下的定时任务列表
            • 5.5. 监控是否执行

一、设计总思路

声明:此逻辑SQL处理一天执行一次,每次同步需要清除数据

1.1. 总流程设计原则
定时启动,轮训调度
场景判断,分支流转
日志记录,进度追踪
容错机制,实时定位
1.2. 方案选取

第一种方案:
首先,和厂商交流分析每天数据同步的数据量有多少,最多能达到多少,最长数据加载的时长。
然后评估一下执行逻辑SQL有没有时间限制,比如说上午10点之前必须同步处理完成。
最后,评估一下影响范围。

假设,数据加载开始时间为凌晨6点,最大1000000数据量,最长时长为1小时,执行逻辑SQL需要1小时,在上午10点之前执行完成,那么我们可以写一个定时任务一天执行一次,上午8点定时调用逻辑SQL。

第二种方案:
定时轮训,以当前日期为条件查询加载日志表的数据量,当满足条件时,在查询日志表是否已经执行过,因此,执行之前要有轨迹记录,方便进度追踪,执行执行逻辑SQL完毕后,更新日志表。

1.3. 评估方案利弊及影响范围

第一种方案分析:
正常场景可以满足,但是,如果遇到时间超长简言之,超过了评估的时间范围,就会在数据加载尚未完成之前,提前执行逻辑SQL导致生成错误数据,后期要进行数据治理。

第二种方案分析(推荐使用):
定时轮训调度,为了在数据加载之后,再进行逻辑SQL处理,确保优先级,不会漏批
轨迹记录和轨迹更新是为了进度追踪
分支判断为了满足场景的条件
容错机制处理,为了快速解决问题

1.4. 总流程概要设计
已知,每张表执行完成后会在load_pl_log生成一条成功的记录,假设有4张表,数据加载完成后,在load_pl_log日志表就会生成4条为当前日期的记录。
1.以当前日志为条件查询load_pl_log表的总条数是否为4
2.场景分支,走向流转1》满足总条数为4时,执行下一步处理2》当不满足总条数为4时,执行跳过下一步处理,直接结束
3.根据已知,逻辑SQL处理一天只执行一次,因此,需要创建一张SYNC_FINISH_LOG同步轨迹表记录是否执行过1》如果执行过,就跳过逻辑SQL处理,直接结束。2》当尚未执行过2.1》日志记录2.2》清除数据2.3》逻辑SQ流处理2.4》轨迹更新2.5》容错处理  
1.5. 存储过程概要设计
1.判断什么时间跑存储过程?标志是什么?
2.判断跑步跑的?
3.执行存储工程之前要先落库留存轨迹,方便进度跟踪
4.执行逻辑SQL
5.完成之后,更新轨迹表
6.在执行过程中出现异常,要有容错机制处理
二、监听和shell脚本
2.1. 添加监听串
# 进入oracle客户端监听串的目录
cd /app/oracle/product/11.2.0/db_1/network/admin/samples
# 编辑监听文件
vim tnsnames.ora# 添加监听串
xxx_dev=
(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 数据库ip地址)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = xxx))
)
2.2. 编写配置文件

创建sync_db_conn.unl连接数据库配置文件

# 格式:用户名|密码|连接串
username|password|xxx_dev
2.3. 编写存储过程

下面会详细介绍

2.4. 编写脚本
vim data_sync.sh
#!bin/bash
line=`cat ./sync_db_conn.unl`
DBUSER=`echo $line|awk -F "|" '{print $1}'`
PASSWORD=`echo $line|awk -F "|" '{print $2}'`
DSN=`echo $line|awk -F "|" '{print $3}'`
echo "starting..."
sqlplus  $DBUSER/$PASSWORD@$DSN @/home/oracle/shell_sync/sql/sync_data.sql<<EOF
EOF
echo "end..."
2.5. 编写sql文件

sync_data.sql

# 存储过程名称
call C_C_G_CP();
2.6. 手动执行脚本
sh data_sync.sh
三、表设计
3.1. 加载日志表

LOAD_PL_LOG 记录成功轨迹
LOAD_PL_ERROR_LOG 记录异常轨迹

CREATE TABLE LOAD_PL_LOG
(s_procname VARCHAR2(64),s_time     DATE not null,s_msg      VARCHAR2(4000),s_user     VARCHAR2(64)
);
CREATE TABLE LOAD_PL_ERROR_LOG
(S_PROCNAME VARCHAR2(64),S_TIME     DATE NOT NULL,S_MSG      VARCHAR2(4000),S_USER     VARCHAR2(64)
);
3.2. 数据同步日志表

SYNC_FINISH_LOG记录成功轨迹
SYNC_FINISH_ERROR_LOG 记录异常轨迹

DROP TABLE SYNC_FINISH_LOG;
CREATE TABLE SYNC_FINISH_LOG
(
PROCNAME VARCHAR2(64),START_DATE     DATE,END_DATE       DATE,SYNC_FLAG     NUMBER(1),SYNC_MSG      VARCHAR2(4000),PRIMARY KEY(PROCNAME,START_DATE)
);DROP TABLE SYNC_FINISH_ERROR_LOG;
CREATE TABLE SYNC_FINISH_ERROR_LOG
(S_PROCNAME VARCHAR2(64),S_TIME     DATE not null,S_MSG      VARCHAR2(4000),S_USER     VARCHAR2(64)
);
四、存储过程
4.1. 存储过程实现流程
1.判断什么时间跑存储过程?标志是什么?
2.判断跑步跑的?
3.执行存储工程之前要先落库留存轨迹,方便进度跟踪
4.执行逻辑SQL
5.完成之后,更新轨迹表
6.在执行过程中出现异常,要有容错机制处理
4.2. 存储过程案例
DROP PROCEDURE PERSONP ;
CREATE OR REPLACE PROCEDURE PERSONP as
v_backtrace            varchar2(1000);       --返回错误行
v_error_cont           varchar2(1000);       --整合错误内容
sync_finish_flag       number(2);            --是否开启同步标识
SYNC_MARK              number(2);
BEGINSELECT count(1) into sync_finish_flagFROM load_pl_logwhere to_date(to_char(S_TIME, 'YYYY-MM-DD'), 'YYYY-MM-DD') =to_date(to_char(sysdate, 'YYYY-MM-DD'), 'YYYY-MM-DD') and s_msg='success';if  sync_finish_flag  = 4thenDBMS_OUTPUT.PUT_LINE('这是第1层的if');SELECT count(1) into SYNC_MARK  FROM SYNC_FINISH_LOG sl where to_date(to_char(sl.END_DATE, 'YYYY-MM-DD'), 'YYYY-MM-DD') = to_date(to_char(sysdate, 'YYYY-MM-DD'), 'YYYY-MM-DD') ;if (SYNC_MARK = 0)thenDBMS_OUTPUT.PUT_LINE('这是第2层的if');insert into SYNC_FINISH_LOG sfb  (PROCNAME, START_DATE, END_DATE, SYNC_FLAG,SYNC_MSG) values('PERSONP',sysdate,'','0','数据同步中');commit;delete from PERSONP;commit;insert into PERSONP (select * from  PERSONP2);commit;UPDATE SYNC_FINISH_LOG f SET f.END_DATE = SYSDATE,f.SYNC_FLAG = '1',f.SYNC_MSG = '同步完成' WHERE 1 = 1 AND to_date(to_char(f.START_DATE, 'YYYY-MM-DD'), 'YYYY-MM-DD') = to_date(to_char(sysdate, 'yyyy/mm/dd'), 'yyyy/mm/dd') AND PROCNAME='EXPORT_LOAN_INFOP';COMMIT;end if;end if; 
--异常错误记录处理
exceptionwhen others thenv_backtrace:=dbms_utility.format_error_backtrace;--回滚未提交部分rollback;v_error_cont:='异常错误为:'||sqlerrm||'--'||sqlcode||'--'||v_backtrace;insert into SYNC_FINISH_ERROR_LOG values('PERSONP',sysdate,v_error_cont,user);commit;
end  PERSONP;
/
五、定时调度
5.1. 编辑定时文件
crontab -e
5.2. 配置执行频次
*/30 * * * *  /bin/sh /home/oracle/shell_sync/data_sync.sh

保存,退出

5.3.重新加载cron服务
/sbin/service crond restart
5.4. 查看当前用户下的定时任务列表
crontab -l
5.5. 监控是否执行

1》可以借助根据日志查看
2》可以借助plsql工具查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM-SANDBOX:从阿里精准测试走出的开源贡献奖

阿里妹导读&#xff1a;稳定性是历年双11的技术质量保障核心。从 2016 年开始淘宝技术质量部潜心修行&#xff0c;创新地研发了一套实时无侵入的字节码增强框架&#xff0c;于是「JVM-SANDBOX」诞生了&#xff0c;并且顺手在 MTSC 大会上拿了开源贡献奖&#xff0c;今天&#x…

EMR Spark Runtime Filter性能优化

背景 Join是一个非常耗费资源耗费时间的操作&#xff0c;特别是数据量很大的情况下。一般流程上会涉及底层表的扫描/shuffle/Join等过程, 如果我们能够尽可能的在靠近源头上减少参与计算的数据&#xff0c;一方面可以提高查询性能&#xff0c;另一方面也可以减少资源的消耗(网…

集齐最后一块拼图,全栈Serverless时代正式开启

近日腾讯云正式发布国内首个Serverless数据库新品——PostgreSQL for Serverless。相比普通云上数据库&#xff0c;该数据库能够最快1秒完成部署&#xff0c;成本降低70%。这款新型数据库将为数百万开发者带来更灵活的业务开发模式、更快捷的上云体验&#xff0c;以及更大空间的…

Java-所有类型的Class对象

public class Test04 {public static void main(String[] args) {Class c1 Object.class; // 类Class c2 Comparable.class; // 接口Class c3 String[].class; // 一位数组Class c4 int[][].class; // 二维数组Class c5 Override.class; // 注解Class c6 ElementType.cla…

oracle 数据库_操作事项_05

文章目录1. 目标表2. 临时表3. 日志表4. 配置表5. 用户查询6. 配置数据声明&#xff1a;请使用oralce用户登录plsq操作 1. 目标表 与ODS&#xff08;数据仓库&#xff09;约定的表模型&#xff0c;把表结构在数据进行初始化 2. 临时表 把目标表复制一份&#xff0c;将表名统…

分布式服务架构下的混沌工程实践

本文来自阿里巴巴高可用架构团队高级开发工程师肖长军&#xff08;花名穹谷&#xff09;在 GIAC&#xff08;全球互联网架构大会&#xff09;上的分享&#xff0c;包含三部分内容&#xff1a;&#xff08;阿里巴巴中间件公众号对话框发送“混沌工程”&#xff0c;获取分享PPT&a…

甲骨文提供免费HR工具,助力客户保障员工安全

为了帮助抗击疫情&#xff0c;甲骨文将为现有Oracle人力资本管理云&#xff08;Oracle HCM Cloud&#xff09;客户免费提供员工健康和安全&#xff08;Workforce Health and Safety&#xff09;解决方案&#xff0c;帮助客户管理主要工作场所的健康和安全问题&#xff0c;并轻松…

数据加载约定表模型变更_08

需求背景&#xff1a;与ODS约定表模型为6张表&#xff0c;现在临时为了满足业务需求新增一张表模型。 表模型变更场景分析&#xff1a; 1》表模型新增 2》表模型表名调整 3》表模型字段新增或者删除 4》表型字段类型调整 文章目录一、前置准备1.1. 设计新增目标表结构1.2. 设计…

Java-类加载内存分析

没有听懂 public class Test05 {public static void main(String[] args) {A a new A();System.out.println(A.m);/*1. 加载到内存&#xff0c;会产生一个类对应Class对象2. 链接&#xff0c; 链接结束后 m 03. 初始化<clinit>(){System.out.println("A类静态代码…

小谈CDN回源函数计算的应用场景

CDN团队联合函数计算团队近期推出了一个全新功能&#xff0c;即通过CDN把回源流量指向函数计算进行处理&#xff0c;该功能旨在帮助CDN用户能通过函数计算快速处理和便捷处理回源数据为目的&#xff0c;用户仅仅需要在CDN回源地址填写函数计算的自定义域名即可把请求转发到函数…

只需12 个步骤,就能在AWS中创建自定义VPC,用过都惊了!

作者| Kunal Yadav译者 | 天道酬勤 责编| 徐威龙封图| CSDN下载于视觉中国在本文中&#xff0c;作者将创建一个具有公共子网和私有子网的自定义VPC。每个子网中都有一个EC2实例&#xff08;已安装WordPress&#xff09;。亚马逊VPC图标公共子网中的实例可以通过互联网访问&…

阿里前端委员会主席圆心:未来前端的机会在哪里?

阿里妹导读&#xff1a;在近期举办的行业大会上&#xff0c;阿里前端技术委员会主席&#xff0c;淘系技术部资深总监圆心发表了《前端路上的思考》的演讲&#xff0c;分别从前端的发展历程、今天的机会、如何引领新技术、前端价值这四个方面进行深入探讨。流年笑掷&#xff0c;…

数据装载服务器_操作事项_06

文章目录一、数据装载前置准备1.1. 切换用户1.2. 生成文件二、手动触发2.1. 拉取文件2.2.文件数据加载2.3. 数据查询2.4. 数据查询三、定时调度3.1. 添加任务3.2. 配置频次3.3. 重新加载3.4. 总览任务列表3.5. 监控是否执行一、数据装载前置准备 1.1. 切换用户 切换用户为ora…

Java-分析类初始化

public class Test06 {static {System.out.println("Main类被加载");}public static void main(String[] args) throws ClassNotFoundException {// 1. 主动引用 // Son son new Son();/* 结果Main类被加载父类被加载子类被加载*/// 反射也会产生主动引用 //…

阿里云人脸识别公测使用说明

概述 之前阿里云人脸识别只提供人脸检测&#xff0c;人脸属性及人脸对比三个API接口&#xff0c;关于这方面的介绍及使用细节&#xff0c;可以参考阿里云人脸识别使用流程简介&#xff0c;之前使用的服务地址为&#xff1a;dtplus-cn-shanghai.data.aliyuncs.com。目前新版本加…

Flowable 数据库表结构 ACT_ID_USER

用户信息表( act_id_user ) 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDREV_乐观锁int√乐观锁VersionFIRST_姓nvarchar(255)√LAST_名nvarchar(255)√EMAIL_EMAIL_nvarchar(255)√PWD_密码nvarchar(255)√PICTURE_ID_图片IDnvarchar(64)√

安卓应用开发顶级框架大盘点,总有一款适合你

作者 | Slava Vaniukov译者 | 苏本如&#xff0c;责编 | 夕颜封图 | CSDN下载自视觉中国出品 | CSDN&#xff08;ID:CSDNnews&#xff09;随着软件开发向移动应用的转变&#xff0c;越来越多的企业意识到&#xff0c;移动应用程序对于企业和客户之间建立牢固的联系至关重要。这…

蚂蚁金服王旭:开源的意义是把社区往前推进一步

互联网技术发展速度之快是所有从业者甚至非从业者都能感受到的。尤记得在世纪之交时&#xff0c;那时候互联网刚刚在中国开始向民用普及&#xff0c;不说支撑大规模的网站访问量的相关技术&#xff0c;就连 Linux、负载均衡甚至都没有被普遍使用。而在二十年之后&#xff0c;云…

Java-类加载器-类运行时结构-。。。。

https://www.bilibili.com/video/BV1p4411P7V3?p16 获取注解信息 https://www.bilibili.com/video/BV1p4411P7V3?p11 https://www.bilibili.com/video/BV1p4411P7V3?p12 https://www.bilibili.com/video/BV1p4411P7V3?p13 https://www.bilibili.com/video/BV1p4411P7V3?p1…

Flowable 数据库表结构 ACT_ID_MEMBERSHIP

用户与分组对应信息表( act_id_membership ) 用来保存用户的分组信息。 字段名称字段描述数据类型主键为空取值说明USER_ID用户IDnvarchar(64)√用户idGROUP_ID用户组IDnvarchar(64)√用户组id