| 導購 | 订阅 | 在线投稿
分享
 
 
 

講解Oracle數據庫逐漸增大時的歸檔處理

來源:互聯網  2008-06-14 05:54:20  評論

問:在數據庫日漸龐大時應該如何進行歸檔?

答:以下是一些解決的思路:

1.新建一個表空間存放各表的曆史數據。

1.1寫一個存儲過程搬數據,數據搬遷到曆史表後,在基表中將搬遷的數據刪除。

2.定期將曆史數據exp到磁帶中去做永久保存。

3.曆史數據exp之後,可以清空各曆史數據表。這樣,表空間的大小實際上是很容易伸縮及控制的。

在這個過程當中,我們可以看到基本的數據由于可以定期清理到曆史數據表,繼而再清理到磁帶。因此,數據庫不會越來越大。方便備份及減少查詢時間。

具體的實現過程如下:

1.創建臨時表:

CREATE GLOBAL TEMPORARY TABLE SCOTT.ARCHIVE_ROWS

(

CROWID VARCHAR2(20 BYTE),

PRIMARYKEY VARCHAR2(15 BYTE)

)

ON COMMIT PRESERVE ROWS

/

2.創建歸檔表:

sql>create table emp_archive as select * from emp_b;

3.創建歸檔記錄表:

CREATE TABLE SCOTT.ARCHIVE_LOG

(

TABLENAME VARCHAR2(50 BYTE),

RECORDCOUNT NUMBER,

UPDATEDATE DATE

)

LOGGING

NOCOMPRESS

NOCACHE

NOPARALLEL

MONITORING

/

4. procedure:

CREATE OR REPLACE PROCEDURE archive_emp

(maxarchiverow number) IS /* 定義歸檔的記錄數*/

v_crowid archive_rows.crowid%type; /* 存放基表的rowid*/

intLoop number; /* 記數器*/

v_primarykey archive_rows.PRIMARYKEY%type;

CURSOR C_ARCH_EMP IS

SELECT * FROM ARCHIVE_ROWS; /* 創建遊標*/

BEGIN

DELETE FROM ARCHIVE_ROWS; /*先清空臨時表*/

COMMIT;

INSERT INTO ARCHIVE_ROWS

SELECT ROWID,'' FROM EMP_B WHERE ROWNUM < MAXARCHIVEROW;

COMMIT; /*將基表中指定行數的rowid插入臨時表*/

INTLOOP:=0;

OPEN C_ARCH_EMP;

LOOP FETCH C_ARCH_EMP INTO V_CROWID,V_PRIMARYKEY;

INTLOOP:=INTLOOP+1;

EXIT WHEN C_ARCH_EMP%NOTFOUND;

INSERT INTO EMP_ARCHIVE SELECT * FROM EMP_B WHERE ROWID=V_CROWID;

/*根據rowid,將數值插入到歸檔表中*/

COMMIT;

DELETE FROM EMP_B WHERE ROWID=V_CROWID; /*將基表已歸檔數據刪除*/

COMMIT;

IF MOD(INTLOOP,200)=0 /*以200行爲界記錄歸檔情況*/

THEN

INSERT INTO ARCHIVE_LOG VALUES('EMP_B',INTLOOP,SYSDATE);

COMMIT;

END IF;

END LOOP;

END ARCHIVE_EMP;

/

問:在數據庫日漸龐大時應該如何進行歸檔? 答:以下是一些解決的思路: 1.新建一個表空間存放各表的曆史數據。 1.1寫一個存儲過程搬數據,數據搬遷到曆史表後,在基表中將搬遷的數據刪除。 2.定期將曆史數據exp到磁帶中去做永久保存。 3.曆史數據exp之後,可以清空各曆史數據表。這樣,表空間的大小實際上是很容易伸縮及控制的。 在這個過程當中,我們可以看到基本的數據由于可以定期清理到曆史數據表,繼而再清理到磁帶。因此,數據庫不會越來越大。方便備份及減少查詢時間。 具體的實現過程如下: 1.創建臨時表: CREATE GLOBAL TEMPORARY TABLE SCOTT.ARCHIVE_ROWS ( CROWID VARCHAR2(20 BYTE), PRIMARYKEY VARCHAR2(15 BYTE) ) ON COMMIT PRESERVE ROWS / 2.創建歸檔表: sql>create table emp_archive as select * from emp_b; 3.創建歸檔記錄表: CREATE TABLE SCOTT.ARCHIVE_LOG ( TABLENAME VARCHAR2(50 BYTE), RECORDCOUNT NUMBER, UPDATEDATE DATE ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING / 4. procedure: CREATE OR REPLACE PROCEDURE archive_emp (maxarchiverow number) IS /* 定義歸檔的記錄數*/ v_crowid archive_rows.crowid%type; /* 存放基表的rowid*/ intLoop number; /* 記數器*/ v_primarykey archive_rows.PRIMARYKEY%type; CURSOR C_ARCH_EMP IS SELECT * FROM ARCHIVE_ROWS; /* 創建遊標*/ BEGIN DELETE FROM ARCHIVE_ROWS; /*先清空臨時表*/ COMMIT; INSERT INTO ARCHIVE_ROWS SELECT ROWID,'' FROM EMP_B WHERE ROWNUM < MAXARCHIVEROW; COMMIT; /*將基表中指定行數的rowid插入臨時表*/ INTLOOP:=0; OPEN C_ARCH_EMP; LOOP FETCH C_ARCH_EMP INTO V_CROWID,V_PRIMARYKEY; INTLOOP:=INTLOOP+1; EXIT WHEN C_ARCH_EMP%NOTFOUND; INSERT INTO EMP_ARCHIVE SELECT * FROM EMP_B WHERE ROWID=V_CROWID; /*根據rowid,將數值插入到歸檔表中*/ COMMIT; DELETE FROM EMP_B WHERE ROWID=V_CROWID; /*將基表已歸檔數據刪除*/ COMMIT; IF MOD(INTLOOP,200)=0 /*以200行爲界記錄歸檔情況*/ THEN INSERT INTO ARCHIVE_LOG VALUES('EMP_B',INTLOOP,SYSDATE); COMMIT; END IF; END LOOP; END ARCHIVE_EMP; /
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有