db2 delete 大表不寫日誌方法

2021-05-25 07:43:39 字數 4813 閱讀 9667

最近由於專案需要,用

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 索...