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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM