Oracle如何快速删除表字段
1.SET UNUSED
1.原理
清除掉字典信息(撤消存储空间),不可恢复
2.执⾏⽅式
第⼀步:
alter table table1 set unused (column1,column2);
或者
alter table table1 set unused column1;
alter table table1 set unused column2;
第⼆步:
alter table drop unused columns checkpoint 1000;
3.需要了解的
(1)set unused不会真地删除字段
(2)set unused系统开销⽐较⼩,速度较快,
所以可以先set unuased,然后在系统负载较⼩时,再drop。
如系统负载不⼤,也可以直接drop。
(3)不要马上drop column,应该先set unused让column⽆法使⽤,
避开系统尖峰时间再来处理删除栏位⾥的资料,
要注意的是⼀但你set unused column,这个栏位是⽆法再回复使⽤的
(4)若你的栏位有⼀百万笔资料,我们应该避免⼀次写⼊那么多的undo log,
所以我准备每删除⼀千笔资料就commit⼀次
alter table t1 drop unused columns checkpoint 1000;
在离峰的时间进⾏这样的动作,应该可以避免 ORA-01562 的错误发⽣
4.遇到的问题
ALTER TABLE test1 DROP UNUSED COLUMN CHECKPOINT 5;
ORA-12986: columns in partially dropped state. Submit ALTER TABLE DROP COLUMNS CONTINUE
Cause: An attempt was made to access a table with columns in partially dropped state (i.e., drop column operation was interrupted).    Action: Submit ALTER TABLE DROP COLUMNS CONTINUE to complete the drop column operation before accessing the table.在强制取消的时候遇到的(加了CHECKPOINT)
解决办法:
1.在未执⾏完毕前,⽤ shutdown abort强制关闭数据库(如果⽤shutdown immediate就看不到效果,它会等到执⾏完毕才会关闭数据库)
2.ALTER TABLE test1 DROP COLUMNS continue 继续执⾏,直到执⾏结束
5.遇到4的问题在慎重的情况下使⽤(特别注意)
由于表数据庞⼤,操作是遇到4的情况,在不在乎表数据是否需要的情况下,可以尝试
truncate table xx
再执⾏ALTER TABLE test1 DROP COLUMNS continue
注意这个情况本⾝就违背了你使⽤UNUSED 的⽬的,如果是废弃的表可以使⽤,
否则不要考虑使⽤这个,使⽤了DDL你数据就很难恢复了,除⾮你有备份。
2.检查点(checkpoint)
1.定义
checkpoint是数据库的⼀个内部事件,
检查点激活时会触发数据库写进程(DBWR),
将数据缓冲区⾥的脏数据块写到数据⽂件中。
2.⽬的
(1)保证数据库的⼀致性,这是指将脏数据写出到硬盘,
保证内存和硬盘上的数据是⼀样的。
(2)缩短实例恢复的时间,
实例恢复要把实例异常关闭前没有写到硬盘的脏数据通过⽇志进⾏恢复。
如果脏块过多,实例恢复的时间也会过长,drop删除表
检查点的发⽣可以减少脏块的数量,从⽽减少实例恢复的时间。
3.恢复列
//设置了表字段不可⽤
alter table xs set unused column AGE;
//查询表对象获取OBJECT_ID
SELECT OBJECT_ID,OBJECT_NAME FROM USER_OBJECTS;
//查询表的列,估计要登录管理员或者特定的账号才有权限
select col#,intcol#,name from col$ where obj#=52717;
//查询列的数量
select cols from tab$ where obj#=52717;
//将列状态恢复到前⼀个状态
update col$ set col#=intcol# where obj#=52717;
//增加列数量
update tab$ set cols=cols+1 where obj#=52717;
//给列重新命名
update col$ set name='AGE' where obj#=52717 and col#=3;
update col$ set property=0 where obj#=52717;
//是shutdown abort + startup的组合,即强制关闭数据库+ 正常启动数据库,想快速重启数据库时胆⼦⼤的⼈⽤的 startup force;
备注:估计这样的好处是可以恢复数据,如下按照下⾯的操作估计列的数据就恢复不了了
alter table test add cloum type;
学习参考:
//ORA-12986问题
//CHECKPOINT
//Oracle中关于恢复unused列的⽅法