【摘要】Oracle數(shù)據(jù)庫(kù)在各個(gè)領(lǐng)域中的應(yīng)用越來越廣泛,數(shù)據(jù)庫(kù)的維護(hù)工作就相當(dāng)?shù)闹匾?,尤其是表空間維護(hù)也成為了數(shù)據(jù)庫(kù)維護(hù)中的重要內(nèi)容。本文主要從表空間的維護(hù)方面介紹了維護(hù)數(shù)據(jù)庫(kù)過程中需要定期檢查的內(nèi)容,在影響數(shù)據(jù)庫(kù)和應(yīng)用程序之前進(jìn)行處理,從而保證系統(tǒng)的正常運(yùn)行。
【關(guān)鍵詞】oracle;表空間;維護(hù)
Oracle數(shù)據(jù)庫(kù)在各個(gè)領(lǐng)域中的應(yīng)用越來越廣泛,數(shù)據(jù)庫(kù)的維護(hù)工作就相當(dāng)?shù)闹匾绕涫潜砜臻g維護(hù)也成為了數(shù)據(jù)庫(kù)維護(hù)中的重要內(nèi)容。表空間的問題主要體現(xiàn)在應(yīng)用系統(tǒng)的反饋錯(cuò)誤信息和數(shù)據(jù)庫(kù)的告警信息上,管理員可以依據(jù)這些錯(cuò)誤和告警信息來發(fā)現(xiàn)問題,并作相應(yīng)的處理。這就要求我們加強(qiáng)對(duì)表空間的監(jiān)控,通過對(duì)ORACLE數(shù)據(jù)庫(kù)表空間的定期檢查和處理,數(shù)據(jù)庫(kù)本身得到了很好的優(yōu)化,性能得到了提高,從而也保證了相應(yīng)的應(yīng)用程序運(yùn)行的穩(wěn)定。
一、相關(guān)概念
表空間是數(shù)據(jù)庫(kù)的邏輯劃分,一個(gè)表空間只能屬于一個(gè)數(shù)據(jù)庫(kù)。所有的數(shù)據(jù)庫(kù)對(duì)象都存放在指定的表空間中,但主要存放的是表,所以稱作表空間。表空間的作用主要體現(xiàn)在以下四個(gè)方面:第一,控制擁護(hù)所占用的表空間份額;第二,控制數(shù)據(jù)庫(kù)所占用的磁盤空間;第三,靈活放置表空間,提高數(shù)據(jù)庫(kù)的輸入輸出性能;第四,大表的排序操作;第五,日志文件與數(shù)據(jù)文件分開放,提高數(shù)據(jù)庫(kù)安全性。
表空間分為四種類型:一是系統(tǒng)表空間,包括system和SYSAUX表空間,存放oracle的數(shù)據(jù)字典及其數(shù)據(jù);二是大表空間、小表空間,包括用戶數(shù)據(jù)(表、索引);三是臨時(shí)表空間,用于存放臨時(shí)數(shù)據(jù);四是回退表空間,用于數(shù)據(jù)庫(kù)的并發(fā)存取控制。定期檢查各種不同類型表空間的情況,是避免數(shù)據(jù)庫(kù)錯(cuò)誤的有效方法。
二、檢查自由表空間情況以及表空間的碎片大小
一般在系統(tǒng)使用較長(zhǎng)時(shí)間后,表空間的連續(xù)塊被多次的修改與刪除等操作后出現(xiàn)了許多的不連續(xù)的塊(叫碎片)。這樣就有可能出現(xiàn)表的擴(kuò)展所需要的連續(xù)塊不能滿足的情況。為了避免這樣的情況發(fā)生而導(dǎo)致擴(kuò)展失敗,管理員要經(jīng)常查詢系統(tǒng)的表空間情況。其實(shí),平常管理最關(guān)心就是表空間的總量、最大字節(jié)、使用多少、碎片多少等。下面語(yǔ)句可以查詢出所有表空間的自由空間、總空間數(shù)、已用空間、自由百分比及最大塊的字節(jié)數(shù)。
select substr(a.tablespace_name,1,13) tablespace,
round(sum(a.total1)/1024/1024,1) Total,
round(sum(a.total1)/1024/1024,1)-round(sum(a.sum1)/1024/1024,1) used,
round(sum(a.sum1)/1024/1024,1) free,
round(sum(a.sum1)/1024/1024,1)*100/round(sum(a.total1)/1024/1024, 1) pct_free,
round(sum(a.maxb)/1024/1024,1)largest,
max(a.cnt) fragment
from (select tablespace_name,0 total1, sum(bytes) sum1,
max(bytes) MAXB,
count(bytes) cnt
from dba_free_space
group by tablespace_name
union
select tablespace_name, sum(bytes) total1, 0, 0, 0 from dba_data_files
group by tablespace_name) a
group by a.tablespace_name
如果發(fā)現(xiàn)表空間的碎片已經(jīng)嚴(yán)重到影響了數(shù)據(jù)庫(kù)的運(yùn)行,則考慮對(duì)該表空間進(jìn)行擴(kuò)展或重建。
三、檢查臨時(shí)表空間
與一般表空間管理相似,臨時(shí)表空間需要經(jīng)常監(jiān)控。以確保在處理大型事務(wù)時(shí)有足夠的空間提供使用。Oracle臨時(shí)表空間主要用來做查詢和存放一些緩沖區(qū)數(shù)據(jù)。臨時(shí)表空間消耗的主要原因是需要對(duì)查詢的中間結(jié)果進(jìn)行排序。在維護(hù)這個(gè)臨時(shí)表空間的時(shí)候,要注意幾個(gè)情況:臨時(shí)表空間設(shè)置不當(dāng);查詢的時(shí)候使用的表過多或者語(yǔ)句使用不當(dāng);表索引沒有建立或者設(shè)置不當(dāng)?shù)鹊取a槍?duì)這些情況,需要對(duì)查詢的語(yǔ)句和索引進(jìn)行優(yōu)化,并檢查臨時(shí)表空間的配置,以避免出現(xiàn)表空間暴漲的情況。還有一點(diǎn)最重要的就是要為臨時(shí)表空間保留足夠的硬盤空間。
四、刪除表空間
當(dāng)表空間中所有數(shù)據(jù)都不再需要時(shí),可以考慮將該表空間刪除。一般是,除了SYSTEM表空間不允許刪除外,其他的表空間都可以刪除。只要用戶具有DROP TABLESPACE權(quán)限即可進(jìn)行表空間的刪除操作。Oracle提供DROP TABLESPACE命令來完成對(duì)表空間的刪除。實(shí)際上僅是從數(shù)據(jù)字典和控制文件中將該表空間的有關(guān)信息去掉,并沒有真正刪除該表空間所對(duì)應(yīng)的數(shù)據(jù)文件。刪除不用的數(shù)據(jù)文件的工作有DBA在操作系統(tǒng)下完成。一旦表空間被刪除,則該表空間的數(shù)據(jù)是不可恢復(fù)的。所以建議DBA在進(jìn)行表空間的刪除前,最好要進(jìn)行表空間的備份操作。然后再進(jìn)行表空間的刪除。還需要注意的是,不能刪除SYSTEM表空間和包含有用的對(duì)象的表空間。
參考文獻(xiàn)
[1]George Koch, Kevin Loney. Oracle8 完全參考手冊(cè)[M].機(jī)械工業(yè)出版社1998.8
[2]Kevin Loney, Marlene Theriault. Oracle9i DBA 手冊(cè)[M].機(jī)械工業(yè)出版社2002.5
[3]Jiawei Han, Micheline Kamber. 數(shù)據(jù)挖掘概念與技術(shù)[M].機(jī)械工業(yè)出版社2001.8
[4]Dennis Shasha, Philippe Bonnet. Database Tuning[M].Morgan Kaufmann Publishers,2002