我们的数据库中有两个日志表,我们的所有应用程序都将向其中写入日志。我们计划每天创建一个 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);
Run Code Online (Sandbox Code Playgroud)
不是 DB 人,对我来说,这样做的简单方法是
/* 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;
Run Code Online (Sandbox Code Playgroud)
由于记录数可能以千计(clob xml 也可能很大),我仍然不确定这是否是最好的方法。我正在考虑的另一种方法是创建一个带有自动序列的主键,并最大程度地删除行。
欢迎任何建议
先来个框架挑战:“有必要删除日志吗?”
你说“记录的数量可能有几千条”;这是少量数据(除非您的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;
/
Run Code Online (Sandbox Code Playgroud)