過期資料的定期清理機制來提高系統穩定性

kuqlan發表於2011-10-21

最近應用系統響應速度偶爾出現緩慢,今天應用日誌報瞭如下錯誤:

2011-10-20 11:55:18,757 ERROR - 2011-10-20 11:55:18 org.apache.tomcat.util.threads.ThreadPool logFull

????: All threads (75) are currently busy, waiting. Increase maxThreads (75) or check the servlet status

從該日誌看系統慢的時候做了重複操作,導致等待的執行緒越來越多,最終達到最大執行緒數。

當系統效能出現問題時,我們很多時候考慮購買高檔裝置來解決日益猛增的業務資料和需求。但是對過期資料(所謂垃圾資料)不建立合理的歸檔清理機制,恐怕再好的硬體也是無法保證應用的穩定性。

[@more@]

如下是清理歸檔過程相關的SQL指令碼的簡單模板,供大家參考:

1、確定系統中資料量猛增而影響效能的大表

2、為此建立歸檔機制,即清空某某日之前資料

定義了以上兩點後,就需要Oracle的相關命令來實現清理歸檔。如下為案例模板:

--清理歸檔之前的備份

expdp system/system directory= EXPDIR dumpfile=test_dmpback.dmp logfile=test_dmpback.log schemas=test

exp system/system owner=test file=/backup/test.dmp log=/backup/test.log direct=y statistics=none buffer=20480000 recordlength=65534

--根據大表的表間關係找到需要清理歸檔的時間所對應的表的主鍵ID

select * from test1 d where d.test_id = 1268

select * from test2 c where c.test2 = 12686; -- test2_Id > 47088

--如果沒有提前準備好的Directory則新建一個:

$sqlplus / as sysdba

create directory so_dumpdir as '/backup/dmp';

grant read,write on directory DUMPDIR to system;

--對需要清理的表進行清理(只匯出今後需要用到的)

expdp system/system@ora DIRECTORY=DUMPDIR DUMPFILE=test1.dmp tables=(test.test1) content=all query="where test_id>1268" LOGFILE=exptest1_1.log

expdp system/system@xjboss1 DIRECTORY=DUMPDIR DUMPFILE=test2.dmp tables=(test.test2) content=all query="where record_id>47088" LOGFILE=test2_2.log

--為了避免匯入過程中產生表鎖衝突而無法匯入,需要將應用停止

--開始匯入剛匯出過的有用的資料

impdp system/system@ora DIRECTORY=DUMPDIR DUMPFILE=test1.dmp TABLE_EXISTS_ACTION=truncate REMAP_SCHEMA=test:test logfile=imptest.log;

impdp system/system@ora DIRECTORY=DUMPDIR DUMPFILE=test2.dmp TABLE_EXISTS_ACTION=truncate REMAP_SCHEMA=test:test logfile=imptest_2.log;

在匯入過程中可能會報ORA-39153錯誤:

ORA-39153: Table "test"."test1" exists and has been truncated. Data will be loaded but all dependent metadata will be skipped due to table_exists_action of truncate

--應用的啟用

--匯入後的檢查

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18841027/viewspace-1055845/,如需轉載,請註明出處,否則將追究法律責任。

相關文章