閑談重做Oracle日志文件
經(jīng)過長時間學(xué)習(xí)重做Oracle日志文件,于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會你更多東西。在Windows 2000 Server中可以通過“性能”工具來監(jiān)控磁盤的活動,對VMS和Unix多數(shù)磁盤進行每秒40次以上的I/O是過度的,應(yīng)當(dāng)給予調(diào)節(jié)。
分布I/O以解決磁盤爭用
(1)存放重做Oracle日志文件
重做Oracle日志文件是順序?qū)懭氪疟P的,所以盡量不要將重做Oracle日志文件跟數(shù)據(jù)文件存放在同一個磁盤上。如果不得不將數(shù)據(jù)文件跟重做Oracle日志文件存放在同一個磁盤上,那么該盤空間不應(yīng)該屬于SYSTEM表空間、RBS表空間,以及其它如DATA和INDEX表空間。它們都會直接導(dǎo)致與重做Oracle日志文件之間的爭用,而且還會有增加寫入日志數(shù)據(jù)庫讀寫速度的可能性。
(2)存放檔案日志文件
在進行大量數(shù)據(jù)事務(wù)處理的時候,數(shù)據(jù)庫選擇歸檔功能將會導(dǎo)致其與重做日志磁盤間的爭用。而且當(dāng)檔案重做Oracle日志文件出現(xiàn)空間不夠時,將會引起數(shù)據(jù)庫的凍結(jié)。所以檔案日志文件不能與SYSTEM表空間、RBS表空間或INDEX表空間段存儲在同一設(shè)備上,也不能與任何聯(lián)機重做Oracle日志文件存放在同一設(shè)備上。它只允許與一些小的、靜態(tài)的文件存放到一起。
(3)存放數(shù)據(jù)代碼文件
為了減少數(shù)據(jù)庫文件和數(shù)據(jù)庫代碼之間的爭用,應(yīng)避免將數(shù)據(jù)庫文件作為代碼文件而放在同一磁盤中。如果數(shù)據(jù)文件不得不放在同一磁盤設(shè)備中,那么應(yīng)當(dāng)將最不常用的數(shù)據(jù)文件放在那兒。
(4)減少非Oracle文件的I/O
(5)優(yōu)化DBWR進程爭用
數(shù)據(jù)庫寫進程(DBWR)、日志寫進程(LGWR)與歸檔進程(ARCH)三種后臺處理進程可以空閑存取磁盤上的數(shù)據(jù)庫文件。這三個進程之間常因同時讀寫爭用而導(dǎo)致I/O爭用,而DBWR進程還有自我爭用發(fā)生的可能。通過對DBWR賦值可以有效的解決DBWR的自我爭用問題。
通常在操作系統(tǒng)中為每個實例創(chuàng)建多個DBWR進程,并通過初始參數(shù)DB_WRITERS來確定DBWR的個數(shù)。建議將賦值在n與2n之間,這里的n是指磁盤的個數(shù)。如果賦值不能很好的解決DBWR的內(nèi)部爭用,可以通過異步I/O來減少DBWR的內(nèi)部爭用。由于I/O進程的執(zhí)行都是并行的,所以異步的I/O僅需一個DBWR即可解決問題。
(6)表數(shù)據(jù)存放策略
將大表的數(shù)據(jù)劃分成若干小部分,并將這些部分存儲在不同磁盤的不同數(shù)據(jù)文件中。用create tablespace創(chuàng)建表空間,在datafile子句中指定數(shù)據(jù)文件,每個文件應(yīng)在不同的盤上。如我們需要在三個磁盤上存放數(shù)據(jù)文件,可使用如下代碼:
- create tablespace trip
- datafile 'file_on_disk_1' size 500k,
- 'file_on_disk_2' size 500k,
- 'file_on_disk_3' size 500k;
(7)指定表空間和表大小
用“create table”創(chuàng)建表,在tablespace子句中指定表空間,在storage子句中指定表的大小,如以下SQL語句:
- create table striptab (
- ……
- Tablespace strip 1500k
- Storage (initial 495k next 495k minextent 5 pctincreate 0);
(8)清除其它的磁盤I/O
數(shù)據(jù)塊空間的分配因數(shù)據(jù)庫中的數(shù)據(jù)被存放在數(shù)據(jù)塊中,因此如何分配數(shù)據(jù)塊中的空間將直接影響其存取性能。
當(dāng)用update語句更新一行數(shù)據(jù)時,可能使該行的數(shù)據(jù)增加,從而使其在一個數(shù)據(jù)塊內(nèi)容納不下。這時,Oracle就尋找能容納下該行的數(shù)據(jù)塊,如果能找到這樣的塊,便把該行全部存入新塊中(這稱為行移動)。如果找不到能容納該整行的數(shù)據(jù)塊,則把該行切成若干片,然后把每一片分別存放在一個數(shù)據(jù)塊中,于是這樣的行被存放在多個數(shù)據(jù)塊中,這種行稱為鏈接行。查詢一個鏈接行則需要多次I/O操作,從而產(chǎn)生I/O瓶頸,這將降低數(shù)據(jù)的存取性能。以上介紹重做Oracle日志文件。
【編輯推薦】