小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统。Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就无法完成了。
而且,对于被大量DML语句访问的表,幸运的是,Oracle从9i版本开始提供了在线重定义表功能,通过调用DBMS_REDEFINITION包,可以在修改表结构的同时允许DML操作。
今天执行转分区表操作时,使用在线重定义,去吃个饭的功夫,表空间满了,报错如下:
天真的我以为,添加表空间数据文件后,再次执行就可以了!结果,报错:
大概意思就是已经被重定义了,无法再次重定义,怎么破呢?
✅ 解决方案:
--查询表对应的物化视图
select mview_name from user_mviews;
--删除物化视图的日志
drop materialized view log on T;
--终止之前的重定义
exec DBMS_REDEFINITION.abort_redef_table('LUCIFER','T','T_PAR');
--再次进行重定义
EXEC DBMS_REDEFINITION.START_REDEF_TABLE('LUCIFER','T','T_PAR',NULL,DBMS_REDEFINITION.CONS_USE_ROWID);
上述中,T 代表原表,T_PAR 代表中间分区表,LUCIFER 代表用户!
本次分享到此结束啦~
如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。
❤️ 技术交流可以 关注公众号:Lucifer三思而后行 ❤️