oracle學習筆記 logbuffer相關設置



oracle學習筆記  logbuffer相關設置


前面講了oracle日誌的工作機制
我們看一下logbuffer大小該如何設置呢


一)對軟硬件的選擇


從你第一次使用計算機開始,你就會一直碰到對軟硬件選擇的問題
每個人都一樣
在你選擇的時候別人也在選擇,而且在相互影響


對個人來說最好要相信一個可靠的來源
你可以相信一句話,相信一個人,相信一個原理,也可以找到一個真理再去相信它
但你最終做的選擇還是你自己的決定
也都是從自己的角度出發想對自己有好處,得到自己想要的


但在你得到一個物體後,可能和你想的並不一樣,你不想要的也會隨之而來


不用擔心自己不知道做的選擇對不對,
在整體的計算機世界每樣軟硬件的結果最終歷史會給出一個最後的選擇


二)LGWR的觸發條件


還是oracle實例結構
buffercache、dbf和logbuffer、日誌文件


看一下系統中的進程
[oracle@redhat4 ~]$ ps -ef|grep ora
結果中有這麼一行
oracle   11913     1  0 02:26 ?        00:00:02 ora_lgwr_jiagulun
就是LGWR進程


這個進程負責把日誌從內存logbuffer中寫到磁盤redolog中


LGWR有觸發機制
在下列情況下會把buffer中的數據寫回磁盤


1、用戶提交
commit的時候一定會觸發LGWR把日誌寫回磁盤


2、有1/3重做日誌緩衝區未被寫入磁盤
比如說現在logbuffer是3M
當我的redolog達到1M的時候就會觸發LGWR往磁盤寫


3、有大於1M的重做日誌緩衝區未被寫入磁盤
也就是從某種意義上來講LGWR負擔不是很重的話
我的logbuffer中的日誌一般不會超過1M


4、每隔3秒鐘會觸發LGWR


5、DBWR需要寫入的數據的SCN大於LGWR記錄的SCN,DBWR觸發LGWR寫入
這個個最重要
前四個很容易理解第五個這個非常關鍵


前面講過DBWR的觸發機制,它和LGWR之間一般的情況下沒什麼關係
DBWR觸發DBWR的,LGWR觸發LGWR的,各寫各的東西


oracle有這麼一個機制
一個buffer髒了,oracle保證這個buffer在寫到磁盤以前
這個buffer變髒所做的操作對應的日誌一定是已經寫到磁盤了
就是DBWR被觸發了,它要將40個髒塊寫到磁盤上
這個時候oracle保證40個髒塊所對應的日誌已經寫到磁盤了
如果沒有寫到磁盤它會先觸發LGWR寫到磁盤
然後DBWR再往磁盤上寫


對oracle來講日誌總是先於buffer寫到磁盤上
就是 Write-Ahead-Log 日誌寫入優先
也是和oracle的一致性有關係


如下面這種情況
假設在事務提交時,
還沒有把日誌寫入redolog,而直接使用DBWR向磁盤寫髒buffer
這時突然掉電,
結果dbf沒有寫完,redolog中也沒有日誌
而寫了一半的dbf塊塊中的數據就是錯誤的
想恢復,沒有redolog沒法做到
這樣這個數據庫最終產生錯誤,數據庫就不一致了,
而且無法恢復到這次操作前的狀態


如果提交以寫入了redolog結束
寫入redolog時掉電,那麼事務沒有提交成功這時不影響一致性
日誌寫完了內存髒塊在寫入磁盤時掉電
修改的數據已被寫入了日誌,這時就可以恢復


三)LOG優化建議


數據庫按進行的大多數數據處理情況可分爲兩種應用類型


OLTP,聯機事務處理(Online Transaction Processing)系統
是傳統的關係型數據庫的主要應用
表示事務性非常高的系統,以小的事務以及小的查詢爲主
數據量少,DML頻繁,並行事務處理多,但是一般都很短
使用一般用途或事務處理模板
OLAP,聯機分析處理(Online Analytical Processing)系統
是數據倉庫系統的主要應用,
支持複雜的分析操作,側重決策支持,並且提供直觀易懂的查詢結果
數據量大,DML少
使用數據倉庫模板


正常的數據庫一般都是OLTP


在OLTP 系統上
REDO LOG 文件的寫操作主要是小型的,比較頻繁,一般的寫大小在幾K,
而每秒鐘產生的寫IO 次數會達到幾十次,數百次甚至上千次。
因此REDO LOG文件適合存放於IOPS 較高的轉速較快的磁盤上。
另外由於REDO LOG 文件的寫入是串行的,
因此對於REDO LOG文件所做的底層條帶化處理,對於REDO LOG 寫性能的提升是十分有限的。


redolog放到存儲上
對硬盤來講有一個參數叫IOPS(Input/Output Operations Per Second),
即每秒進行讀寫(I/O)操作的次數
多用於OLTP數據庫、小文件存儲等場合,衡量磁盤隨機訪問的性能


logbuffer寫到redolog用LGWR進程


整體來講硬盤有sata硬盤、sas硬盤、fc硬盤、還有一種硬盤叫固態盤
對IOPS來講從sata到sas到fc到ssd依次增加
ssd硬盤它的iops會達到幾十萬
當然不同的固態盤它的IOPS、它的性能差距是非常大的,它跟硬盤不一樣
富士通的硬盤和希捷的硬盤都是sas硬盤它的性能差不多
但是固態盤我們測得性能差距很大


LGWR的特點是在寫日誌時


第一非常頻繁,也就是寫的次數很多,IOPS很多,每秒的I/O次數很高
要求磁盤IOPS必須很高


第二它每次寫的量比較小


第三它是順序寫
一個磁盤文件LGWR從logbuffer中順序往redolog磁盤文件裏寫


前面講的raid5、raid6甚至包括raid10、raid01它們都是條帶化
一塊數據被條帶的分佈到多個硬盤上,可以併發
條帶在這裏沒有意義
redolog不要放到raid5 raid6上因爲它們的寫性能很差
當然可以放到raid10和raid01上
最好是放到固態盤上
現在很多存儲裏面可以有一部分固態盤同時還有一部分硬盤


如果你的redolog確實是因爲IOPS非常高導致LGWR工作負擔很大、寫的很慢,
產生一堆問題,這個問題很難解決的話
非常簡單但可能涉及到硬件投資了
去買一批固態盤把你的redolog寫進去
當然這個固態盤空間很小就可以不需要太大
大約有一個G以內可能就夠了


這些知識如果以前對計算機比較熟應該能懂,基本就夠用了


四)logbuffer設多大


9i以前,一般是3M
3M就夠了,這裏大小不是問題


在10g中ORACLE會自動調整它的值,他遵循這樣一個原則,
'Fixed SGA Size'+ 'Redo Buffers'是granule size的整數倍
這是從oracle9開始出現的新特性


1)粒度


oracle把它的SGA和PGA內存給它分成了一個叫granule(粒度)的東西
這個粒度大小是oracle自動去調整的
大小由一個隱含參數_ksmg_granule_size決定
最終分配的內存數量都是這個參數的整數倍
SGA組件buffer cache,shared pool等都是按Granule的整數倍來分配和釋放的


在oracle9i中
當SGA<128M時,粒度值爲4M;
否則粒度值依平臺不同可能爲8M或16M


10g中這個參數的大小一般遵循如下原則:
– sga_max_size < = 1024M then _ksmg_granule_size = 4M
- sga_max_size > 1024M then _ksmg_granule_size = 16M
另外在32-bit Windows平臺sga大於1G時參數默認值爲8M


這個參數調整並不是任意的,還受到sga總量的限制,
如果sga不夠,即使調整參數也不會生效,只能調整到系統能夠認到的最大值


可以使用
alter system set "_ksmg_granule_size"=16777216 scope=spfile;
調整它的值,重啓數據庫生效


在手動調整後還是要再由oracle決定大小,最終有可能的值有4M、8M、16M


執行一個sql語句看一下粒度多大


SQL> select * from v$sgainfo where name in ('Fixed SGA Size','Redo Buffers','Granule Size');

NAME                                  BYTES RES
-------------------------------- ---------- ---
Fixed SGA Size                      1219016 No
Redo Buffers                        7168000 No
Granule Size                        4194304 No


這一行
Granule Size                        4194304 No
說明Granule Size的大小是4M


SGA空間再大一些,Granule Size還會大一些
也可能8M也可能16M


如Granule Size當前是4M,想給SGA分配空間
比如說我們給它分配161M
但oracle不會給它分配161M
它會用4對161給它取整
要不就是160,要不就是164


粒度其實就是爲了防止分內存的時候很多內存被分成小塊
oracle內存分配最好4M爲單位
防止小碎片的產生


2)Redo Buffers的大小


原則:'Fixed SGA Size'+ 'Redo Buffers'是granule size 的整數倍


在上面語句的查詢結果中
Fixed SGA Size                      1219016 No

Fixed SGA Size的大小是1M


Redo Buffers要不就是3M要不就是7M
3M的話加上上面Fixed SGA Size的大小1M就是4M
是Granule Size的整數倍
7M的話加上上面Fixed SGA Size的1M最後是8M
也是Granule Size的整數倍
一般Fixed SGA Size和Redo Buffers的和是granule size的最小的整數倍


結果中
Redo Buffers                        7168000 No
這裏因爲Redo Buffers取3M太小了所以使用了7M


如果現在granule是16M的話
如果Fixed SGA Size的大小是1M
Redo Buffers的大小就可以是15M


默認是這麼來取的,它取的值一般都夠
因爲redo buffer空間往往不是問題


五)oracle SQL Developer


oracle SQL Developer是一個圖形化的客戶端工具
它可以連接和管理oracle的數據庫


啓動後建立連接才能使用
連接名自己取
用戶名使用自己想使用的用戶
主機名我使用了oracle所在虛擬機的ip:192.168.3.47
建立的連接使用oracle的監聽端口,一般端口號爲1521
SID爲要連接的當前實例名,我這裏是建立數據庫時取得實例名jiagulun


連接上以後可以看到oracle數據庫中的對象
在 'Data Miner連接' 窗口都列出來了
連接用戶可見的所有的用戶的所有對象如表視圖索引等都可以找到
對這些對象的操作,只能在所連接的用戶有權限才能進行


在對應連接的 'SQL工作表' 窗口中工作表標籤頁內可以執行sql語句
執行時彈出 '查詢結果' 窗口顯示二維的表結構的結果


還有相關的類似的一些工具,比如pl/sql developer、toad(蟾蜍)等
它們在界面上可能更友好一些
老師不建議用那些工具,它們是要花錢的,
下載的多是破解版的,往往版本比較低
oracle版本高使用了一個管理它的工具版本低
就可能把oracle搞壞
或者說oracle一些新的性能,新的一些功能你發現不了


對oracle的sql developer你可以下到最新版的因爲它是免費的
雖然界面沒那麼很友好,但是也很好用
特別是在右上角的一個下拉列表框
有oracle的最經典的論壇網站,當然都是英文的
學oracle的話他們是最經典的,特別是AskTom


如果oracle出現什麼錯誤什麼問題
在這裏如選中asktom查詢,
它就自動跳到asktom網站上去找到相關的一些文章展示給你


比如在這裏選擇metalink
再輸入問題的描述,如4031
一回車
在 '消息-日誌' 窗口它就會給出一個網址
並且軟件會自動在默認瀏覽器打開這個網頁
查詢使用網站metalink或asktom裏面相關的4031的錯誤就會給列出來
直接看就ok了,非常有幫助


在這裏還有oracle的在線官方文檔10G的11G的9的
還有OTN的一個論壇
這都非常好,要慢慢習慣去用


六)redolog的組成


oracle初始安裝時redolog一般有三組


在sql developer中執行
select * from v$log;語句


結果

GROUP# THREAD# SEQUENCE#  BYTES MEMBERS ARCHIVED  STATUS    FIRST_CHANGE#  FIRST_TIME
     1       1        35     52428800       1 NO   INACTIVE   1174677  20-10月-16
     2       1        36     52428800       1 NO   CURRENT   1185401  21-10月-16
     3        1        34     52428800       1 NO   INACTIVE   1161958  19-10月-16


GROUP有3個即有3個日誌組
MEMBETS值都是1即每個日誌組有一個成員


接着執行
select * from v$logfile;
結果


GROUP#  STATUS   TYPE MEMBER                                         IS_RECOVERY_DEST_FILE
     3 (null) ONLINE /u01/app/oracle/oradata/jiagulun/redo03.log NO
     2 (null) ONLINE /u01/app/oracle/oradata/jiagulun/redo02.log NO
     1 (null) ONLINE /u01/app/oracle/oradata/jiagulun/redo01.log NO


GROUP#爲組號
MEMBER爲組中的成員
如:/u01/app/oracle/oradata/jiagulun/redo03.log爲組3的日誌文件


可以看到GROUP#有三個即有三個組,
每個組對應有一個成員MEMBER,三個組每個組有一個成員


可以每個組兩個成員,這兩個成員就完全相等
就是互相備份的關係


redolog重要性比dbf都要重要
dbf可以丟失
但是redolog千萬不要丟失


比如我有四個組,每個組倆成員
一個組其中的一個成員放到一個磁盤上另外一個成員放到另外一個磁盤上
一個磁盤壞了還有另外一個成員,這叫冗餘


我們經常會給一個日誌組添加一個成員
或者把一個成員移到另外一個磁盤上
就是把一個成員刪了,新加一個成員到另外一個磁盤上


我們經常需要對日誌進行一些改變
這和數據庫備份恢復有關
備份恢復就是設計一個體系性的方案
來解決oracle的數據丟失的問題
將我們數據丟失的損失減少到最少


關於日誌如何添加刪除
我給大家把命令都寫出來


添加日誌組
alter database add logfile group 5 '/opt/oracle/oradata/dbtest/redo05_1.log' SIZE 10M


給日誌組添加成員
alter database add logfile member '/opt/oracle/oradata/dbtest/redo04_3.log' to group 4


刪除日誌組
alter database drop logfile group 5


刪除組成員
alter database drop logfile  ('/opt/oracle/oradata/dbtest/redo05_1.log','/opt/oracle/oradata/dbtest/redo05_2.log')


有了這幾個命令就可以對日誌的整個體系結構進行變化了


這些命令相關的文件,老師都會放到網上
我們到論壇www.jiagulun.com上去找去下載就可以了


七)控制日誌切換時間


有一次一個學生找老師
說項老師很奇怪啊
我們用戶給我們提出了一個需求
用戶說你給我維護數據庫可以丟數據
因爲丟數據是沒有辦法的
但丟的數據不能超過十分鐘
他說很奇怪怎麼保證丟的數據不能超過十分鐘


其實這是很簡單的一個問題
也是在備份恢復裏面重點講的一個東西
你只要知道oracle的體系結構原理你很容易把它設計出來
我們可以把數據庫控制在用戶提出的需求範圍之內


REDO LOG切換的時間應該儘可能的不低於10-20 分鐘
我們的建議是10-20分鐘之間
這個地方是它控制數據丟失的問題


logbuffer對應redolog
寫的時候先寫第一個redolog
寫滿以後再寫第二個
第一個寫滿了以後寫第二個的時候叫切換
我們儘量的控制一個日誌文件
從開始寫到寫滿的時間控制在10-20分鐘以內


根據當前日誌的產生速度我們可以調整它的大小
讓一個日誌文件寫滿後產生切換的時間控制在10-20分鐘以內


1)調整日誌大小


oracle中redolog日誌的大小是不能直接改變的,
只能先刪除原日誌文件然後再建立新大小的文件


比如現在我正在使用第二組
可把第三組改成20M大小
第三組下面寫的時候就用20M了
在往第三組寫的時候
再把第二組改成20M


可以一次新建立三個日誌組並建立新組成員爲新大小
然後刪除原來的三組


也可以只在原三組操作
刪除當前未使用的組再建組名相同的新組並建立新組成員大小爲新大小
然後切換當前日誌
刪除剩下的那個組並建新同名組和建新組成員爲新大小


2)調整日誌大小的實際例子


下面依老師的要求按第二種方法實現:


a)進入歸檔模式


因爲控制日誌切換時間是爲了保存住日誌
所以讓redolog日誌歸檔纔有意義
在非歸檔模式雖然也有日誌切換,但是切換後都扔掉了,再控制切換時間就沒有意義了


先看一下日誌組的情況
SQL> select GROUP#  ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

    GROUP#     SIZE_M STATUS           ARC
---------- ---------- ---------------- ---
         1         50 INACTIVE         NO
         2         50 INACTIVE         NO
         3         50 CURRENT          NO


ARC列都爲NO說明日誌處於非歸檔模式


用命令看一下當前歸檔模式


SQL> ARCHIVE LOG LIST
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     35
Current log sequence           37


有一行
Database log mode              No Archive Mode
說明是非歸檔模式


也可以使用
SQL> SELECT log_mode FROM v$database;

LOG_MODE
------------
NOARCHIVELOG


也是非歸檔模式


下面修改歸檔模式,需要重啓數據庫


1、一致性關閉數據庫

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


2、啓動到mount階段

SQL> startup mount;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1219016 bytes
Variable Size              96470584 bytes
Database Buffers          180355072 bytes
Redo Buffers                7168000 bytes
Database mounted.


3、切換歸檔模式
可以
切換到自動歸檔模式
ALTER DATABASE ARCHIVELOG;
切換爲手工歸檔模式
ALTER DATABASE ARCHIVELOG MANUAL;
切換到非歸檔模式
alter database noarchivelog;
這三種都要在這一步完成,open狀態的數據庫無法完成


這裏切換到自動歸檔模式
SQL> ALTER DATABASE ARCHIVELOG;

Database altered.


4、數據庫切換到open階段

SQL> ALTER DATABASE OPEN;

Database altered.


這樣數據庫進入到了歸檔模式


SQL> SELECT log_mode FROM v$database;

LOG_MODE
------------
ARCHIVELOG


b)修改日誌組成員的大小


1、查看當前日誌組成員


當前日誌組情況


SQL> select GROUP#  ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

    GROUP#     SIZE_M STATUS           ARC
---------- ---------- ---------------- ---
         1         50 INACTIVE         YES
         2         50 INACTIVE         YES
         3         50 CURRENT          NO


每個數據成員爲50M


日誌組成員情況
SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/jiagulun/redo03.log
/u01/app/oracle/oradata/jiagulun/redo02.log
/u01/app/oracle/oradata/jiagulun/redo01.log


從結果分析當前正在使用第三組
並且第一第二組處於非活動狀態
所以下面刪除第一第二組並重新建第一第二組並建立新大小的成員
因爲oracle每個實例的日誌組最少不能小於兩個
所以一二組不能同時刪除,系統不讓都刪了只剩下第三組這一個組
需要依次的刪除並且重建



2、刪除重建日誌組及成員



SQL> alter database drop logfile group 1;

Database altered.


目前的組情況


SQL> select GROUP#  ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

    GROUP#     SIZE_M STATUS           ARC
---------- ---------- ---------------- ---
         2         50 INACTIVE         YES
         3         50 CURRENT          NO


組成員情況


SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/jiagulun/redo03.log
/u01/app/oracle/oradata/jiagulun/redo02.log


這時在操作系統中
/u01/app/oracle/oradata/jiagulun/redo01.log
文件還存在所以要先在操作系統把這個文件刪除


[oracle@redhat4 ~]$ mv  /u01/app/oracle/oradata/jiagulun/redo01.log /tmp


建新組和成員
SQL> alter database add logfile group 1 ('/u01/app/oracle/oradata/jiagulun/redo01.log') size 100M;

Database altered.

成功


再看一下組情況
SQL> select GROUP#  ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

    GROUP#     SIZE_M STATUS           ARC
---------- ---------- ---------------- ---
         1        100 UNUSED           YES
         2         50 INACTIVE         YES
         3         50 CURRENT          NO


組成員情況


SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/jiagulun/redo03.log
/u01/app/oracle/oradata/jiagulun/redo02.log
/u01/app/oracle/oradata/jiagulun/redo01.log


同樣修改第二組
SQL> alter database drop logfile group 2;
[oracle@redhat4 ~]$ mv  /u01/app/oracle/oradata/jiagulun/redo02.log /tmp
SQL> alter database add logfile group 2 ('/u01/app/oracle/oradata/jiagulun/redo02.log') size 100M;


這時的組情況和組成員的情況
SQL> select GROUP#  ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

    GROUP#     SIZE_M STATUS           ARC
---------- ---------- ---------------- ---
         1        100 UNUSED           YES
         2        100 UNUSED           YES
         3         50 CURRENT          NO


SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/jiagulun/redo03.log
/u01/app/oracle/oradata/jiagulun/redo02.log
/u01/app/oracle/oradata/jiagulun/redo01.log


這時只剩下第三組了
因爲它正在使用無法刪除所以要先手動切換一下日誌
SQL> alter system switch logfile;

System altered.


切換後的組情況
SQL> select GROUP#  ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

    GROUP#     SIZE_M STATUS           ARC
---------- ---------- ---------------- ---
         1        100 CURRENT          NO
         2        100 UNUSED           YES
         3         50 ACTIVE           YES


第三組處於ACTIVE狀態仍然無法刪除
這時可以再次切換日誌
也可以切換一次檢查點


SQL> alter system checkpoint;

System altered.


SQL> select GROUP#  ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

    GROUP#     SIZE_M STATUS           ARC
---------- ---------- ---------------- ---
         1        100 CURRENT          NO
         2        100 UNUSED           YES
         3         50 INACTIVE         YES


第三組目前爲INACTIVE可以刪除了
切換檢查點可以使所有ACTIVE狀態變爲INACTIVE
多次執行日誌切換也可以達到目的,但有時須多次才能做到


依次執行
SQL> alter database drop logfile group 3;
[oracle@redhat4 ~]$ mv  /u01/app/oracle/oradata/jiagulun/redo03.log /tmp
SQL> alter database add logfile group 3 ('/u01/app/oracle/oradata/jiagulun/redo03.log') size 100M;


再看一下組情況


SQL> select GROUP#  ,BYTES/1024/1024 size_M,STATUS,ARCHIVED from v$log;

    GROUP#     SIZE_M STATUS           ARC
---------- ---------- ---------------- ---
         1        100 CURRENT          NO
         2        100 UNUSED           YES
         3        100 UNUSED           YES


大小都是100M了修改成功
修改系統檢查點不能改變組的UNUSED狀態
需要切換日誌後纔會進入使用狀態
數據庫重啓不會切換日誌,但ACTIVE狀態會變爲INACTIVE狀態。


這裏的STATUS狀態和是否歸檔沒有關係
ACTIVE是指活動的非當前日誌,在進行實例恢復時會被用到。
Active狀態意味着,Checkpoint尚未完成,因此該日誌文件不能被覆蓋
INACTIVE是非活動日誌,在實例恢復時不再需要,但在介質恢復時可能需要


如果此redolog文件在oracle進行實例恢復時有用它就是ACTIVE
在需要進行實例恢復時沒有用了,就是變爲INACTIVE狀態
一般可理解爲如果此日誌記錄的信息所對應的buffer塊爲髒還沒有寫入磁盤它的狀態就是ACTIVE
如果此日誌所記錄的所有改變對應的所有buffer塊已經沒有了髒塊此日誌就轉換爲INACTIVE狀態。


3)查看切換時間


看日誌切換時間有個命令
select to_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time,SEQUENCE# from v$log_history;


執行結果較多隻列出一部分
F_TIME               SEQUENCE#
2016-04-11 13:40:01          1
2016-04-11 13:41:27          2
2016-04-11 13:41:36          3
2016-05-13 08:33:47          4
2016-05-14 08:15:22          5
.
.
.
2016-10-19 10:25:59         34
2016-10-20 07:01:19         35


SEQUENCE#列是日誌的編號
兩行的時間差就是發生兩次切換間隔的時間
從一號切開始到二號切開始用了1分半鐘
從二號切開始到三號開始切換可能是手工切的速度非常快


這裏只是實驗環境沒有負載而且經常關機所以切換時間有些不符合邏輯,不必細究
雖然關機不會造成日誌的切換但關機後庫不使用了一個日誌寫滿的時間就會出奇的長
正常的情況在生產高峯期的時候,應該控制在十分鐘左右


使用一些命令可以手工的去切


ALTER SYSTEM ARCHIVE LOG CURRENT;
爲歸檔命令也會造成日誌切換

alter system switch logfile;
直接切換日誌組


我們執行
SQL> alter system switch logfile;

System altered.


再看歸檔的日誌的切換
SQL> select to_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time,SEQUENCE# from v$log_history;

F_TIME               SEQUENCE#
------------------- ----------
2016-04-11 13:40:01          1
2016-04-11 13:41:27          2
2016-04-11 13:41:36          3
2016-05-13 08:33:47          4
2016-05-14 08:15:22          5
.
.
.
2016-10-19 10:25:59         34
2016-10-20 07:01:19         35
2016-10-21 08:29:09         36

36 rows selected.


比剛纔多了一行
就是當前用的redolog不管寫沒寫滿把它強行的關了,讓它寫下一個


4)ARCHIVE_LAG_TARGET參數


上面的方法控制日誌的切換
如不手工切換,最終都是在日誌寫滿後自動的切換
想做到20分鐘切換一次
需要根據實例的負載情況計算出日誌在要求時間內會產生多少
然後把redolog設置成相應的大小
在日誌寫滿後進行切換
如果實例出現異常往往日誌產生的數據量會發生變化
這樣會造成日誌切換並歸檔時間長短的變動
就很難保證在20分鐘就會歸檔保存日誌


但有一個參數可以強制進行日誌切換
ARCHIVE_LAG_TARGET參數可以設置一個時間,
通過時間限制,指定數據庫強制進行日誌切換(Log Switch),進行歸檔


日誌切換後在自動歸檔模式下馬上就會自動進行歸檔
若自動歸檔沒有打開,日誌切換後就不歸檔當前重做日誌


SQL> show parameter archive_lag_target;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target                   integer     0


值爲0表示表示禁用基於時間的日誌切換功能


修改此參數
alter system set archive_lag_target=1800;
設置日誌切換時間爲30分鐘。
我的系統中當前日誌歸檔的系統目錄爲:
/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/
在下一級有對應日期的子目錄,其下可以找到一個日期中歸檔的所有日誌


查看歸檔日誌的文件名和歸檔完成時間的命令
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';


select name,COMPLETION_TIME from v$archived_log where name is not null;


非歸檔模式、手動歸檔模式和自動歸檔模式此參數都會造成redolog的自動切換


但手動模式切換後並不自動歸檔,歸檔要手動完成
在手動歸檔模式下自動切換後若沒有進行及時手動歸檔
當已歸檔日誌用完後,oracle實例就會停止自動切換而被掛起,等待可使用的redolog
並且手動切換日誌也會無法執行等待可用日誌文件
這時只能趕快給數據庫日誌進行手動歸檔,否則數據庫只能讀而不能寫


非歸檔模式下參數也有效會自動切換日誌也可手動切
但這種模式不要求日誌必須歸檔
所以即使所有的日誌都沒有歸檔它仍然會不停的切換
不要求有已經歸檔的可用redolog文件
不會造成阻塞


自動模式在切換後會自動進行歸檔


八)小結



這是我們給大家講的日誌的知識
REDO LOG切換的時間應該儘可能的不低於10-20 分鐘
關於歸檔的知識放到備份恢復裏面去講



2016年11月1日

                                                                                                             文字:韻箏


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章