程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle10G清理垃圾表

oracle10G清理垃圾表

編輯:Oracle教程

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;
--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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved