DB2自动DETACH分区,并归档数据至历史表(Centos)

#!/bin/bash
# db2detach_archive.sh
# 在 DB2 服务器上执行,自动 DETACH 分区并归档到对应月份的 EV_COMBINED_MM 表

DBNAME="central"
USER="db2inst1"
PASSWD="Mics@123"

db2 connect to $DBNAME user $USER using $PASSWD

# 获取 3 个月前的分区名列表
partitions=$(db2 -x "SELECT DATAPARTITIONNAME 
FROM SYSCAT.DATAPARTITIONS
WHERE DATAPARTITIONNAME <> 'PART0'
  AND TABNAME = 'EV_COMBINED'
  AND CARD > 0
  AND SUBSTR(HIGHVALUE,2,10) < ADD_MONTHS(CURRENT DATE, -3)
ORDER BY DATAPARTITIONNAME")

# 循环处理每个分区
for part in $partitions; do
  echo "Processing partition: $part"

  # 例:P202409 -> 202409
  ym=${part#P}      # 去掉前缀 P
  year=${ym:0:4}    # 年份
  month=${ym:4:2}   # 月份(两位)
  
  src_table="EV_COMBINED_TEMP_${ym}"
  archive_table="EV_COMBINED_${month}"   # 归档表按月份

  echo "DETACH 分区 $part 到表 $src_table ..."
  db2 "ALTER TABLE EV_COMBINED DETACH PARTITION $part INTO $src_table"
  if [ $? -ne 0 ]; then
      echo "DETACH 失败,跳过 $part"
      continue
  fi

  echo "EXPORT 数据到文件 ${src_table}.del ..."
  db2 "export to ${src_table}.del of del messages ${src_table}.log select * from $src_table"
  if [ $? -ne 0 ]; then
      echo "EXPORT 失败,跳过 $part"
      continue
  fi

  echo "LOAD 数据到归档表 $archive_table ..."
  db2 "load from ${src_table}.del of del messages ${archive_table}.log insert into $archive_table"
  if [ $? -ne 0 ]; then
      echo "LOAD 失败,保留临时表 $src_table,手动检查"
      continue
  fi

  echo "LOAD 成功,DROP 临时表 $src_table ..."
  db2 "drop table $src_table"
  if [ $? -ne 0 ]; then
      echo "DROP 临时表失败,请手动处理 $src_table"
      continue
  fi

  echo "完成分区 $part 归档 → $archive_table"
done

# 断开数据库连接
db2 connect reset

 

posted @ 2025-08-29 15:45  一只竹节虫  阅读(10)  评论(0)    收藏  举报