歷史數據的清理方法

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;  

相關文章
相關標籤/搜索