数据清理的遗留问题处理

最近处理一个遗留问题,感觉手动修复真是让人抓狂,所以花了点力气写了一个半自动的脚本,总算从这个繁琐的工作中解放出来了。
问题的背景如下图所示。
存在一个很大的统计库(有容灾备库),还有一个历史统计库,历史统计库中都是相对较老的数据。
统计库中的数据相对要新一些,但是数据持续增长,空间使用太多,业务中使用历史数据的频率不高,把历史数据清理了又怕影响业务,就需要把数据暂时挪到历史库中,所以历史库中的数据都是几年前的老数据,而统计库中的都是近几年相对较新的数据。
比如一个分区表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访问该视图
 另外通过创建远程表分区的同义词可以达到避过该错误的目的,但效果和全表扫描一样,并不能实现分区扫描,所以并无意义


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-1814000/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-1814000/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值