資料庫歷史資料有效管理

djb1008發表於2011-07-28

1.1. 應用場景

業務系統執行一段時間後,與時間有關的資料庫庫表中儲存有多年前的資料,這些資料平時基本很少需要變更,但資料記錄數量巨大,讀寫效能逐月下降,同時備份的壓力也增加(備份集越來越大,備份時間越來越長)。

[@more@]

1.2. 有效管理方法

首先,將歷史資料與當前資料進行有效的分割,分割的方法很多,這裡列舉兩個普遍的做法:

A.重新建立與當前資料表表結構相同的歷史表,將歷史的資料插入到這些歷史表中,然後建立檢視,將當前表與歷史表union起來,這些歷史表是建立在歷史表空間上的。這種情況,應用程式尤其是查詢統計的程式需要做一定的變更。

B.使用分割槽表,將歷史資料相關的分割槽存放或者遷移到歷史資料庫表空間上。

其次,更改歷史表空間的狀態為readonly,歷史表空間可以建立在低檔的儲存或者光碟庫上,不需要訪問時,也可以offline它。我們在將歷史資料表空間狀態設定為readonly狀態後,對歷史表空間進行一次全備份(怕麻煩的話,就直接做一次全庫備份就可以了),在這之後我們使用rman進行資料庫全庫備份時,可以使用選項skip readonly(/offline)來跳過歷史表空間的備份,大大減少了備份的壓力。同時因為大部分資料從主力表遷移到歷史表中,資料庫庫表的記錄量回到了正常狀態,資料庫執行效能也有了很大的提高。

1.3. 操作例項

這裡演示第一種資料切割的方法,建立相同表結構的歷史表。

1.3.1. 建立相關的表,插入測試資料

SQL>Conn / as sysdba

SQL>select username,default_tablespace from dba_users;

USERNAME DEFAULT_TABLESPACE

------------------------------------------------------------------------------------------

AIDU USERS

建立歷史資料存放用的表空間aidu_ls

SQL>create tablespace aidu_ls datafile '/oracle/oradata/aidu_ls01.dbf' size 10m extent management local segment space management auto logging

Tablespace created.

SQL>conn aidu/aiduteset

建立測試表,插入部分資料

SQL>Create table test01(id number(10,2),rq date,remark varchar2(100),primary key(id)) tablespace users;

SQL>alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS' ;

SQL>insert into test01 values(1,'2010-01-01','test for read only tablespace');

SQL>insert into test01 values(2,'2010-02-01','test for read only tablespace');

SQL>insert into test01 values(3,'2010-03-01','test for read only tablespace');

SQL>insert into test01 values(4,'2010-04-01','test for read only tablespace');

SQL>insert into test01 values(5,'2010-05-01','test for read only tablespace');

SQL>insert into test01 values(6,'2010-06-01','test for read only tablespace');

SQL>insert into test01 values(7,'2010-07-01','test for read only tablespace');

SQL>insert into test01 values(8,'2010-08-01','test for read only tablespace');

SQL>insert into test01 values(9,'2010-09-01','test for read only tablespace');

SQL>insert into test01 values(10,'2010-10-01','test for read only tablespace');

SQL>insert into test01 values(11,'2010-11-01','test for read only tablespace');

SQL>insert into test01 values(12,'2010-12-01','test for read only tablespace');

SQL>insert into test01 values(101,'2011-01-01','test for read only tablespace');

SQL>insert into test01 values(102,'2011-02-01','test for read only tablespace');

SQL>insert into test01 values(103,'2010-03-01','test for read only tablespace');

SQL>commit;

建立歷史表,指定儲存到歷史資料表空間aidu_ls.

SQL> create table test01_ls tablespace aidu_ls as select * from test01 where trunc(rq,'YY')

SQL>alter table test01_ls add primary key(id) using index tablespace aidu_ls;

SQL> select table_name,tablespace_name from all_tables where owner='AIDU';

TABLE_NAME TABLESPACE_NAME

------------------------------------------------------------------------------------------

TEST01 USERS

TEST01_LS AIDU_LS

透過上面的查詢,可以看到歷史資料表aidu_ls建立在歷史資料表空間aidu_ls上了。

1.3.2. 建立檢視,訪問所有的資料

SQL>Create view test01_all as select * from test01 union all select * from test01_ls;

1.3.3. 設定歷史資料表空間aidu_ls為只讀(read only)

SQL>alter tablespace aidu_ls read only;

1.3.4. 執行全庫備份(或者表空間備份,或者表空間檔案複製備份)

Rman target /

Run{

Allocate channel d1 type disk;

Backup full database format ‘/oracle/rman/full_db_1_%U.bak’;

Release channel d1;}

1.3.5. 以後進行資料庫全備份時,可以跳過read only的表空間

Rman target /

Run{

Allocate channel d1 type disk;

Backup full database skip readonly format ‘/oracle/rman/full_db_%U.bak’;

Release channel d1;}

備份的時候就自動跳過read only狀態下的歷史表空間,減少了備份的壓力。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/32980/viewspace-1053140/,如需轉載,請註明出處,否則將追究法律責任。

相關文章