#!/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