我们的数据库中有两个日志表,我们所有的应用程序都将日志写入其中。我们计划每天创建一个cron作业,以删除超过60天的记录。
这两个表都没有任何主键。下表是DDL表供您参考。
CREATE TABLE AUDITLOG
(
UUID varchar2(50) NOT NULL,
INTERFACEID varchar2(50) NOT NULL,
APPLICATIONNAME varchar2(50) NOT NULL,
COMPONENTNAME varchar2(50) NOT NULL,
SOURCEAPPLICATIONNAME varchar2(50) NOT NULL,
TARGETAPPLICATIONNAME varchar2(50) NOT NULL,
MESSAGE varchar2(400) NOT NULL,
ENGINENAME varchar2(50) NOT NULL,
TRANSACTIONTIMESTAMP timestamp,
TIMESTAMP timestamp,
EXCEPTION CLOB,
LOGTYPE varchar2(20) NOT NULL
);
CREATE TABLE TRANSACTIONLOG
(
UUID varchar2(50) NOT NULL,
INTERFACEID varchar2(50) NOT NULL,
APPLICATIONNAME varchar2(50) NOT NULL,
TRANSACTIONTIMESTAMP timestamp,
TIMESTAMP timestamp,
EVENTPAYLOAD CLOB,
LOGTYPE varchar2(20) NOT NULL
);
CREATE INDEX AUDITLOG_UUID_IDX ON AUDITLOG(UUID);
CREATE INDEX AUDITLOG_TIMESTAMP_IDX ON AUDITLOG(TIMESTAMP);
CREATE INDEX TRANSACTIONLOG_UUID_IDX ON TRANSACTIONLOG(UUID);
CREATE INDEX TRANSACTIONLOG_TIMESTAMP_IDX ON TRANSACTIONLOG(TIMESTAMP);
不是数据库专家,对我来说,简单的方法就是
/* Query to purge log tables older than 60 days */
delete from AUDITLOG where timestamp < trunc(sysdate) - 60;
delete from TRANSACTIONLOG Where timestamp < trunc(sysdate) - 60;
由于记录数可能是数千个(clob xml可能也很大),所以我仍然不确定这是否是最好的方法。我正在考虑的另一种方法是创建具有自动序列的主键,并最大程度地删除行。
欢迎提出任何建议
答案 0 :(得分:5)
首先要进行框架挑战:“是否需要删除日志?”
您说过“记录数可能以千计”;这是少量数据(除非您的CLOB
值特别大),您可以查看保留日志数据的好处是否大于管理一个单独的进程以删除它并丢失该信息的麻烦永远。
如果您确定需要删除日志,则创建一个定期计划作业,该作业每天删除过期的行(或您认为合适的频率)。
(未经测试)之类的东西
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'delete_out_of_date_logs_job',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN
DELETE FROM AUDITLOG
WHERE timestamp < TRUNC( SYSDATE ) - INTERVAL ''60'' DAY;
DELETE FROM TRANSACTIONLOG
WHERE timestamp < TRUNC( SYSDATE ) - INTERVAL ''60'' DAY;
END;',
start_date => TRUNC( SYSTIMESTAMP ) + INTERVAL '1' DAY,
repeat_interval => 'FREQ=DAILY;',
enabled => TRUE,
comments => 'Daily log deletion'
);
END;
/