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