これに来るのは少し遅れましたが、次のことが役立つかもしれないと考えました。REFRDEL が大きなサイズに成長していることに気付き、いくつかの調査の結果、次のことがわかりました... DAMON
は次の手順を実行してクリーンアップを実行します。
- BGPLOG_CLEANUP
- REFRDEL_CLEANUP
- REFRDEL バイパス
- CLEANUP_PRMQUEUE
- USESSION_CLEAR_LOGICAL_DELETES
- CLEANUP_LOGICAL_DELETES
- PRMAUDIT_CLEANUP
- CLEANUP_USESSAUD
- 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 週間に 1 回だけ実行されます...そしてクリーンアップ ジョブを実行すると、1 日分のデータしか削除されませんが、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;
/