项目背景
今天业务方要求对某张近亿级的大表只保留今年的业务数据,今年以前的业务数据全部删除,不再使用。
系统环境
oracle11.2.0.4 两台单节点ADG,主库对我司自己的微应用提供读写,备库对其他业务单位的应用提供读访问,备库上坏了一块磁盘,备库同步经常出现延迟。
目前该业务表今年的数据只有1200万条记录,总记录8000多万。
实现方式
1、批量多次少量删除业务数据
2、重新创建一张业务表A,将B表今年的业务数据插入到该新表中,将B表rename B_bak,将A表rename B.
两个方式对比
第一种方式的优点
1、不需要新建表且不需要确认该表是否存储其他引用对象
2、不会中断业务
第一种方式的缺点
1、需要进行多次批量删除,一次性删除可能导致undo争用且会生产大量的redo并传递的备库上。
2、delete方式删除仍有高水位问题
第二种方式的优点
1、产生的redo日志少
2、没有高水位问题
第二种方式的缺点
1、需要清楚表上引用对象有哪些
2、会中断写访问的业务,在rename时读写访问都会受到几秒钟的影响。
与业务人员沟通后,决定采用第二种方式来删除数据。
删除前的准备工作
技术层面
1、确认该表是否是分区表
2、确认该表是否有触发器、索引、序列和视图引用
3、评估数据删除所用时间
业务层面
1、在做insert into a select * from b where time>