热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ORACLE历史数据管理策略数据清理

背景由于性能数据每天导入量,数据库表空间每天增长很快,且不需要太长的保存周期,为避免爆表,因此需要定制定期清理计划。数据的清理可以有多种方案,根据场景的不同可以分为离线,在线。后续

背景

由于性能数据每天导入量,数据库表空间每天增长很快,且不需要太长的保存周期,为避免爆表,因此需要定制定期清理计划。
数据的清理可以有多种方案,根据场景的不同可以分为离线,在线。后续又在可以细分。这里仅考虑在线方式数据里比如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;\n'
#print syntax
fout.write(syntax)
now=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
fout.write(now+'\n')
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

推荐阅读
  • 随笔142  文章0  评论2294 一步一步教你使用AgileEAS.NET基础类库进行应用开发WinForm应用篇演示使用报表构建UI入库业务查询模块...
    回顾与说明前面我们把“商品字典”、“商品入库”、“商品库存查询”三个模块已经概括或者详细的演示完了,这些模块涉及到简单数据的增、删、修,也涉及到复杂业务 ... [详细]
  • DBA在传统企业数据库安全建设上能做些什么?
    讲师介绍代海鹏新炬网络资深数据库工程师擅长数据库性能优化、故障诊断,曾为中国人寿、中国移动、国家电网、太平洋保险等大型企业提供数据库技术支持服务。分享大纲࿱ ... [详细]
  • datetime 索引_【免费毕设】ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)...
    点击上方“蓝字”关注我们目录系统设计4.1搜索引擎模型模型包括爬虫、索引生成、查询以及系统配置部分。爬虫包括:网页抓取模块、网页减肥模块、爬虫维持模块。索引生成包括& ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 原理:    在父组件中使用axios获取异步数据传给子组件,但是发现子组件在渲染的时候并没有数据,在created里面打印也是空的,结果发现一开始子组件绑定的数据是空的,在请求数据没有返回数据时,子组件就已经加载了,并且他绑定的值也是空的使用vuex全局状态管理,其实简单,利用vuex的辅助函数(mapState,mapMutations)mapState是将st ... [详细]
  • 前段时间使用MySQL作为数据存储做了一个小项目。项目上线运行了几十天之后,数据已经越来越多,达到了100多M。用mysqldump每天备份全量数据然后 ... [详细]
  • 一招解决 Github 加载慢问题
    前言GitHubBuildsoftwarebetter,together.Github是开发者提高生产力的必备工具,是程序员心目中永远的神。但是Github在国 ... [详细]
  • 代码如下:(把数据以表格形式输出本人小白哪位大侠能把完整的代码写出来呀最好是可以添加、删除和显示表格的)<%@pagecontentTypetexthtmlpageEn ... [详细]
  • 一、概述ceph为k8s提供存储服务主要有两种方式,cephfs和cephrdb;cephfs方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ... [详细]
  • 这篇文章主要介绍“CSS浮动和定位属性介绍”,在日常操作中,相信很多人在CSS浮动和定位属性介绍问题上存在疑惑,小编查阅了各式资料,整理出简单 ... [详细]
  • EspressoLogic在其DBaas服务中添加了支持SQL存储过程的RESTful终结点。\u0026#xD;\nEspressoLogic通过分析数据库架构,为 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 感谢大家对IT十八掌大数据的支持,今天的作业如下:1.实践PreparedStament的CRUD操作。2.对比Statement和PreparedStatement的大批量操作耗时?(1 ... [详细]
author-avatar
fenfei2702936060
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有