公司在开发一个新系统来代替旧系统,数据要从旧系统的oracle数据库迁移到新系统的postgresql数据库里。为了减少迁移数据量,决定备份一下旧数据库,然后把三年前的数据都从数据库里删掉。要删除的有三十多张表,总共几十亿条数据,只有周六一天时间,时间紧任务重。为了顺利完成任务,和DBA一起制定了删除计划。 为了提高删除速度,主要采取了以下方针。 1,oracle设定为非归档模式·(noarchivelog) 2,对于只需要保留少量数据的表,采用下面的方式。
新建一个临时表,把要保留的数据插入到临时表里truncate 旧表insert into 旧表 select * from 临时表drop 临时表
3,对于分区表,如果有些分区是全部删除的,就TRUNCATE PARTITION。 例:ALTER TABLE xxx TRUNCATE PARTITION yyy UPDATE GLOBAL INDEXES; 如果有些分区只需要保留少量数据,采用跟第2条一样的临时表方法。 4,一条delete语句删除的数据条数太多的话,修改删除条件,分成几次删。 5,对于删除逻辑比较复杂的数据,新建中间表,提前用select语句把删除对象筛选出来插到中间表里,简化删除逻辑。
删除当天,虽然出现了一些意外状况,好在有惊无险,最终在预想时间内完成了任务。 顺便分享下删除大量数据的delete语句的实际处理时间。 从3.5亿条数据的表里删除1.1亿数据:26分钟 从5000万条数据的表里删除1400万数据:2分钟 从1.1亿条数据的表里删除7000万数据:10分钟 从9000万条数据的表里删除3000万数据:8分钟