历史数据的清理方法

1. 首先要制定数据清理的方法和策略,具体内容略。
2. 对现网数据量进行摸底调查,哪些表须要清理并整理出。
3. 具体清理。
3.1.  分区表数据清理:
    先断定该分区表的索引是LOCAL索引仍是GLOBAL索引,这涉及到如何对分区表进行数据清理。
先经过以下语句来查看分区表上创建的索引类型:
 select t.table_name,i.index_name,i.table_owner
   from dba_indexes i,dba_tables t
  where i.table_name = t.table_name
     and t.partitioned='yes'
     and i.partitioned='no';数据库

3.1.1 将全局索引修改成本地索引的方法见下:
    首先要删除原有分区表的全局GLOBAL索引,也分为两种状况,一种是索引是主键,一种是索引不是主键。
3.1.1.1 索引为主键的状况,先将原主键及索引删除:
alter table 表名 drop constraint 约束名 cascade;ide

而后再建立主键及本地索引,注意local和online参数:
  alter table 表名 add constraint 约束名
primary key (列名, 列名2) using index local online
TABLESPACE 表空间
PCTFREE等原有的存储参数
nologging;oop

3.1.1.2 另外一种索引不为主键的状况,先将索引删除:
dorp index 索引名;排序

而后再用下面语句为该分区表建立本地索引:
    create index 索引名 on 表名.列名 local online
TABLESPACE 表空间
PCTFREE等原有的存储参数
nologging;索引

3.1.2 确认全部的分区表上的索引均为本地索引后,按以下方法进行分区数据的清理,并恢复分区的最高水位值到初始点:
alter table 表名 truncate partition 分区名;域名

3.2. 非分区表的数据清理:
有3种清理数据的方法:
3.2.1 使用循环delete的方法对表数据进行删除。
例:
declare
begin
    loop
      delete from 表名
       where 日期字段 < sysdate-180   --或流水号字段,时间根据实际状况调整
         and rownum<5000;    --每次删5000条
      exit when SQL%ROWCOUNT=0;
    commit;
    end loop;
exception
    when others then
      rollback;
    return;
end;it

3.2.2 使用“create …… as select * from…… where……”备份原表,再将原表truncate,
    最后将备份表的数据插回原表insert …… select *,实例省略。io

这个方法的主线是:
Rename备份表->新建表(不建索引)->数据插回->重建索引;
或者:
备份表->truncate原表->原表索引约束失效,删除索引->数据插回->原表索引约束激活,重建索引
   
3.2.3 将A表数据exp出为A.dmp文件,再drop掉A表,重建A表后再将A.dmp数据imp回去(通常用于清理高水位表,若是要实现清理数据,则导出dmp时增长query条件过滤旧数据,原理和方法2同样)。
例:
导出数据:
exp userid=域名/密码@SID file= e:\temp\A.dmp log= e:\temp\dmp.log buffer=1046000000 tables=A query=' where 字段名>sysdate-180'
drop原表:   drop table A;
导回原表:
imp userid=域名/密码@SID file= e:\temp\A.dmp ignore=y fromuser=用户名 touser=用户名 log= e:\temp\dmp.logtable

    对于首次执行清理,若是要清理大量数据,只保留少许数据时用第二种方法,该方法除了能够清理数据外,还可以解决高水位的问题;可是若是清理的数据量不大,或者已经进入持续的自动阶段,则用第一种方法。class

操做前说明:
    对于将本地索引重建为分区索引的,还须要注意如下事项:
一、 要有足够的临时表空间,由于重建索引须要对数据进行排序,要占用大量的临时表空间。

--用下面语句来检查索引的数据库空间大小:
select segment_name,segment_type,sum(bytes)
 from dba_segments
where segment_type like 'INDEX%' 
   and segment_name='索引名'
group by segment_name,segment_type;

--用下面语句检查临时表空间大小:
select * from dba_temp_files;

--用下面语句检查当前是否在使用临时表空间:
select * from v$sort_usage;

--下面语句用于增长临时表空间: alter database tempfile '/dev/tab_temp' resize  200M;  

相关文章
相关标签/搜索