前提:每种数据归档的方法都需要根据业务场景进行选择并进行仔细的测试,没有绝对的优胜劣势。
为保证数据的安全性、完整性,在归档前都必须对数据进行备份, 备份的方法可以有:
1. create table as select ;
2. expdp 数据泵导入导出;
3. rman 数据库全备。
归档无分区表:
1. 定期自动化程序Delete 清理数据;
2. 表重命名后,新建表,再通过方法将数据回写;
3. 将表改成分区表,以分区表的方案进行数据归档。
A. 可通过在线重定义的方式进行普通表改造;
注意:
若在线重定义大表,在某些情况下可能会触发Oracle BUG,在线重定义前必须做好测试工作。
B. 可以先创建一张表后,将数据写入新表后RENAME。
注意:
普通表改造成分区表必定涉及索引的改造,索引的改造需要综合考虑(Global or Local):
1. 原表索引的特性;
2. 业务使用索引的方式(=, like, 范围(这里范围必定是小范围,因为索引只适用于取小部分数据(索引的适用场景)));
3. 表上的字段distinct值;
归档分区表:
1. 分区DROP/ TURNCATE/DELETE:
A. 分区有数据且有全局索引,为了全局索引失效,必须重建/更新索引
1. drop 分区
alter table table_name drop partition partition_name;
alter index global_index_name rebuild parallel 8; alter index global_index_name parallel 1;
-- 或者alter table table_name drop partition partition_name update indexes;2. truncate 分区
ALTER TABLE table_name TRUNCATE PARTITION partition_name;alter index global_index_name rebuild parallel 8;alter index global_index_name parallel 1;
-- 或者
ALTER TABLE table_name TRUNCATE PARTITION partition_name update indexes;3. delete 分区数据后,drop/truncate 分区
DELETE FROM table_name PARTITION (dec98); alter table table_name drop partition partition_name;
ALTER TABLE table_name TRUNCATE PARTITION partition_name ; 注意: 如何选择上述三种方法,主要有如下几方面考虑:
1. 若分区的数据量占整张表数据量的比例高建议先drop/truncate 后再重建索引;
2. 若分区的的数据量占整张彪数据量的比例非常小建议直接delete 操作;
3. With asynchronous global index maintenance, this operation is a metadata-only operation. 全局索引内的数据并没有删除,可以结合索引碎片化问题一起rebuild。可以收集统计信息进行对比:
EXEC DBMS_STATS.gather_index_stats(ownname => &ownname, indname => &indname, estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, degree => DBMS_STATS.AUTO_DEGREE);注意:索引碎片化和索引空间无法回收问题,到底是采用rebuild online(根据表数据去重建索引) 还是rebuild(根据索引数据去重建索引) 要具体问题具体分析。 在表DML操作多时,rebuild online可能会非常非常慢,但rebuild online 可能会加快索引查询的效率,特别在范围扫描的时候。
B. 分区无数据有全局索引,无需重建/更新索引
1. drop 分区
alter table table_name drop partition partition_name;2. truncate 分区
alter table table_name truncate partition partition_name;2. 直接进行分区交换:
该段内容可能有误,先撤下,等C.H.验证完毕后再补上
其它注意事项:
1. Delete 操作要看表的结构和被引用的对象,需要结合业务情况综合考虑,择期、择条件进行删除,有以下情况要慎重选择delete 操作:
1). 外键关联非常多,特别还存在外键无索引的情况;
2). delete where 条件选择性非常差的;
3). 表上DML操作特别多的表;
4). 容易被忽略的一点,表上DELETE 触发器,若DELETE 触发器是对业务有影响的,那么也要慎重评估对业务的影响。
参考文档:
1. 官方TRUNCATE 分区文档: https://docs.oracle.com/database/121/VLDBG/GUID-7772BC2E-2ECD-4136-9348-0D8D0F6BFB26.htm




