自動備份、截斷分割槽表分割槽資料
#!/bin/bash
# by ray
# 2016-06-08
. ~/.bash_profile
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
todayUtc=`date +%s000` #獲取毫秒的utc時間
tdate=`date +%F-%H%M%S` #獲取當前時間
days=185 #指定向前的天數,以獲取保留的分割槽數
truncdir=/tmp/truncpar
if [ ! -d ${truncdir} ];then
mkdir -p ${truncdir}
fi
#獲取所有分割槽表的函式
getParTableInfo(){
[ -e ${truncdir}/.partable.tmp ]&& rm -f ${truncdir}/.partable.tmp #檢查檔案是否存在,刪除存在的檔案
[ -e ${truncdir}/.partable.txt ]&& rm -f ${truncdir}/.partable.txt
#獲取所有分割槽表的表名和使用者名稱稱
sqlplus -s /nolog <<-RAY
conn $1/$2@$3
set termout off;
set echo off;
set feedback off;
set verify off;
set heading off;
set wrap on;
set trimspool on;
set serveroutput on;
set escape on;
set pagesize 50000;
set long 2000000000;
set linesize 300;
spool ${truncdir}/.partable.tmp;
select DISTINCT A.TABLE_NAME from user_TAB_PARTITIONS A ;
spool off
RAY
grep "^[A-Z]" ${truncdir}/.partable.tmp > ${truncdir}/.partable.txt
[ -e ${truncdir}/.partable.tmp ]&& rm -f ${truncdir}/.partable.tmp
}
#獲取某個表的所有分割槽資訊
getPartitionInfo(){
[ -e ${truncdir}/.$1-$3-$4.tmp ]&& rm -f ${truncdir}/.$1-$3-$4.tmp
[ -e ${truncdir}/.$1-$3-$4.txt ]&& rm -f ${truncdir}/.$1-$3-$4.txt #檢查檔案是否存在,檔案的命名規則是oracleuser-tnsname-tablename.txt,例如kcpt-RACDB-th_vehicle_alarm.TXT使用者kcpt,tns連線字串為RACDB,表名為th_vehicle_alarm
sqlplus -s /nolog <<-RAY
conn $1/$2@$3
set termout off;
set echo off;
set feedback off;
set verify off;
set heading off;
set wrap on;
set trimspool on;
set serveroutput on;
set escape on;
set pagesize 50000;
set long 2000000000;
set linesize 300;
spool ${truncdir}/.$1-$3-$4.tmp;
SELECT a.table_name,a.PARTITION_NAME,a.HIGH_VALUE
FROM dba_TAB_PARTITIONS A
WHERE A .table_name = '$4';
spool off
RAY
grep "^$4" ${truncdir}/.$1-$3-$4.tmp | sort -n -k 3 | awk '{print NR","$1","$2","$3}' > ${truncdir}/.$1-$3-$4.txt
[ -e ${truncdir}/.$1-$3-$4.tmp ]&& rm -f ${truncdir}/.$1-$3-$4.tmp
}
#函式:獲取備份命令
getExpdpParCommandAndTruncSql(){
#迴圈獲取表名
for i in `cat ${truncdir}/.partable.txt`
do
un=$1
up=$2
tn=$3
dn=$4
getPartitionInfo $1 $2 $3 $i
for j in `cat ${truncdir}/.$1-$3-$i.txt`
do
utc=`echo $j | awk -F ',' '{print $4}'`
if [[ ${utc} -ge ${todayUtc} ]];then
linenum=`echo $j | awk -F ',' '{print $1}'` #獲取表內highvalue值大於當前utc時間的分割槽的行號
linenum=$[$linenum-$days] #獲取表內highvalue值大於當前utc時間減去指定的天數的分割槽的行號
dumpnum=$[$linenum+2] #獲取備份的分割槽表的行號
if [[ ${dumpnum} -lt 1 || ${linenum} -lt 1 ]];then #當行號小於1時推出當前迴圈
continue
else
#獲取expdp命令,把命令寫入檔案
#sed -n "${dumpnum}p" ${truncdir}/.$1-$3-$i.txt | awk -F ',' '{print "expdp '${un}'/'${up}' directory=expdp network_link='${dn}' dumpfile='${tn}'-"$2"-"$3"-'${tdate}'.dmp logfile='${tn}'-"$2"-"$3"-'${tdate}'.log tables="$2":"$3}' >> ${truncdir}/ExpdpPar.cmd
sed -n "${dumpnum}p" ${truncdir}/.$1-$3-$i.txt | awk -F ',' '{print "expdp '${un}'/'${un}' directory=expdp network_link='${dn}' dumpfile='${tn}'-"$2"-"$3"-'${tdate}'.dmp logfile='${tn}'-"$2"-"$3"-'${tdate}'.log tables="$2":"$3}' >> ${truncdir}/ExpdpPar.cmd
#獲取truncate命令,把命令寫入檔案
sed -n "${linenum}p" ${truncdir}/.$1-$3-$i.txt | awk -F ',' '{print "alter table "$2" truncate partition "$3" update global indexes;"}' >> ${truncdir}/truncPar.sql
#expdpcommand=`sed -n "${dumpnum}p" ${truncdir}/.$1-$3-$i.txt | awk -F ',' '{print "expdp '${un}'/'${up}' director=expdp network_link='${dn}' dumpfile='${tn}'-"$2"-"$3"-'${tdate}'.dmp logfile='${tn}'-"$2"-"$3"-'${tdate}'.log tables="$2":"$3}'`
#echo ${expdpcommand} >> ${truncdir}/ExpdpPar.cmd
break
#rm -rf ${truncdir}/.$1-$3-$i.txt
fi
fi
done
done
}
#函式:執行指定sql
execSQL(){
sqlplus /nolog <<-RAY
conn $1/$2@$3
@$4
RAY
}
#指令碼入口
#迴圈引數檔案的內容
for f in `cat $1`
do
[ -e ${truncdir}/ExpdpPar.cmd ]&& rm -f ${truncdir}/ExpdpPar.cmd
[ -e ${truncdir}/truncPar.sql ]&& rm -f ${truncdir}/truncPar.sql
#獲取oracle使用者,密碼和tns連線字串名稱,dblink名稱
ouname=`echo ${f} | awk -F ',' '{print $1}'`
oupass=`echo ${f} | awk -F ',' '{print $2}'`
tnsname=`echo ${f} | awk -F ',' '{print $3}'`
dblname=`echo ${f} | awk -F ',' '{print $4}'`
#獲取指定使用者的所有的分割槽表
getParTableInfo ${ouname} ${oupass} ${tnsname}
#獲取指定使用者的所有分割槽表指定分割槽的expdp語句和截斷分割槽語句
getExpdpParCommandAndTruncSql ${ouname} ${oupass} ${tnsname} ${dblname}
#執行備份
[ -e ${truncdir}/ExpdpPar.cmd ]&& bash ${truncdir}/ExpdpPar.cmd
#執行截斷分割槽
[ -e ${truncdir}/truncPar.sql ]&& execSQL ${ouname} ${oupass} ${tnsname} "${truncdir}/truncPar.sql"
[ -e ${truncdir}/ExpdpPar.cmd ]&& rm -f ${truncdir}/ExpdpPar.cmd
[ -e ${truncdir}/truncPar.sql ]&& rm -f ${truncdir}/truncPar.sql
done
###################################
#trunc_par.prm 引數檔案
#引數檔案,格式:使用者名稱,密碼,tns連線字串,dblink名稱
ora_name,ora_pass,RACDB,DB_BASIC
ora_name,ora_pass,RACDB,DB_STORAGE
ora_name,ora_pass,kcptdg2,kcpt103
###################################
#用法:./trunc_partition-data.sh /path/trunc_par.prm
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28572479/viewspace-2123952/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【實驗】【PARTITION】RANGE分割槽表截斷表分割槽(Truncate Partition)
- 海量資料處理_表分割槽(分割槽自動維護與歷史分割槽歸檔)
- 全面學習分割槽表及分割槽索引(14)--截斷、移動和重新命名索引
- 分割槽表入無分割槽的資料庫資料庫
- oracle分割槽表和分割槽表exchangeOracle
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- 如何查詢分割槽表的分割槽及子分割槽
- Oracle分割槽表及分割槽索引Oracle索引
- INTERVAL分割槽表鎖分割槽操作
- hive 動態分割槽插入資料表Hive
- 資料庫分割槽表 什麼情況下需要分割槽資料庫
- oracle分割槽表和非分割槽表exchangeOracle
- Kafka 分割槽備份實戰Kafka
- 全面學習分割槽表及分割槽索引(9)--刪除表分割槽索引
- 全面學習分割槽表及分割槽索引(11)--合併表分割槽索引
- 全面學習分割槽表及分割槽索引(12)--修改list表分割槽索引
- 學習筆記】分割槽表和分割槽索引——新增表分割槽(二)筆記索引
- 全面學習分割槽表及分割槽索引(10)--交換分割槽索引
- PLSQL根據分割槽表的分割槽名批次truncate分割槽SQL
- 【實驗】【PARTITION】RANGE分割槽表移動表分割槽(Move Partition)
- 使用split對分割槽表再分割槽
- 簡單ORACLE分割槽表、分割槽索引Oracle索引
- rebuild分割槽表分割槽索引的方法Rebuild索引
- 分割槽表及分割槽索引建立示例索引
- Oracle12c:建立主分割槽、子分割槽,實現自動分割槽插入效果Oracle
- Spark SQL:Parquet資料來源之自動分割槽推斷SparkSQL
- Hash分割槽表分割槽數與資料分佈的測試
- 使用expdp匯出分割槽表中的部分分割槽資料
- 怎麼備份分割槽表?還原備份表怎麼操作?
- MySQL 分割槽表原理及資料備份轉移實戰薦MySql
- MySql資料分割槽操作之新增分割槽操作MySql
- Oracle帶區域性分割槽索引的分割槽表刪除舊分割槽新增新分割槽Oracle索引
- 全面學習分割槽表及分割槽索引(8)--增加和收縮表分割槽索引
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- 非分割槽錶轉換成分割槽表