摘要:背景由于性能數據每天導入量,數據庫表空間每天增長很快,且不需要太長的保存周期,為避免爆表,因此需要定制定期清理計劃。數據的清理可以有多種方案,根據場景的不同可以分為離線,在線。
背景
由于性能數據每天導入量,數據庫表空間每天增長很快,且不需要太長的保存周期,為避免爆表,因此需要定制定期清理計劃。
數據的清理可以有多種方案,根據場景的不同可以分為離線,在線。后續又在可以細分。這里僅考慮在線方式數據里比如DELETE與 REDEFINITION,這種方式帶來的問題就是會產生大量的LOG,同時產生回滾段,需要定期進行redefinition。為避免場景復雜,這里采用分區表方式。
目前有兩種方案,一種是按照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") );
新增虛擬列不會增加存儲空間消耗,但是會增加CPU消耗,即新增列的信息僅寫入metadata.
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個月,每個月出清理三個月之前的分區數據,即清理腳本每月執行
生成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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44247.html
閱讀 1983·2021-11-24 09:39
閱讀 979·2021-11-11 16:55
閱讀 1426·2021-10-09 09:43
閱讀 1416·2021-10-08 10:17
閱讀 1648·2021-08-25 09:41
閱讀 424·2019-08-30 13:02
閱讀 628·2019-08-29 15:14
閱讀 1002·2019-08-29 13:53