Home >Database >Mysql Tutorial >Oracle表维护 快速备份删除数据

Oracle表维护 快速备份删除数据

WBOY
WBOYOriginal
2016-06-07 15:38:44940browse

我知道oracle表分区,不过那是数据库设计阶段的事情,目前是远水解不了近渴。 当前的数据库表,要求保留一个月数据,且表存在大量录入更新,不存在程序删除。 为了解决频繁查询和更新的瓶颈,我在oracle内根据需要创建了索引。但是随着数据量的增加,一个半

我知道oracle表分区,不过那是数据库设计阶段的事情,目前是远水解不了近渴。

当前的数据库表,要求保留一个月数据,且表存在大量录入更新,不存在程序删除。

为了解决频繁查询和更新的瓶颈,我在oracle内根据需要创建了索引。但是随着数据量的增加,一个半月数据就要超千万,此时就算有索引,对高并发的查询和更新来说,让然有所拖累。

为了解决这个问题,我一般一个月会进行一次数据库维护,主要工作就是备份oracle数据库内一个月以前的数据,然后从表内删除这些数据。

之前的做法是这样的:

1:备份数据

create table MY_TEMP as select * from TEMP t where t.create_time 
<p>?</p>
<p>2:删除数据</p>
<pre class="brush:php;toolbar:false">delete from TEMP t where t.create_time 
<p>?</p>
<p>3:重建索引</p>
<pre class="brush:php;toolbar:false">alter index indexname rebuild;

?

当然这几步都需要停止业务防止新录入数据,且oracle执行时耗时较久。

?

那么今天我尝试了一个新的办法。

1:备份要留下的数据

create table MY_TEMP as select * from TEMP t where t.create_time > to_date('2014-08-01 00:00:00','yyyy-mm-dd hh24:mi:ss');

?

2:重命名表,也把原来表整个备份

rename TEMP to TEMP_0701_0801;
rename MY_TEMP to TEMP;

?

3:新增索引和主键

create index TEMP_INDEX_NAME on TEMP (COL_NAME);
alter table TEMP add constraint TEMP_PK primary key (ID);

?

4:删除数据

delete from TEMP_0701_0801 t where t.create_time > to_date('2014-08-01 00:00:00','yyyy-mm-dd hh24:mi:ss');

?

比较耗时的是1和3,虽然4也很耗时,但是因为是独立出来的表,已经和业务无关,所以可以随时删除且对系统无影响。

但是要注意的是,新表是没有任何主键、外键、索引的,这里要重新创建

?

按照之前的方法,每次耗时都以小时计算,慢的要死。

按照后来办法去做以后,除了删数据没做,1、2、3下来,几百万数据表,半个小时搞定了

?

请您到ITEYE看我的原创

或支持我的个人博客,地址:http://www.javacui.com

?

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn