0

我想定期(例如每年一次)根据某些标准从我们的 DB2 9.7 数据库中归档一组表行。例如,每年一次,归档所有创建日期早于 1 年前的 EMPLOYEE 行?

归档是指将数据移出数据库模式并以可检索的格式存储在其他位置。这可能吗?

4

2 回答 2

3

系统不需要访问归档数据

如果您不需要通过程序访问存档数据,那么我建议您这样做:

  • 创建导出(参考此处)脚本,例如:
echo '===================== export started ';

values current time;
-- maybe ixf format would be better?
export to tablename.del of del 
select * from tablename
where creation_date < (current date - 1 year)
;
echo '===================== export finished ';
  • 创建删除 db2 脚本,例如:
echo '===================== delete started ';
values current time;

delete from tablename.del of del 
where creation_date < (current date - 1 year)
;
commit;

echo '===================== delete finished ';
  • 编写调用所有内容的批处理脚本将新导出的文件复制到安全位置。在调用脚本时,我们要确保在数据被安全放置之前不会完成删除:
db2 connect to db user xx using xxx
db2 -s -vtf export.sql
7z a safe-location-<date-time>.7z tablename.del
if no errors till now:
   db2 -s -vtf delete.sql
  • 将批处理脚本注册为 cron 作业以自动执行此操作

同样,由于删除是非常敏感的操作,我建议使用多个备份机制来确保不会丢失任何数据(例如删除以具有一些不同的时间范围 - 例如删除超过 1.5 年)。

系统应访问归档数据

如果您需要您的系统访问存档数据,那么我建议您使用以下方法之一:

于 2013-05-10T09:53:34.767 回答
0

当然,为什么不呢?一种相当直接的方法是编写一个存储过程 thab 基本上会:

  • 将您希望归档的给定表的所有记录提取到临时表中,
  • 将这些临时记录插入存档表,
  • 从主键在临时表中的给定表中删除

如果您只想将一部分列放入存档中,则可以从仅包含这些列的视图中提取,只要您仍然在临时文件中捕获主键。

于 2013-05-08T14:16:27.243 回答