启用定时备份后,数据库运行一长,必然会积累很多的备份文件,占用大量存储空间,然而时间久远的备份文件可能已经失效,不再具有保留的意义。对于占用存储空间又没有保留意义的文件,当然是清理掉比较好。
清理这种失效的备份文件的方法,Windows下可以写批处理文件,Linux下可以shell脚本。DM7本身提供的系统过程SP_BATCH_DEL_BAK用于清理超期或冗余的备份文件非常好用。
下文就对SP_BATCH_DEL_BAK做个介绍,通过一个清理出错的场景,引出该过程的使用方法。
一、SP_BATCH_DEL_BAK的调用方法:
举例,删除当前系统时间之前,且离当前系统时间最远的BOOKSHOP表空间的一个备份文件:
call SP_BATCH_DEL_BAK('BOOKSHOP', '', 2, SYSDATE, 1);
注:只能删除系统目录下(dm.ini配置的bak_path)的备份,如果备份在其他地方就需要修改bak_path参数值。
上例中参数说明:
'BOOKSHOP':对象名,可以是数据库名、表空间名、表名;
'':模式名,仅对表名有效;
2:级别,取值1、2、3,分别对应:数据库级、表空间级、表级;
SYSDATE:要删除的备份文件时间节点;
1:删除1个SYSDATE前备份的文件,该数量为-1时,则删除SYSDATE前备份的全部备份文件。
二、删除时遇到的异常情况模拟:
SP_BATCH_DEL_BAK函数会连续删除指定时间节点前的n个备份集,前提情况是当前的备份集是连续不断的,中间没有人为删除过。
设置定时备份job每隔一分钟备份一次。可以看见当前备份集是连续的。然后调用函数删除当前时间的前两个备份集,这样就是会删除15点51和15点52分的备份集。
但是如果手动删除过其中某个备份文件,再执行就会出现随机删除两个备份集的情况:
可以看到执行完函数之后把15点53分和16点01分的备份集删除了,这样一来本来应该被删除的54分的备份集就保留了下来,之后再执行删除都会随机删除。
三、原因追踪及解决方法:
再仔细研究过这个函数之后发现在《DM7_SQL语言使用手册》中对这个函数使用有一个备注:
即:在删除备份之前首先要构建备份链表,将各个备份文件按序排列,从而不会产生因人为删除之后导致的本来应该被删除的备份集不删除。
注:以上备注所述系统函数的具体的使用方法及作用请参考《DM7_SQL语言使用手册》。
在构建完备份链表之后再调用删除备份的系统过程,结果如下:
将54分和55分的备份删除。
四、总结:
DM7本身提供的系统过程SP_BATCH_DEL_BAK可以用于清理超期或冗余的备份文件。
调用该过程前,需要先构建备份链表,避免系统统计的备份文件信息过期而造成清理错误的情况。