历史数据的清理方法
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;
然后再创建主键及本地索引,注意local和online参数:
alter table 表名 add constraint 约束名
primary key (列名, 列名2) using index local online
TABLESPACE 表空间
PCTFREE等原有的存储参数
nologging;
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;
3.2.2 使用“create …… as select * from…… where……”备份原表,再将原表truncate,
最后将备份表的数据插回原表insert …… select *,实例省略。
这个方法的主线是:
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.log
对于首次执行清理,如果要清理大量数据,只保留少量数据时用第二种方法,该方法除了可以清理数据外,还能够解决高水位的问题;但是如果清理的数据量不大,或者已经进入持续的自动阶段,则用第一种方法。
操作前说明:
对于将本地索引重建为分区索引的,还需要注意以下事项:
1、 要有足够的临时表空间,因为重建索引需要对数据进行排序,要占用大量的临时表空间。
--用下面语句来检查索引的数据库空间大小:
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;
--用下面语句检查当前是否在使用临时表空间:
相关新闻>>
- 发表评论
-
- 最新评论 更多>>