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