Oracle - Log buffer 的相关设置
生活随笔
收集整理的這篇文章主要介紹了
Oracle - Log buffer 的相关设置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師的教學視頻:
http://v.youku.com/v_show/id_XMzk2MjQ5Mzc2.html
所做的教學視頻
1. 觸發LGWR 將log buffer里的數據寫入日志文件的條件:
???? 下圖這個就是lgwr進程了~
?
???? 1.1? commit語句
???? 1.2? 每隔3秒
???? 1.3 log buffer里面有大于1MB的數據未寫入日志文件
???? 1.4 log buffer里面有大于3分1的數據未寫入日志文件.
??? 1.5 DBWR需要寫入數據的SCN大于LGWR記錄的SCN, 就觸發LGWR寫入.
???? 1 - 4點之前都提過啦,也很容易理解.
???? 現在重點說下第5點:
???? Oracle 有1個機制, 就是在寫入臟buffer到dbf文件之前, 會保證把對應的日志先寫入日志文件, 也就說,修改日志總是會比源數據先寫入磁盤, 這就是write log header 機制.
???? 所以假如DBWR某個時刻需要將Buffer cache中若干個臟buffer寫入dbf文件, 但是對應這些buffer的日志還存在于log buffer時, 就會觸發LGWR先把log buffer里的數據寫入log files.
2. log優化建議
????? 在OLTP系統(要求實時相應度高)上, Redo log的寫操作主要是小型的, 串行的, 而且很頻繁.? 一般每次寫操作的大小只有幾KB, 而每秒產生的寫IO次數幾十次以上, 甚至達千余次. 所以Redo log 文件適合放在那些IPOS(每秒IO次數)高的磁盤上. IPOS僅僅達數百次的SATA 硬盤并不合適存放Redo log files.???? 另外由于redo log的寫操作是串行的, 所以對磁盤底層做條代化處理, 提升十分有限.
??????? 也就是redo log的寫操作有3個特點
??????? 1) 每次寫操作的大小很小, 一般只有幾K
??????? 2) 寫操作很頻繁. 每秒寫操作次數很高.
??????? 3) 寫操作是串行的, 幾乎不用尋道時間.
??????? 所以redo Log文件十分適合放在固態硬盤上(SSD), 容量不必太大, 因為歸檔后的文件可以放在其他硬盤.
??????? 而又因為寫操作是串行的, 所以raid 5 raid 6 對redo log的寫操作無任何意義, 但是raid 01 和 raid 10 還是ok的.
3. log buffer大小設置
????? 在9i及之前的版本, log buffer的大小一般設為3 MB.
??????? 10g 開始,? Oracle開始自動管理log buffer 的大小,? 但是有個規則, 就是令 "Fixed SGA Size" + "Redo Buffers" 的大小約等于 "Granule Size"大小的整數倍.
??????? 可以用下圖sql語句來查看上面3個參數的大小.
?
??????? 其中Granule在Oracle里面被成為粒度,? 上圖中粒度的大小就約為4MB了,? 那么假如當前的SGA大小是160MB,? 如果用戶將其設成161MB時,? Oracle實際上會設為164MB.?? SGA size必須是粒度大小的4倍啊.
??????? 而Redo Buffers就是 redo log buffer的大小啦,? 上圖的值約為7MB, 加上 Fixed SGA Size的大小約等于Granule size的倍數啦~
4. log files的大概結構.
???? 一般來講日志文件并不是一個大的文件, 而是分成3組(oracle默認) 如下圖
? LGWR 將數據從redo log buffer 寫入 logfiles 時, 首先會寫第一組, 第一組寫滿后,會寫第2組, 寫滿的那一組會移除去歸檔(壓縮備份). 不斷循環.
??? 所以實際上,? 裝載log files的固態硬盤大小足夠存放這個3組log files就ok了.,
??? 可以用如下語句來查看當前數據庫有log files分成多數組:
??? select * from v$log
? 可以見到上圖, 第3組的狀態是current, 也就是說LGWR正在往這組log files寫數據了.
?
?? 接下來觀察Members 這個字段, 他們的值都是1, 也就是指這3個組都只有1個成員(日志文件)了.
?? 可以從v$logfile 中查看對應的成員(具體日志文件):
?
?如上圖 見到,日志文件的物理地址了.?
? 而且在Group# 這個字段說明了它們分別是屬于哪1個日志組.
? 而實際上1個日志組是可以存有2個成員(兩個日志文件的), 那么這2個存在于同1個group的日志文件就是互相備份的關系了.
?? 之所以需要備份, 是因為對于數據庫來講, redo log日志相當重要, 甚至比dbf文件還重要, dbf文件可以丟失, 但redo log文件丟失了就嚴重了. 所以生產中一般對每1個group設置兩個成員, 分別存放與不同的磁盤當中, 就算其中1個磁盤掛了,? redo log還可以從另1個磁盤中找回來.
5. Redo log的一些配置
? 在生產中作為1個DBA有時候會需要執行下面命令來修改日志配置:
? 1. 增加1個日志組
? alter database add logfile group 5 '/opt/oracle/oradata/dbtest/redo05_1.log' SIZE 10M
?
? 2. 向1個日志組添加1個日志文件
? alter database add logfile member '/opt/oracle/oradata/dbtest/redo04_3.log' to group 4
?
? 3. 刪除1個日志組
? alter database drop logfile group 5
? 4. 刪除1個組里面的日志文件:
? alter database drop logfile? ('/opt/oracle/oradata/dbtest/redo05_1.log','/opt/oracle/oradata/dbtest/redo05_2.log')
????? 如果你需要將1個logfile 轉移到另1個磁盤, 那么可以執行第4條語句把這個logfile刪除, 然后執行第2條語句新建1個logifle. 路徑指向另1個磁盤就ok了.
?6.? REDO LOG 切換的時間應該盡可能的不低于10-20 分鐘
??? 我們都知道redo log files分組的, 當第一組寫滿時, 就會切換到另1個組,? 而在生產中我們希望10 - 20分鐘切換一次.
??? 也就是說盡量把從開始寫1個日志組到寫滿這個日志組的時間控制在10 ~ 20分鐘內,? 這就根據服務器的繁忙程度來調整了, 調整什么呢?? ... 調整日志文件大小啦~
???? 可以用如下命令來查看日志切換的時間:
select to_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time,SEQUENCE# from v$log_history
?? 如下圖:
每兩個first_time 的差就是切換時間啦.
?
http://v.youku.com/v_show/id_XMzk2MjQ5Mzc2.html
所做的教學視頻
1. 觸發LGWR 將log buffer里的數據寫入日志文件的條件:
???? 下圖這個就是lgwr進程了~
?
???? 1.1? commit語句
???? 1.2? 每隔3秒
???? 1.3 log buffer里面有大于1MB的數據未寫入日志文件
???? 1.4 log buffer里面有大于3分1的數據未寫入日志文件.
??? 1.5 DBWR需要寫入數據的SCN大于LGWR記錄的SCN, 就觸發LGWR寫入.
???? 1 - 4點之前都提過啦,也很容易理解.
???? 現在重點說下第5點:
???? Oracle 有1個機制, 就是在寫入臟buffer到dbf文件之前, 會保證把對應的日志先寫入日志文件, 也就說,修改日志總是會比源數據先寫入磁盤, 這就是write log header 機制.
???? 所以假如DBWR某個時刻需要將Buffer cache中若干個臟buffer寫入dbf文件, 但是對應這些buffer的日志還存在于log buffer時, 就會觸發LGWR先把log buffer里的數據寫入log files.
2. log優化建議
????? 在OLTP系統(要求實時相應度高)上, Redo log的寫操作主要是小型的, 串行的, 而且很頻繁.? 一般每次寫操作的大小只有幾KB, 而每秒產生的寫IO次數幾十次以上, 甚至達千余次. 所以Redo log 文件適合放在那些IPOS(每秒IO次數)高的磁盤上. IPOS僅僅達數百次的SATA 硬盤并不合適存放Redo log files.???? 另外由于redo log的寫操作是串行的, 所以對磁盤底層做條代化處理, 提升十分有限.
??????? 也就是redo log的寫操作有3個特點
??????? 1) 每次寫操作的大小很小, 一般只有幾K
??????? 2) 寫操作很頻繁. 每秒寫操作次數很高.
??????? 3) 寫操作是串行的, 幾乎不用尋道時間.
??????? 所以redo Log文件十分適合放在固態硬盤上(SSD), 容量不必太大, 因為歸檔后的文件可以放在其他硬盤.
??????? 而又因為寫操作是串行的, 所以raid 5 raid 6 對redo log的寫操作無任何意義, 但是raid 01 和 raid 10 還是ok的.
3. log buffer大小設置
????? 在9i及之前的版本, log buffer的大小一般設為3 MB.
??????? 10g 開始,? Oracle開始自動管理log buffer 的大小,? 但是有個規則, 就是令 "Fixed SGA Size" + "Redo Buffers" 的大小約等于 "Granule Size"大小的整數倍.
??????? 可以用下圖sql語句來查看上面3個參數的大小.
?
??????? 其中Granule在Oracle里面被成為粒度,? 上圖中粒度的大小就約為4MB了,? 那么假如當前的SGA大小是160MB,? 如果用戶將其設成161MB時,? Oracle實際上會設為164MB.?? SGA size必須是粒度大小的4倍啊.
??????? 而Redo Buffers就是 redo log buffer的大小啦,? 上圖的值約為7MB, 加上 Fixed SGA Size的大小約等于Granule size的倍數啦~
4. log files的大概結構.
???? 一般來講日志文件并不是一個大的文件, 而是分成3組(oracle默認) 如下圖
? LGWR 將數據從redo log buffer 寫入 logfiles 時, 首先會寫第一組, 第一組寫滿后,會寫第2組, 寫滿的那一組會移除去歸檔(壓縮備份). 不斷循環.
??? 所以實際上,? 裝載log files的固態硬盤大小足夠存放這個3組log files就ok了.,
??? 可以用如下語句來查看當前數據庫有log files分成多數組:
??? select * from v$log
? 可以見到上圖, 第3組的狀態是current, 也就是說LGWR正在往這組log files寫數據了.
?
?? 接下來觀察Members 這個字段, 他們的值都是1, 也就是指這3個組都只有1個成員(日志文件)了.
?? 可以從v$logfile 中查看對應的成員(具體日志文件):
?
?如上圖 見到,日志文件的物理地址了.?
? 而且在Group# 這個字段說明了它們分別是屬于哪1個日志組.
? 而實際上1個日志組是可以存有2個成員(兩個日志文件的), 那么這2個存在于同1個group的日志文件就是互相備份的關系了.
?? 之所以需要備份, 是因為對于數據庫來講, redo log日志相當重要, 甚至比dbf文件還重要, dbf文件可以丟失, 但redo log文件丟失了就嚴重了. 所以生產中一般對每1個group設置兩個成員, 分別存放與不同的磁盤當中, 就算其中1個磁盤掛了,? redo log還可以從另1個磁盤中找回來.
5. Redo log的一些配置
? 在生產中作為1個DBA有時候會需要執行下面命令來修改日志配置:
? 1. 增加1個日志組
? alter database add logfile group 5 '/opt/oracle/oradata/dbtest/redo05_1.log' SIZE 10M
?
? 2. 向1個日志組添加1個日志文件
? alter database add logfile member '/opt/oracle/oradata/dbtest/redo04_3.log' to group 4
?
? 3. 刪除1個日志組
? alter database drop logfile group 5
? 4. 刪除1個組里面的日志文件:
? alter database drop logfile? ('/opt/oracle/oradata/dbtest/redo05_1.log','/opt/oracle/oradata/dbtest/redo05_2.log')
????? 如果你需要將1個logfile 轉移到另1個磁盤, 那么可以執行第4條語句把這個logfile刪除, 然后執行第2條語句新建1個logifle. 路徑指向另1個磁盤就ok了.
?6.? REDO LOG 切換的時間應該盡可能的不低于10-20 分鐘
??? 我們都知道redo log files分組的, 當第一組寫滿時, 就會切換到另1個組,? 而在生產中我們希望10 - 20分鐘切換一次.
??? 也就是說盡量把從開始寫1個日志組到寫滿這個日志組的時間控制在10 ~ 20分鐘內,? 這就根據服務器的繁忙程度來調整了, 調整什么呢?? ... 調整日志文件大小啦~
???? 可以用如下命令來查看日志切換的時間:
select to_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time,SEQUENCE# from v$log_history
?? 如下圖:
每兩個first_time 的差就是切換時間啦.
?
總結
以上是生活随笔為你收集整理的Oracle - Log buffer 的相关设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 日志的核心意义(快速提交,
- 下一篇: 数据结构--折半查找法 详解