oracle定时加载文件,采用sqlldr定时将文本文件加载进入数据库
需求:每個小時前臺生成一個追蹤文件,文件名格式為yyyymmddhh,存放在linux服務器上,要求每小時將上一個小時生成的文件導入數據庫
解決方案:
采用sqlldr可以快速的將外部文本文件加載到數據庫中,根據要求創建控制文件和shell腳本,其中控制文件如下
[root@justin justin]# more control.ctl
load data
characterset UTF8
infile '/justin/source_file.csv'
append into table abc
fields terminated by ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
"ID" sequence(MAX,1),
"desc" char(4000),
"TIME" DATE "YYYY-MM-DD HH24:MI:SS"
)
由于要采用直接路徑加載,所以必須在控制文件中就定義好字符集(需要同數據庫保持一致),否則sqlldr會采用OS的字符集加載,中文出現亂碼;
文本文件中沒有主鍵ID,需要在加載的時候就要為其生成,所以采用sequence(MAX,1)函數
#!/bin/bash
ORACLE_HOME=/data/oracle/product/10205/db1
export ORACLE_HOME
folder=/justin/--文件保存路徑
#get the past time value
date1=`date --date='1 hour ago'??+%Y%m%d%H`
date2=`date --date='15 day ago'??+%Y%m%d%H`
#rename the file generated one hour ago to source_file.csv, which would be called by control.ctl
mv "$folder""$date1"??"$folder"source_file.csv--因為每次加載的文件名稱都不一樣,所以需要其重命名成一個固定的文件,名字需要跟control.ctl中的保持一致
#call sqlldr, with control as control.ctl
$ORACLE_HOME/bin/./sqlldr userid=justin/***** control="$folder"control.ctl??readsize=500000 rows=2000??direct=true log="$folder""$date1"-51
#rename bad file if generated
if [ -f "$folder"source_file.bad ]; then
mv "$folder"source_file.bad "$folder""$date1"-51.bad
fi
#roll back the rename operation
mv "$folder"source_file.csv "$folder""$date1"
#if the file generated by 15 days ago still exist, then drop them
if [ -f "$folder""$date2" ]; then--刪除過期文件
rm "$folder""$date2"
fi
if [ -f "$folder""$date2"-51.log ]; then
rm "$folder""$date2"-51.log
fi
if [ -f "$folder""$date2"-51.bad ]; then
rm "$folder""$date2"-51.bad
fi
最后將這個shell腳本加入至crontab設置每小時運行一次即可
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/15480802/viewspace-688368/,如需轉載,請注明出處,否則將追究法律責任。
總結
以上是生活随笔為你收集整理的oracle定时加载文件,采用sqlldr定时将文本文件加载进入数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow随笔-条件循环语句求
- 下一篇: MyEclipse 2015优化技巧