oracle 10G 清理垃圾表,oracle10g清理垃圾
一次邊學邊乾的oralce營運經曆, 步步是坑啊。
起因: 一套運行了5年的系統, 客戶近期反映比較慢。
瞭解了一下運行環境: windows2003(16G + 4核) + jdk(32) +tomcat 和 window2003(4G + 雙核) + oracle10G
現場現象: 客戶操作出入庫單據, ie一片空白持續很長時間, 體驗十分糟糕, 用客戶的話說: 這一天做單的工作量對得起這份薪水。
初步判斷: tomcat串連資料庫時候十分緩慢, 而且tomcat各種cpu,記憶體顯示都比較正常, 所以把問題定位在資料庫上, 然後探索資料庫端由很多垃圾資料表, 大概4~5w張。
於是開始先刪除這些表, 因為自己對oracle也不是很熟悉, 於是就理所當然的想著像sql server一樣, drop table搞定。
select table_name from user_tables where table_name like 'T\_%' escape '\'
首先通過語句查詢出表名一共4.5w個。 然後使用文字編輯器, 產生了4.5W個語句格式如下:
DROP TABLE tablename;
使用青蛙執行指令檔5個小時總算執行完畢, 以為一切ok。 這是客戶提醒說他依稀記得, 這樣drop表好像還需要執行個語句, 不然表依然在資料庫。
聽後比較愕然, 度娘下, 結果真是。 表被drop 以後, 其實只是放到了一個叫垃圾箱的地方, 還要做記憶體回收。 再度娘下:
4.5w個表名轉換了語句:
PURGE TABLE tablename;
或者drop的時候使用
DROP TABLE tablename PURGE;
使用青蛙執行指令檔20個小時語句執行2.7w, oralce直接宕機了。 這時候發現硬碟滿了。
這時候客戶想看看是什麼佔用空間比較大, 刪除了這麼多表 , 依然這麼大的空間。很不正常。
select * from dba_tablespaces;
發現一個叫UNDOTBS01 的資料表空間99%的使用率, 佔用33G。
於是又問度娘, 度娘說:
這個資料表空間是:復原資料表空間,用來存放撤消操作的記錄
我勒個去, 真是漲姿勢了, 以前最多也就是oralce裡面寫個相容oralce的語句, 還真的沒有搞過這種營運的工作的。那個汗啊~~~~~~~~~, 不過幸好有度娘@#@#¥@
分析下這個原因, 硬碟滿了, 這個資料表空間無法增長了, 已經無法執行其他動作了。 慢、宕機也就很正常了。
--create undo tablespace undotBS2 datafile 'C:\UNDOTBS1.DBF' size 100m autoextend on next 100m;--alter system set undo_tablespace=undotBS2;--drop tablespace undotbs1 including contents;
執行這些語句, 重啟oralce執行個體。 然後執行
select * from dba_tablespaces;
發現UNDOTBS2 生效, 佔100M。
這時候, oralce操作明顯變快了。登陸系統、做業務也明顯速度提升。
總結:
oralce清理表, 需要加PURGE參數方可生效, 否則只是放到記憶體回收站:
DROP TABLE tablename PURGE;
復原表也需要適時清理,雖然可以自增長, 但是這個資料表空間過大, 影響oralce的運行效率:
--create undo tablespace undotBS2 datafile 'C:\UNDOTBS1.DBF' size 100m autoextend on next 100m;--alter system set undo_tablespace=undotBS2;--drop tablespace undotbs1 including contents;