背景:
每一个应用系统都有日志表,基本上也都有定期删除日志的需求,这里记录一种可配置日志删除实践,每月初执行。
原来的方式是创建中间表保留需要的数据,再TRUNCATE TABLE,然后INSERT回来,非常耗费时间和资源。改成新的方法以后,Job运行时间从8小时降到1小时。
使用CONNECT BY获取日期列表,这是一个很棒的方法:
SELECT TO_CHAR(DATE'2017-01-01' + (ROWNUM - 1),'YYYY-MM-DD') DT
FROM DUAL
CONNECT BY ROWNUM <= (TRUNC((SYSDATE - 183),'MONTH') - DATE'2017-01-01');
获取日志表里过滤条件列的最小值,替换
DATE'2017-01-01'就可以获得对应表的日期列表,按日期删除数据既快又不会对UNDO造成太大压力。
配置表:LOG_PURGE_CONFIG
TABLE_TYPE
|
VARCHAR2(40)
|
表类型
|
TABLE_NAME
|
VARCHAR2(40)
|
表名
|
TIME_COLUMN
|
VARCHAR2(40)
|
过滤条件列
|
RETENTION_DAYS
|
NUMBER
|
保留时间
|
ENABLED
|
CHAR(1)
|
启用状态
|
LAST_UPDATE_DATE
|
DATE
|
|
CREATE_DATE
|
DATE
|
|
e.g.
LOGS
|
VALIDATION_LOG
|
LOG_TIME
|
183
|
Y
|
15-Sep-17
|
15-Sep-17
|
需要清理过期日志的可以向上面这样配置,以后添加日志表或者修改保留时间就不需要改动Procedure了。
附上Package文件:
PKG_PURGE_EXPIRED_DATA.sql
阅读(1089) | 评论(0) | 转发(0) |