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_dev2.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 記錄異常軌跡
3.2. 數據同步日志表
SYNC_FINISH_LOG記錄成功軌跡
SYNC_FINISH_ERROR_LOG 記錄異常軌跡
四、存儲過程
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 -e5.2. 配置執行頻次
*/30 * * * * /bin/sh /home/oracle/shell_sync/data_sync.sh保存,退出
5.3.重新加載cron服務
/sbin/service crond restart5.4. 查看當前用戶下的定時任務列表
crontab -l5.5. 監控是否執行
1》可以借助根據日志查看
2》可以借助plsql工具查詢
總結
以上是生活随笔為你收集整理的linux 环境 crontab+shell+sqlplus 调用oracle 存储过程实现数据同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ管控台操作手册
- 下一篇: 分布式Session解决方案_Token