有点晚了,但认为以下内容可能对某些人有用。我们注意到 REFRDEL 已经增长到一个很大的规模,经过一些调查发现了以下情况......
DAMON 运行以下程序来执行清理:
- BGPLOG_CLEANUP
- REFRDEL_CLEANUP
- REFRDEL 旁路
- CLEANUP_PRMQUEUE
- USESSION_CLEAR_LOGICAL_DELETES
- CLEANUP_LOGICAL_DELETES
- PRMAUDIT_CLEANUP
- CLEANUP_USESAUD
- USER_DEFINED_BACKGROUND
DAMON 被配置为每周六下午 4 点左右运行,但我们注意到它一直在失败。这是由于从晚上 10 点开始的脱机备份过程。我们首先假设这会阻止 REFRDEL_CLEANUP 运行。
然而,在监视 REFRDEL 几周后,我们发现 REFRDEL_CLEANUP实际上正在运行并从表中删除数据。您可以通过在第 1 周运行以下查询来检查您的表,然后在第 2 周再次运行以验证是否删除了最旧的记录。
select min(delete_date), max(delete_date), count(*) from admuser.refrdel;
问题与 REFRDEL_CLEANUP 过程使用的默认参数有关。这些在此处进行了描述,但总而言之,该过程设置为保留最近 5 天的记录并仅删除 1 天的记录。这就是导致问题的原因......DAMON 每周只运行一次......当它运行清理作业时,它只删除 1 天的数据,但已经积累了一周的价值......因此数据量会变得更大和更大。
可以在 SETTINGS 表中覆盖默认参数。
以下是我为解决此问题而采取的步骤:
首先,清理桌子..
-- 1. create backup table
CREATE TABLE ADMUSER.REFRDEL_BACKUP TABLESPACE PMDB_DAT1 NOLOGGING AS
Select * from admuser.refrdel where delete_date >= (sysdate - 5);
-- CHECK DATA HAS BEEN COPIED
-- 2. disable indexes on REFRDEL
alter index NDX_REFRDEL_DELETE_DATE unusable;
alter index NDX_REFRDEL_TABLE_PK unusable;
-- 3. truncate REFRDEL table
truncate table admuser.refrdel;
-- 4. restore backed up data
ALTER TABLE ADMUSER.REFRDEL NOLOGGING;
insert /*# append */ into admuser.refrdel select * from admuser.refrdel_backup;
--verify number of rows copied
ALTER TABLE ADMUSER.REFRDEL LOGGING;
commit;
-- 5. rebuild indexes on REFRDEL
alter index NDX_REFRDEL_DELETE_DATE rebuild;
alter index NDX_REFRDEL_TABLE_PK rebuild;
-- 6. gather table stats
exec dbms_stats.gather_table_stats(ownname => 'ADMUSER', tabname => 'REFRDEL', cascade => TRUE);
-- 7. drop backup table
drop table admuser.refrdel_backup purge;
接下来,覆盖参数,以便我们尝试删除至少 10 天的数据。保留期将始终保留 5 天的数据。
exec settings_write_string(‘10',’database.cleanup.Refrdel’,’DaysToDelete’); -- delete the oldest 10 days of data
exec settings_write_string(’15’,’database.cleanup.Refrdel’,’IntervalStep’); -- commit after deleting every 15 minutes of data
exec settings_write_string(‘5d’,’database.cleanup.Refrdel’,’KeepInterval’); -- only keep 5 most recent days of data
这最后一步仅与我的环境相关,除非您遇到类似问题,否则不适用于您。这是为了改变 DAMON 的开始时间,使其在我们的离线备份过程开始之前完成。所以在这种情况下,我将开始时间从下午 4 点更改为午夜。
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => 'BGJOBUSER.DAMON',
attribute => 'start_date',
value => TO_TIMESTAMP_TZ('2016/08/13 00:00:00.000000 +00:00','yyyy/mm/dd hh24:mi:ss.ff tzr'));
END;
/