範圍分割槽在資料過期化處理中的應用

2021-07-23 10:01:41 字數 3412 閱讀 2050



範圍分割槽在資料過期化處理中的應用

在海量資料的資料庫設計中,可能需要提前考慮資料庫中資料儲存的時間問題,或者叫做資料的過期化問題,它的意思是,由於資料量太大,在資料庫中只保留特定時長的資料,比如1年,1年前的資料就需要做過期化(歸檔化)處理。

這時候範圍分割槽就能發揮非常好的作用,就像上面的例子一樣,我們可以將表做成每月1個分割槽,超過1年的分割槽可以按照使用者的需求來進行處理。

對於過期的資料,通常有以下幾種處理方式。

1.刪除

處理歷史資料的方式相當簡單,直接刪除過期的分割槽以及分割槽上的資料(如果每個分割槽分配乙個表空間,那麼可以連帶表空間也刪除,直接釋放磁碟空間),釋放空間。

在實際生產過程中,為了減少人為干預導致的失誤,可以寫乙個定時任務來完成這樣的操作,比如下面的例子。

還是上面的那個表,每個月乙個分割槽。

createtable sale_data

(sale_id  number(5),

salesman_namevarchar2(30),

sales_amount  number(10),

sales_date    date)

partition by range(sales_date)

partition sales_2009_1 values lessthan(to_date('01/02/2009','dd/mm/yyyy')),

partition sales_2009_2 values lessthan(to_date('01/03/2009','dd/mm/yyyy')),

partition sales_2009_3 values lessthan(to_date('01/04/2009','dd/mm/yyyy')),

partition sales_2009_4 values lessthan(to_date('01/05/2009','dd/mm/yyyy')),

partition sales_2009_5 values lessthan(to_date('01/06/2009','dd/mm/yyyy')),

partition sales_2009_6 values lessthan(to_date('01/07/2009','dd/mm/yyyy')),

partition sales_2009_7 values less than(to_date('01/08/2009','dd/mm/yyyy')),

partition sales_2009_8 values lessthan(to_date('01/09/2009','dd/mm/yyyy')),

partition sales_2009_9 values lessthan(to_date('01/10/2009','dd/mm/yyyy')),

partition sales_2009_10 values lessthan(to_date('01/11/2009','dd/mm/yyyy')),

partition sales_2009_11 values lessthan(to_date('01/12/2009','dd/mm/yyyy')),

partition sales_2009_12 values lessthan(to_date('01/01/2010','dd/mm/yyyy')),

partition sales_2010_1 values lessthan(to_date('01/02/2010','dd/mm/yyyy'))

使用下面這樣的乙個儲存過程,通過建立乙個job,我們就可以定時刪除1年以前的舊分割槽了。

create or replace procedure drop_partitionas

v_part_name   varchar2(100);    --要新增分割槽表的名稱字首

v_over_time   number;         --過期時間間隔

v_err_num     number;        --ora錯誤號

v_err_msg     varchar2(100); --錯誤描述

begin

--得到時間最早的分割槽

select min(partition_name) into v_part_name

from user_tab_partitions where table_name='sale_data';

--取得時間最早的分割槽到當前的時間間隔

selectmonths_between(sysdate,to_date(substr(min(partition_name),7,8),'yyyy-mm')) into v_over_time

from user_tab_partitions where table_name='sale_data';

--刪除最早的分割槽

if v_over_time>12 then

execute immediate 'alter table sale_datadrop partition '||v_part_name;

end if;

exception

when others then

v_err_num := sqlcode;

v_err_msg := substr(sqlerrm, 1, 100);

dbms_output.put_line('執行錯誤: ' ||v_err_num || '錯誤描述: ' || v_err_msg);

end drop_partition;

建立乙個job,每天執行一次。

declare

job number;

begin

dbms_job.submit(job,'drop_partition;',sysdate,'sysdate+1');

end;

這樣就可以定時刪除過期的分割槽資料了。

2.移植到離線資料庫中,作為歷史資料處理

對於一些olap系統,業務上通常會考慮對資料進行過期化處理,將過期的資料移植到另外的資料庫中儲存,這種資料庫稱作離線資料庫或者歷史資料庫。

將一部分業務切換到歷史資料庫中,然後對歷史資料進行分析處理,比如資料探勘、報表分析等。

下面舉乙個具體的案例來說明這個過程。

(2)每個分割槽建立在單獨的表空間上。

(3)將分割槽的表空間匯出,並複製到離線資料庫伺服器上。

(4)在離線資料庫伺服器上將複製過來的資料匯入到離線資料庫中。

這樣就完成了乙個分割槽資料的過期化處理。

3.從資料庫中移除,轉入歸檔

在實際生產環境中,第三種對歷史資料的處理方式是對歷史資料歸檔,它是一種折中的方式,在成本上比離線資料庫要低,但是還能保留歷史資料。此處理方式需要乙個海量的儲存空間來儲存過期的資料。

對於過期資料的歸檔處理,通常有兩種方式:

(1)對於資料是通過對平面檔案或者專有格式檔案載入的方式入庫的,比如資料倉儲,則可以考慮在載入的同時,將這些資料檔案歸檔到目標儲存上面,完成資料備份。

Oracle 已存在資料的大表 改 分割槽表

建立表,插入測試資料 create table create table lxw test cdate date,t1 number,t2 varchar2 2 insert into lxw test cdate,t1,t2 values to date 2020 07 01 yyyy mm dd...

oracle表範圍分割槽的測試例子

create sequence create sequence sq1 minvalue 1 maxvalue 999999999999999999999999999 start with 2001 increment by 1 cache 20 序列的建立 create table testpat...

oracle表範圍分割槽的測試例子

create sequence create sequence sq1 minvalue 1 maxvalue 999999999999999999999999999 start with 2001 increment by 1 cache 20 序列的建立 create table testpat...