Database Configuration and IO Issues
Oracle進程與files
1、performance guidelines
1)對于吞吐量較大的OLTP應用中,當使用dictionary管理表空間的方法時,由于所有的extent分配時都會要訪問dictionary,從而造成了沖突。而使用本地管理表空間的方法避免了這類沖突,從而提高了并發性。
2)在本地管理表空間中,使用自動空間管理方法,用位圖記錄不同blocks的使用情況。也提高了相應的速度。
3)當創建一個user后,就會分配一塊所需的磁盤排序所需臨時表空間。這些排序區應該從其他database object中分離開,如果沒有給user分配臨時表空間,則其所需的排序區域將從system表空間分配。
4)tables和indexes應該被分開存儲在不同表空間中。因為indexes和tables經常被同時讀寫。
5)對于含有LONG或LOB數據類型的tables,應該被分配在不同的表空間中。
6)適當創建多個臨時表空間。
2、distributing files across devices:
1)應該將redo log和data file存放在不同的磁盤上,從而在一定程度上降低i/o的壓力。
2)對于規模較大的表,如果分不同的區域并發訪問也可以提高性能partition。
3)盡可能排除非Oracle Server進程對database file的I/O操作。對此可以使用v$filestat動態的觀察。
4)了解應用程序主要的I/O操作,合理安排disk布局,從而提高性能。
3、表空間的作用:其中system表空間主要是用于存放sys創建的data dictionary objects。其他users不可使用該表空間。需要明確的是,packages和database triggers對象等都是data dictionary的一部分。rollback segments應該排他使用其rollback segment。undo segments可以只能存在在undo tablespace中。
4、監控I/O狀態的工具
1)v$filestat視圖。
select phyrds, phywrts, d.name from v$datafile d, v$filestat f where d.file# = f.file# order by d.name;
2)statspack
5、file striping
1)對OS的striping,通過使用硬件或是軟件層次上的striping,可以將同一個文件的不同blocks放在不同的devices上,例如raid技術。提供一定的冗余的同時增大I/O性能的。
此外,設置適當的DB_FILE_MULTIBLOCK_READ參數。
2)手工的striping:可以在多個不同的disk創建tablespace。隨后將不同的tables、indexes分配到不同的 tablespace中。此外,可以創建對象時使用MINEXTENTS句柄其值大于1,這樣每個extents都將略小于striped data files。也可直接給extents進行分配定位(但我認為這會給管理帶來麻煩):alter table tablename allocate extent ( datafile ‘filename’ size 10M);
對于這塊爭用的問題,使用手動的striping還是比較有效的。
6、對全表掃描的tuning:當對某個disk有較高的讀寫操作時,多是由于沒有適當調節sql的原因。
查看全表掃描的次數:
select name, value form v$sysstat where name like ‘%table scans%‘;
獲得的結果中’table scans ( long tables)’的值如果較大,則需要考慮調節sql或是增加適當的indexes。
long tables (長表)指多于4個塊的表, short table(短表)指等于或小于4個塊的表。
初始化參數DB_FILE_MULTIBLOCK_READ_COUNT決定了在全表掃描時,一次I/O操作中讀入的最大的database blocks。它可以改變全表掃描時需要的I/O的次數。該參數的設置應該受到OS限制的I/O的上限的約束。此外此參數還可以在session級別進行 調節。對它的調節可以先查看完成每個表的全表掃描掃描多少blocks。從而從整體上得到較好的設置。要注意的是,對cost-based 優化將會使用該參數評估使用全表掃描的代價,從而判斷是否使用全表掃描。
對于全表掃描,Oracle提供了視圖v$session_longops來進行監控。
select sid, serial#, opname, to_char(start_time,’HH24:MI:SS’) as starttime, (sofar/totalwork)*100 as percent_complete from v$session_longops;
7、checkpoints
什么是checkpoint?
checkpoint是一個數據庫事件,它將已修改的數據從高速緩存刷新到磁盤,并更新控制文件和數據文件。
什么時候發生checkpoint?
我們知道了checkpoint會刷新臟數據,但什么時候會發生checkpoint呢?以下幾種情況會觸發checkpoint。
1.當發生日志組切換的時候
2.當符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target參數設置的時候
3.當運行ALTER SYSTEM SWITCH LOGFILE的時候
4.當運行ALTER SYSTEM CHECKPOINT的時候
5.當運行alter tablespace XXX begin backup,end backup的時候
6.當運行alter tablespace ,datafile offline的時候;
1)它可以引起DBWn的I/O操作,同時會更新datafile header和control file中的scn等信息。
頻繁的進行checkpoint可以縮短instance恢復的時間,但是會降低Oracle運行的性能。
在LGWR寫redo log文件時,當一個group 被寫滿時,需要進行log switch是,會先發起一個checkpoint,這就意味著:DBWn會先將所有的與該redo log有關的dirty data blocks寫入datafile,隨后CKPT會修改datafile header和控制文件。
checkpoint并不會影響其他工作。如果DBWn進程尚未完成checkpoint一個file,此時LGWR需要在此需要這個file時,LGWR不得不等待。
2)對checkpoint性能的監控與調節:
** checkpoint的監控主要是查看alert.log文件。可以將LOG_CHECKPOINT_TO_ALERT參數設置true,從而記錄checkpoint的開始結束時間。
** 通過調節online redo log files的大小來降低因日志切換引起的checkpoint;
** 增多redo log 的groups,從而延長LGWR覆蓋寫的時間,從而避免引起不必要的LGWR等待。
** 具體可調節的參數有:
– FAST_START_IO_TARGET
– LOG_CHECKPOINT_INTERVAL
– LOG_CHECKPOINT_TIMEOUT
– DB_BLOCK_MAX_DIRTY_TARGET
– FAST_START_MTTR_TARGET
如果在OLTP系統中,SGA設置過大,同時checkpoint稀少,可能引起disk沖突。所以也要適當增加checkpoint的頻率。
貌似我的理解是除了user發起的alter database checkpoint命令外,主要兩類checkpoint,時間間隔型和fast-start類型的。
通過查看v$instance_recovery視圖,查看參數設置對DB recovery時間的影響,其中:
RECOVERY_ESTIMATED_IOS:顯示了基于fast-start的設置,在recovery時,需要處理的data blocks。
ACTUAL_REDO_BLKS:顯示了當前要進行recovery時所需的redo blocks。
TARGET_REDO_BLKS:在recovery時,最大的需要處理的redo blocks。是下面四個指標的最小值。
LOG_FILE_SIZE_REDO_BLKS:在recovery時,為了確保log switch不會等待checkpoint,要處理的redo blocks數量。
LOG_CHKPT_TIMEOUT_REDO_BLKS:在recovery時滿足log_checkpoint_timeout,需要處理的redo blocks的數量。
LOG_CHKPT_INTERVAL_REDO_BLKS:在recovery時為了滿足log_checkpoint_interval,需要處理的redo blocks的數量。
FAST_START_IO_TARGET_REDO_BLKS:在recovery時為了滿足fast_start_io_target,需要處理的redo blocks的數量。
對checkpoint的設置主要圍繞的中心就是recovery用時,和它引起的I/O是否會造成性能的問題。
8、redo log的groups和members的設計
一般會把同一組的不同成員放置在不同的disk上,如果在歸檔模式下,則要考慮將歸檔日志放到不同的磁盤上。為redo log選擇適當的size。同時在一定程度上增加log file的groups,從而避免不必要的等待。
對redo log的監控視圖主要有:V$LOGFILE, V$LOG, V$LOG_HISTORY,此外還可結合v$system_event獲得的結果。
9、歸檔日志的設置
當開啟歸檔模式時,可以考慮將不同的groups放在不同的disks上(當然不一定是每個group一個磁盤),同時與歸檔文件的存放也分離,這樣使LGWR進程寫的disk和ARCn進程讀的disk不在一個上。
可以從視圖V$ARCHIVED_LOG上獲得動態的歸檔log文件的信息。V$ARCHIVE_DEST當前歸檔進程的destinations的狀態信息。(由參數log_archive_dest_n設置的destination)
監控診斷ARCn的工具主要是使用視圖:V$ARCHIVED_LOG, V$ARCHIVE_PROCESSES, V$ARCHIVE_DEST。
對歸檔的調節,可以使用LOG_ARCHIVE_MAX_PROCESSES參數指定最大可以創建的歸檔進程。
如果預計歸檔工作量較大,可以通過定期運行下面語句來獲得其他進程來分擔。
alter system archive log all to ‘directory_name’;
注意:9i中,當DBWR_IO_SLAVES參數的設置大于0,Oracle會自動將ARCn的進程數設置為4。(但是我的11g貌似DBWR_IO_SLAVES=0,而ARCn也是4個多啊,大概是設了其他的參數)
設置適當的fast_start_io_target,
posted on 2010-01-12 12:30 gdufo 閱讀(496) 評論(0) 編輯 收藏 所屬分類: Database (oracle, sqlser,MYSQL)