開發同學前幾天給我提了乙個資料查詢的需求,大體是查詢某個表的資料,然後把查詢結果以csv的形式提供給他們,一般來說這種定製查詢,開發的同學都會提供好語句,dba同學只需要簡單執行即可。
每次看到語句,我都要簡單評估一下,今天的語句看起來非常簡單,需要在乙個歷史庫中進行資料查取,從開發同學提供的語句來看,這個查詢看起來真不簡單。提供的資料都是近5年內的歷史資料,所以我簡單看了下,這個表有10億的記錄,而符合條件的資料就有1億多條。從資料量來看,這個我是真沒法提供了,資料結果集就肯定幾十上百g了,發給開發同學肯定不現實的,而且就算這個坎能邁過去,他們也沒法用啊,乙個幾十g的檔案,本地幾十m的檔案excel開啟都成問題,何況這麼大的資料量。
所以乙個很明顯的問題擺在我面前,那就是如何高效的匯出這部分資料,目前在這種異構的環境中,csv也是乙個合理的一種方式,不過大資料部分的同事有個要求就是,因為大資料分析的需要,其實還是希望把這部分資料能夠切分成多個檔案,如果能夠切分到天就最好了,他們就會有針對性的做一些處理。
對我來說,還需要簡單確認,以前把資料分片,切分以前也寫過乙個簡單的工具,不過是在oracle之間的做匯出比較給力,在這個場景裡面需要馬上滿足他們的需求還是有些難度。
所以我簡單分析了一下這個歷史表的情況,可以拍著胸脯給他們肯定的答覆了,按天是可以支援的,因為這個分割槽表就是按照日期進行分割槽的,每天都會有乙個單獨的分割槽。
有了這些資訊,我就風風火火開始了資料匯出。
當前的環境有100多g的空餘空間,感覺應該是夠了,所以就寫了下面兩個指令碼。ora_exp.sh,ora_csv.sh
ora_exp.sh會呼叫ora_csv.sh ,ora_csv.sh的作用就是把資料通過sqlplus的spool方式把資料以分割槽的粒度進行匯出。
date=`date -d "+0 day $1" +%y%m%d`
enddate=`date -d "+1 day $2" +%y%m%d`
echo "------------------------------"
echo "date=$date"
echo "enddate=$enddate"
echo "------------------------------"
while [[ $date < $enddate ]] do
echo $date
sh ora_csv.sh $date > test_server_log_$date &
date=`date -d "+1 day $date" +%y%m%d`
done
ora_csv.sh的指令碼內容如下:
sqlplus -s / as sysdba gzip test_server_log_$date
date=`date -d "+1 day $date" +%y%m%d`
done
按照這個思路匯出之後。在個把小時過後,終於告一段落,一看壓縮後的檔案有近69g,按照壓縮比,源資料應該有400多g,這種方式還是比較理性的。
[oracle@statg data_split]$ du -sh .
69g
批量匯出表資料到CSV檔案
需求 把oracle資料庫中符合條件的n多表。匯出成csv文字檔案。並以表名.csv為檔名稱存放。實現 通過儲存過程中utl file函式來實現。匯出的csv檔案放入提前建立好的directory中。用法 使用下面命令資料預執行的sql指令碼 select exec sql to csv selec...
批量匯出表資料到CSV檔案
實現 通過儲存過程中utl file函式來實現。匯出的csv檔案放入提前建立好的directory中。使用方法 使用以下命令資料預執行的sql指令碼 select exec sql to csv select from t.table name out put csv ods mds.t.table...
ORACLE匯出CSV檔案
oracle的匯出功能會經常使用,也同樣經常會有需求進行匯出為csv檔案,用於往別的資料庫進行遷移,本次例項及在oracle實現匯出csv檔案操作。sqlplus as sysdba sql create or replace directory out path as home wenxuecha...