数据清理的遗留问题处理

最近处理一个遗留问题,感觉手动修复真是让人抓狂,所以花了点力气写了一个半自动的脚本,总算从这个繁琐的工作中解放出来了。
问题的背景如下图所示。
存在一个很大的统计库(有容灾备库),还有一个历史统计库,历史统计库中都是相对较老的数据。
统计库中的数据相对要新一些,但是数据持续增长,空间使用太多,业务中使用历史数据的频率不高,把历史数据清理了又怕影响业务,就需要把数据暂时挪到历史库中,所以历史库中的数据都是几年前的老数据,而统计库中的都是近几年相对较新的数据。
比如一个分区表test,有2011年的分区数据在历史库中,有2014年的数据在统计库中,统计库中的数据太多,空间不足就需要把数据从统计库清理掉,同事保证历史库中存在这份数据。

可能之前的同事把有些表空间和分区绑定了起来,所以涉及的表空间非常多,需要检查这些表空间中所对应的数据文件,表空间所在的段中的分区数据情况,然后再在历史库中检查一遍,确定两边查到的数据条数是一样的(历史数据不会有dml改动),如果数据在两边都存在,就删除现网统计库中的,然后删除对应的数据文件,对应的表空间。
之前是每隔一周或者两周左右就会做一次这样的检查和清理工作,所以得时常惦记着,想多删点,因为手动校验检查处理着实费神费力,所以也删不了太多。
所以下了决心改进这个情况,至少做成半自动化,人工审核还是需要的,为了保证不误删,检查出现偏差。

我写了一个简单的脚本,运行内容如下:
清理之前,查看有多少含有DATA字样的表空间可清理,清理年份为2012年
check genaral status of data from year 2012
   SIZE_MB
----------
    308410
检查可清理的段情况,都是分区表和分区索引段。
check segement size summary from year 2012
SEGMENT_TYPE          SIZE_MB
------------------ ----------
INDEX PARTITION    255325.188
TABLE PARTITION        288483
检查可清理的段情况,有多少可清理
check segment count summary from year 2012
SEGMENT_TYPE         COUNT(*)
------------------ ----------
INDEX PARTITION          4148
TABLE PARTITION          1505

然后就得到了计划清理的表空间,数据文件和文件大小
CONSUMEID_DATA_20121008        +DATA/sgstatdb3/datafile/consumeid_data_20121008.758.840501581                200
CONSUMEID_DATA_20120705        +DATA/sgstatdb3/datafile/consumeid_data_20120705.752.840501565                210
CONSUMEID_DATA_20120403        +DATA/sgstatdb3/datafile/consumeid_data_20120403.742.840501535                230
CONSUMEID_DATA_20120704        +DATA/sgstatdb3/datafile/consumeid_data_20120704.743.840501541                230
CONSUMEID_DATA_20121009        +DATA/sgstatdb3/datafile/consumeid_data_20121009.746.840501549                230
CONSUMEID_DATA_20121007        +DATA/sgstatdb3/datafile/consumeid_data_20121007.741.840501535                240

然后统计有多少表空间可清理。
CONSUMEID_DATA_20121008               200
CONSUMEID_DATA_20120705               210
CONSUMEID_DATA_20121009               230
CONSUMEID_DATA_20120403               230
。。。

然后根据条件生成查看表分区数据的sql语句。
select 'TEST:TEST_SERVER_LOG_SERVER_LOG_20120410', count(*) from TEST.TEST_SERVER_LOG partition (SERVER_LOG_20120410);
select 'TEST:TEST_SERVER_LOG_SERVER_LOG_20120411', count(*) from TEST.TEST_SERVER_LOG partition (SERVER_LOG_20120411);
select 'TEST:TEST_SERVER_LOG_SERVER_LOG_20120412', count(*) from TEST.TEST_SERVER_LOG partition (SERVER_LOG_20120412);
。。。。
在统计库和历史统计库中查看。
统计库中查看
TEST:TEST_SERVER_LOG_SERVER_LOG_20120410    2118970
TEST:TEST_SERVER_LOG_SERVER_LOG_20120411    2145005
TEST:TEST_SERVER_LOG_SERVER_LOG_20120412    2128818

历史统计库中查看
TEST:TEST_SERVER_LOG_SERVER_LOG_20120410    2118970
TEST:TEST_SERVER_LOG_SERVER_LOG_20120411    2145005
TEST:TEST_SERVER_LOG_SERVER_LOG_20120412    2128818

比对两边的数据情况,如果一致则删除
alter table  TEST.TEST_SERVER_LOG drop partition (SERVER_LOG_20120410);
alter table  TEST.TEST_SERVER_LOG drop partition (SERVER_LOG_20120411);
alter table  TEST.TEST_SERVER_LOG drop partition (SERVER_LOG_20120412);

清理完成之后开始确认表空间中是否存在其它的段,然后开始尝试删除数据文件。

初版脚本如下,后面需要不断完善,不过目前所列的这些基本步骤都做到了,很多繁琐的检查工作都给提炼出来了,不用重复执行,费时费力了。
tmp_year=2012
conn_dba=testdba/testdba
hist_conn_dba=tesetdba/testdba@statdb_hist
sqlplus -s $conn_dba <<EOF
prompt check genaral status of data from year $tmp_year
select sum(bytes/1024/1024) size_MB from dba_data_files where tablespace_name like '%DATA%${tmp_year}%' ;

prompt check segement size summary from year $tmp_year
select segment_type,sum(bytes/1024/1024) size_MB from dba_segments where tablespace_name in (select tablespace_name from dba_data_files where tablespace_name like '%${tmp_year}%' ) group by segment_type;

prompt check segment count summary from year $tmp_year
select segment_type,count(*) from dba_segments where tablespace_name in (select tablespace_name from dba_data_files where tablespace_name like '%${tmp_year}%' ) group by segment_type;

set linesize 200
col file_name format a70
set pages 0
select tablespace_name,file_name,sum(bytes/1024/1024) size_MB from dba_data_files where tablespace_name like '%DATA%${tmp_year}%' group by tablespace_name,file_name order by size_MB;

select tablespace_name,sum(bytes/1024/1024) size_MB from dba_data_files where tablespace_name like '%DATA%${tmp_year}%' group by tablespace_name order by size_MB;

set feedback off
set linesize 200
spool get_tab_part_cnt.sql
select 'select '||chr(39)||owner||':'||segment_name||'_'||partition_name ||chr(39)||', count(*) from '||owner||'.'||segment_name||' partition ('||partition_name||');'
from dba_segments where tablespace_name in (select tablespace_name from dba_tablespaces  where tablespace_name like '%DATA%${tmp_year}%') and segment_type in ('TABLE PARTITION') and rownum<10;
spool off
EOF

sqlplus -s $conn_dba <<EOF
set pages 0
set feedback off
spool get_tab_part_cnt.log_statdb2
@get_tab_part_cnt.sql
spool off
EOF

sqlplus -s $hist_conn_dba <<EOF
set pages 0
set feedback off
spool get_tab_part_cnt.log_statdb2_hist
@get_tab_part_cnt.sql
spool off
EOF

sdiff get_tab_part_cnt.log_statdb2 get_tab_part_cnt.log_statdb2_hist > tab_cnt_summary.lst

diff_cnt=`diff get_tab_part_cnt.log_statdb2 get_tab_part_cnt.log_statdb2_hist`

sqlplus -s $conn_dba <<EOF
set feedback off
set pages 0
spool drop_tab_part.sql
select 'alter table  '||owner||'.'||segment_name||' drop partition ('||partition_name||');'
from dba_segments where tablespace_name in (select tablespace_name from dba_tablespaces  where tablespace_name like '%DATA%${tmp_year}%') and segment_type in ('TABLE PARTITION') and rownum<10;
spool off;
EOF

有的朋友可能疑惑为什么不用db link直接比较,因为使用db link来指定具体的分区就不支持了。
select count(*) from TEST.TEST_SERVER_LOG@db_link partition (SERVER_LOG_20120410);
ORA-14100: partition extended table name cannot refer to a remote object
要想突破,搜到的解决方法有两种,但是都果断放弃了,因为确实也没有太好的效果。
解决方式有两种:
1、  不使用partition选项,而在where的条件里进行数据筛选
2、  在源库设立视图,指向分区数据,通过dblink访问该视图
 另外通过创建远程表分区的同义词可以达到避过该错误的目的,但效果和全表扫描一样,并不能实现分区扫描,所以并无意义

时间: 2024-09-20 13:07:40

数据清理的遗留问题处理的相关文章

数据清理的遗留问题处理(二)

之前尝试了历史数据的清理,在逻辑层面清除了数据,可以参见 http://blog.itpub.net/23718752/viewspace-1814000/ 但是从物理层面来看,数据文件还是那么大,空间还是没有释放掉. 从计划的500多G数据空间清理到了90G SEGMENT_TYPE          SIZE_MB ------------------ ---------- INDEX PARTITION        260279 TABLE PARTITION        294120

介绍一款数据清理,数据重构软件--TIBCO CLARITY

问题描述 TibcoClarity是tibco公司一款数据清理,重构,整合的工具.它基于Google的OpenRefine开发,加入了多种商业软件(如Salesforce,Maketo)和数据库的整合,添加了地址校验,数据类型校验等功能TIBCOClarity–CloudEditionenablesbusinessuserstodiscover,profile,cleanse,andstandardizerawdatacollatedfromdisparatesourcesandprovideg

java实现数据备份和数据清理

问题描述 求用java实现的数据备份和数据清理完整代码? 解决方案 解决方案二:可以通过调用(远程)数据库的命令执行,处理数据命令执行的结果,比如数据库备份产生的文件期待更好的思路...解决方案三:劝你不要用Java来做这种系统管理方面的工作.解决方案四:该回复于2011-03-10 09:24:08被版主删除解决方案五:你这个问题没有说清楚啊?数据备份的数据源是什么?数据库?xml文件?excel文件?是否需要远程操作?解决方案六:谢谢各位啦!我是个大菜鸟,不懂!备份的数据库是sqlserve

大数据清理软件公司Trifacta融资3500万美元

Trifacta 是一家提供大数据清理软件服务的创业公司,公司刚获得一轮 3500 万美元的融资.Cathay Innovation.Accel Partners.Greylock Partners 和 Ignition Partners 都参与了本轮融资.到目前为止,公司的融资总额已达 7600 万美元.公司主要利用这轮融资进一步拓展公司业务. 一直以来,杂乱的.非结构化的数据都是企业数据治理的心腹之患.尽管许多企业竭尽所能保留下来了各种客户.内部流程及运营方面的数据,但是将这些裸数据变成可供

MySQL数据清理的需求分析和改进

昨天帮一个朋友看了MySQL数据清理的问题,感觉比较有意思,具体的实施这位朋友还在做,已经差不多了,我就发出来大家一起参考借鉴下. 为了保证信息的敏感,里面的问题描述可能和真实情况不符,但是问题的处理方式是真实的. 首先这位朋友在昨天下午反馈说他有一个表大小是近600G,现在需要清理数据,只保留近几个月的数据.按照这个量级,我发现这个问题应该不是很好解决,得非常谨慎才对.如果是通用的思路和方法,我建议是使用冷热数据分离的方式.大体有下面的几类玩法: exchange partition,这是亮点

一个60亿数据表改分区表+数据清理的改进思路

今天有个同学问我一个问题,也是一个实际的案例,我简单分析了一下,发现还是有很多可以考究的地方.仅做参考. 问题是,系统里目前有一个大表,因为历史数据的沉淀,目前有60多亿的数据,不是分区表,现在得到反馈说insert的操作比较满,想优化一下,同时把部分历史数据需要做一些清理. 对于这类操作,要求停机时间尽可能短,有什么好的办法. 对于这个问题看起来问题似乎是很明显的. 目前反应出的问题是Insert慢,可能有下面的几个原因. 1.表索引巨大,索引维护管理要复杂一些 2.表中可能含有一些冗余索引,

Spark Streaming 数据清理机制

前言 为啥要了解机制呢?这就好比JVM的垃圾回收,虽然JVM的垃圾回收已经巨牛了,但是依然会遇到很多和它相关的case导致系统运行不正常. 这个内容我记得自己刚接触Spark Streaming的时候,老板也问过我,运行期间会保留多少个RDD? 当时没回答出来.后面在群里也有人问到了,所以就整理了下.文中如有谬误之处,还望指出. DStream 和 RDD 我们知道Spark Streaming 计算还是基于Spark Core的,Spark Core 的核心又是RDD. 所以Spark Str

关于Redis的数据清理

我们数据平台中有使用Redis来给线上提供低延时(20毫秒以内)的高并发读写请求,其中最大的Redis使用了阿里云的Redis集群(256G),存储的记录超过10亿,Key的有效期设置为15天,每天写入的记录大概5000万左右,QPS大概在6万左右.由于过期Key的产生速度大于Redis自动清理的速度,因此在Redis中会有大量过期Key未被及时清理. 为什么有过期的Key未被清理呢?这个得先熟悉一下Redis的删除策略. Redis常用的删除策略有以下三种: 被动删除(惰性删除):当读/写一个

保监会大数据清理2500家中介

今年4月开启的新一轮保险中介整顿正在紧张地进行,各个保险中介公司要向保监会提供其财务状况.机构发展.人员队伍.经营制度建设.风险隐患等情况.公开数据显示,全国共有保险兼业代理机构(银邮等网点渠道)20余万家,专业中介机构2500多家,个人代理人超过300万名,2013年中介渠道保费占全国总保费的比例达80%. 一位业内人士告诉记者:"保险公司最为常见的违规行为就是非法套取费用,保险公司通过将直销业务虚挂中介渠道.编制虚假营销人力.虚列业务及管理费等方式套取费用.其中,虚挂应收保费.虚开中介发票.