ORACLE履歴データ管理ポリシー--データクリーンアップ

4467 ワード

背景


パフォーマンス・データの毎日のインポート量のため、データベース・テーブルのスペースは毎日急速に増加し、保存サイクルが長くなる必要はありません.爆発を避けるために、定期的なクリーンアップ・プランをカスタマイズする必要があります.データのクリーンアップには様々なシナリオがあり、シーンによってオフライン、オンラインに分けることができます.後続はまた細分化することができます.ここでは,DELETEやREDEFINITIONのようなオンライン方式データのみを考慮すると,大量のLOGが発生するとともにロールバックセグメントが発生し,定期的にredefinitionを行う必要があるという問題がある.シーンの複雑さを避けるために、ここではパーティションテーブル方式を採用します.

パーティション・スキーマ


現在、2つのシナリオがあります.1つはingervalパーティションに従って、パーティションoracleを定義していないとスマートにパーティション化されます.パーティションは簡単ですが、パーティション名が直接確定できないという問題があります.後期メンテナンスが不便です.ここでは、仮想列の使用、固定パーティション名の使用を重点的に紹介しません.問題を導入するには、仮想列の追加、すなわち、本稿の使用シナリオが必要です.

索引について


表パーティション化後、インデックスを同期的に変更する必要があります.ここでは、私たちのアプリケーションシーンに基づいて、LNP(LOCAL NON PREFIXED)INDEX-導入された仮想列をパーティションフィールドとして構築する必要があります.他の機能はありません.一意のインデックスを構築する必要がある場合は、LNP indexにパーティションキーを含める必要があります.プログラム・アクセス・パスの変更は、明示的にパーティションを指定することが望ましい.指定しない場合、インデックスが一致しても、すべてのテーブルのLNP IDNEXが一致する
select INDEX_NAME,PARTITIONING_TYPE,LOCALITY, ALIGNMENT from all_part_indexes where table_name='xxx'
select index_name,status from user_indexes where index_name='xxx'
select INDEX_NAME,PARTITION_NAME,status from User_Ind_Partitions a where a.Index_Name='xxx'

新しい仮想カラム


新しい仮想列構文

 v_month as (substr(datadate,6,2))
 partition by list(v_month)
(
 partition p1 values('01'),
 partition p2 values('02'),
 partition p3 values('03'),
 partition p4 values('04')
);

新規仮想カラムは、記憶領域の消費量を増加することはないが、新規カラムの情報はmetadataのみに書き込まれるCPU消費量を増加させる.
SELECT TABLE_NAME,PARTITION_NAME,HIGH_VALUE FROM user_tab_partitions WHERE TABLE_NAME=
select TABLE_NAME,PARTITIONING_TYPE  from user_part_tables where table_name='
select segment_name||' '||partition_name||' '||segment_type from user_segments where segment_name like 

アプリケーションの変更


SELECT

SELECT *

現実的な仮想列

INSERT


サポートされていません
insert into table xx values()

挿入カラムを明示的に指定する必要があります.
insert into table xx(col1,col2,...) values()

update


同insert

月ごとのパーティション化データのクリーンアップ


表は月パーティション、合計12パーティションで、データは3ヶ月保持され、毎月3ヶ月前のパーティションデータをクリーンアップします.すなわち、クリーンアップスクリプトが毎月truncateパーティションを生成するスクリプトは以下の通りです.
from  datetime import date,timedelta
from monthdelta import MonthDelta
current_day = date.today()
prev_2month = current_day- MonthDelta(2)
month_of_partition = prev_2month.month
print 'current day is:{0} and previous day of last 2 months is:{1},so the partition need to truncate is:{2}'.format(current_day,prev_2month,month_of_partition)
with open("partition_by_day_table") as f:
    for table in f:
        print 'alter table {0} truacate partition p{1}'.format(table.strip(),month_of_partition)

パーティションを決定したら、タイミングタスクで対応するSQLを実行すればよい.

日単位のパーティション化データのクリーンアップ


表は日パーティションに従い、データは少なくとも7日以上の表パーティションの原則を保留する:表は日パーティションによって、全部で31個のパーティション、毎日8日前のパーティションを整理し、クリーンアップスクリプトは毎月truncateパーティションを生成するスクリプトを実行するのは以下の通りである:
#!/usr/bin/python
from  datetime import date,timedelta,datetime
current_day = date.today()
prev_8day = current_day-timedelta(days=8)
day_of_partition = prev_8day.day
print 'current day is: {0}  and  previsus day of 8 day is:{1},so the partition need to trucate is:{2}'.format(current_day,prev_8day,day_of_partition)
print '#'*72
fout=open('/home/oracle/scripts/minute.log','a')
with open("/home/oracle/scripts/partition_by_day_tables") as f:
        for table in f:
                syntax= 'alter table {0} truacate partition p{1}'.ljust(72,' ').format(table.strip(),day_of_partition)+'; commit;
' #print syntax fout.write(syntax) now=datetime.now().strftime('%Y-%m-%d %H:%M:%S') fout.write(now+'
') f.close() print '#'*72

対応するSQLスクリプトは次のとおりです.
alter table xx1 truacate partition p3                                 ; commit;
alter table xx2 truacate partition p3                                 ; commit;
alter table xx3 truacate partition p3                                 ; commit;

パーティションを決定したら、タイミングタスクで対応するSQLを実行すればよい.

タイミングスクリプト


crontabタイミングタスクで完了
5 4 * * * --daily 
5 4 1 * * ---monthly