Oracle在线重定义法迁移表
适用于迁移不能停止的业务表
本文是作者根据官方文档研究所得,步骤清晰,所需调用过程的属性全面,方便使用时进行取舍:
原理:增量物化视图刷新
步骤:
**1、验证表能否被在线重定义,两种方式皆可,但是至少要满足一种
(验证能否使用PK重定义)
begin
dbms_redefinition.can_redef_table('用户','要迁移的表名',dbms_redefinition.cons_use_pk);
end;
(验证能否使用rowid重定义)
begin
dbms_redefinition.can_redef_table('用户','要迁移的表名',dbms_redefinition.cons_use_rowid);
end;
2、如果上面有一种满足,则开始创建中间表(按照原表的ddl语句创建好,用户需一致,但是表空间需要指定为目标表空间):
create table scott.tb_cablecheck_equipment_bak2(
equipment_id NUMBER,
equipment_code VARCHAR2(100),
equipment_name VARCHAR2(500),
area_id NUMBER,
address VARCHAR2(500),
res_type_id VARCHAR2(10),
res_type VARCHAR2(20),
manage_area_id VARCHAR2(100),
manage_area VARCHAR2(100),
management_mode CHAR(10))……..
3、开始重定义,null代表所有的列名与原表一样,如果符合使用PK,则使用PK,否则应该改成rowid
begin
dbms_redefinition.start_redef_table('用户','原表','中间表',null,dbms_redefinition.cons_use_pk);
end;
4、复制依赖对象到中间表,后几个参数分别表示从原表复制索引、触发器、约束、权限、某一项复制出错跳过、复制过程中的出错数目、复制统计信息、复制物化视图日志(各选项凭需要取用,完毕后需检查num_errors的值,有错一定要查看,酌情处理)
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
('用户', '原表','临时表', DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors, TRUE, TRUE);
END;
5、同步中间表,保证数据一致性,最大化减少最后一步的锁表时间
begin
dbms_redefinition.sync_interim_table('用户','原表','中间表');
end;
6、完成重定义(会短暂锁表,大部分已经由上一步刷新)
begin
dbms_redefinition.finish_redef_table('用户','原表','中间表');
end;
7、检查原表的表空间是否改变,检查其数据、结构、索引等依赖对象是否正确
优点:按照这种方法,迁移时间估计会比较长,但不会阻塞原表的dml操作,除了最后一步。如果迁移失败(中途出错),原表也不会受到影响。建议先找一个不重要的表测试一下可行性与速度,中止重定义:
DBMS_REDEFINITION.ABORT_REDEF_TABLE (
uname IN VARCHAR2,
orig_table IN VARCHAR2,
int_table IN VARCHAR2,
part_name IN VARCHAR2 := NULL);