最近由於專案需要,用
shell
程式批量刪除業務表資料,但還需要按業務需求保留業務歷史資料,由於專案中用的是
db2,db2
在刪除資料時會產生大量的日誌,會把日誌檔案充滿,會報
57011錯誤.
通過在網上查詢一些資料,最終在不改變原表結構引數的基礎上,減少其他們人員的工作量的基礎上動態調整引數。
以下為具體操作步驟:
-- db2 delete
大表不寫日誌操作
1.update command options using c off -- //
關閉自動提交
2.alter table marpt.rpt_dim_u_org_inx_m_curr_cus_pro_tbk activate not logged initially //
設定不記日誌
3.delete from marpt.rpt_dim_u_org_inx_m_curr_cus_pro_tbk --
刪除資料
4.commit//
手動提交
5.update command options using c on//
開啟自動提交
相關操作說明;
1.alter table testdeletetab activate not logged initially
,設定表操作不記日誌,這條命令只在乙個事務裡有效,遇到
commit
之後就失效了,這個很需要關注,因為有的時候我們的連線都是設定的自動提交,所以雖然設定了不記日誌,但是並沒有起到作用。 2.
可以通過相關的命令檢視當前命令引數
db2 list command options
下邊為相應的shell指令碼,可以參照一下
. /home/odsuser1/.profile
#ods run all gdbma jobs
#gdbma
#2011-3-16
#刪除表引數
work_date=$2
tab_name=$1
#sysname=gdbma
if [ "$tab_name#" -eq "#" ]
then
echo "the job do not delete the table data!! "
else
mads_home=/home/odsuser1/gdbma/etl
#ds config
dsconfigfile=$mads_home/dsconfig_gdbma
#marpt etl2資料庫
#dbdbname=`awk 'fs="=" ' $dsconfigfile`
dbusr=`awk 'fs="=" ' $dsconfigfile`
dbpwd=`awk 'fs="=" ' $dsconfigfile`
dbschema=`awk 'fs="=" ' $dsconfigfile`
dbpwd=`$mads_home/encrypt/discrypt.sh $dbpwd`
dbname=$dbname
user=$dbusr
passwd=$dbpwd
#連線資料庫
db2 connect to $dbname user $dbusr using $dbpwd >/dev/null
db2 set schema=$dbschema;
ssql="select schedule,keep_date,sch_name,tab_date,no_log from "$dbschema".s_tab_info where tab_name='"$tab_name"' "
sdata=`db2 -t "$ssql"`
if [ $? -eq 0 ]
then
echo " the job drop data start!"
else
echo "this query false!!!"
fiecho "$sdata" | sed -e '4,/^$/!d;/^$/d'|
#迴圈讀取job,然後排程
while read schedule keep_date sch_name tab_date no_log
doecho "$no_log"
if [ "$no_log" = 'y' ]
then
#引數調整(取消自動提交)
commit_off=`db2 -a "update command options using c off"`
#啟用不寫日誌
log_off=`db2 -a "alter table "$dbschema"."$tab_name" activate not logged initially"`
# 清資料開始
if [ "$schedule" = 'm' ]
then
if [ "$keep_date" = 1 ]
then
delete_table="delete from "$dbschema"."$tab_name" "
else
v_tx_date=`db2 -x "select date(substr(varchar(date('"$work_date"')),1,8)||'01') -(int(trim('"$keep_date"'))-2) months -1 days from sysibm.sysdummy1 "`
echo "$v_tx_date"
delete_table="delete from "$dbschema"."$tab_name" where date("$tab_date") = date('"$v_tx_date"')"
fifi
if [ "$schedule" = 'd' ]
then
if [ "$keep_date" = 1 ]
then
delete_table="delete from "$dbschema"."$tab_name" "
else
v_tx_date=`db2 -x "select date('"$work_date"') -(int(trim('"$keep_date"'))*31) days from sysibm.sysdummy1 "`
delete_table="delete from "$dbschema"."$tab_name" where date("$tab_date") = date('"$v_tx_date"')"
fifi
deldata=`db2 -a $delete_table`
echo "$deldata" | sed -n -e 's/^.*sqlcode: /([-,0-9][0-9]*/).*//1/p' | read sqlcode
if [ $sqlcode -ge 0 ]
then
echo "the job delete table sucessfull"
else
echo "the job delete table false"
fi#提交
commit_date=`db2 -a "commit"`
#設定自動提交
commit_on=`db2 -a "update command options using c off"`
else
if [ "$schedule" = 'm' ]
then
if [ "$keep_date" = 1 ]
then
delete_table="delete from "$dbschema"."$tab_name" "
else
v_tx_date=`db2 -x "select ( date(substr(varchar(date('"$work_date"')),1,8)||'01') -(int(trim('"$keep_date"'))-2) months -1 days) from sysibm.sysdummy1"`
delete_table="delete from "$dbschema"."$tab_name" where date("$tab_date") = date('"$v_tx_date"')"
fifi
if [ "$schedule" = 'd' ]
then
if [ "$keep_date" = 1 ]
then
delete_table="delete from "$dbschema"."$tab_name" "
else
v_tx_date=`db2 -x "select date('"$work_date"') -(int(trim('"$keep_date"'))*31) days from sysibm.sysdummy1 "`
delete_table="delete from "$dbschema"."$tab_name" where date("$tab_date") = date('"$v_tx_date"')"
fifi
deldata=`db2 -a $delete_table`
echo "$deldata" | sed -n -e 's/^.*sqlcode: /([-,0-9][0-9]*/).*//1/p' | read sqlcode
if [ $sqlcode -ge 0 ]
then
echo "the job delete table sucessfull"
else
echo "the job delete table false"
fifi
done
fi
DB2 delete大表不記錄日誌的正確操作
在刪除大表的時候,經常會由於資料量太大,造成日誌檔案滿了,接著無法刪除資料.以下是刪除大表不記錄日誌的具體步驟 1.臨時設定自動提交關閉 使用命令db2 list command options檢視auto commit引數狀態是否為off,如果不是則使用db2set db2options c永久關...
oracle上億條記錄大表delete
delete use hash a,b parallel a,15 from tabacca where exists select 1 from temptablea b where a.id b.id and b.type 1 可以試試多個job分工,同時進行。比如開10個job,每個job分十...
Oracle對大表進行delete注意事項
那麼可以注意一下如下說明 檢視執行計畫,如果說刪除的記錄很多,走索引的成本會比全表掃瞄更大,因為更新資料時還需要做一些約束校驗和建立index entry 而且對於多cpu 情況,全表掃瞄還可以使用並行的特性。如果表上有索引,b tree 索引可以unusable 索引,函式索引則disable 索...