|
问:在数据库日渐庞大时应该如何进行归档?
答:以下是一些解决的思路:
◆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;
/
|