一次邊學邊干的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 '\'
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; --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; --alter system set undo_tablespace=undotBS2; --drop tablespace undotbs1 including contents;