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)缩短实例恢复的时间,
实例恢复要把实例异常关闭前没有写到硬盘的脏数据通过日志进行恢复。
如果脏块过多,实例恢复的时间也会过长,
检查点的发生可以减少脏块的数量,从而减少实例恢复的时间。

 

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;

 

 

学习参考:

   https://blog.csdn.net/fengeh/article/details/25159953

   //ORA-12986问题

   https://blog.csdn.net/luckyman100/article/details/15218747

  //CHECKPOINT

 https://www.cnblogs.com/andy6/p/5819997.html

 https://blog.csdn.net/s630730701/article/details/51986556/

 //Oracle中关于恢复unused列的方法

 https://blog.csdn.net/nanaranran/article/details/69944077

https://blog.csdn.net/weixin_34378767/article/details/90249780

posted @ 2021-01-12 13:15  小窝蜗  阅读(6943)  评论(0编辑  收藏  举报