oracle 體系結構及內存管理 09_redo log

一、Oracle日誌原理:數據庫將buffer cache中的每個buffer(包括DML,DDL數據塊對索引的改變、對回滾段數據塊的改變、對臨時表
    空間的臨時段的改變等)的改過程嚴格按照時間順序記錄到redo log buffer中,再由lgwr寫入到redo log文件;
    日誌記錄(矢量)方式:buffer 地址,時間,改變方式(增,刪)。
    可能存在的狀況:修改了一行數據,產生了幾十K的日誌。
    redo log做用:記錄數據庫的改變過程,實例恢復,配合歸檔實現介質恢復。html

二、實際日誌產生過程:會話的server process修改buffer,先產生日誌寫入本身的PGA,在某種觸發的條件下,再由PGA寫入log 
                     buffer,最後由LGWr寫入log files;
    Server Process:乾的事情:將block讀入buffer cache,將buffer讀入cpu,修改buffer,將修改日誌記入本身的PGA,再由
                   PGA寫入redo log buffer.
三、LGWr觸發條件:
    1.用戶提交或回滾 
    2.有1/3(_log_io_size默認是0)重作日誌緩衝區未被寫入磁盤 
           select * from x$ksppcv where  indx in  (select indx from x$ksppi where ksppinm ='_log_io_size');
    3.有大於1M的重作日誌緩衝區未被寫入磁盤
    4.每隔3秒鐘
    5.DBWR須要寫入的數據的SCN大於LGWR記錄的SCN,DBWR觸發LGWR寫入
    6.發生日誌切換時觸發LGWR
    
四、如何確保已經提交的事務不會丟失:commit觸發LGWr將log buffer中的日誌所有寫入磁盤日誌文件,Write-Ahead-Log:日誌寫入
    優先,髒的buffer在寫入磁盤前,buffer的改變過程必定已經寫入log日誌。
                                   
五、oracle快速提交
    讀緩存:塊讀入緩存,cpu能夠讀緩存中的數據,修改仍是修改磁盤上的數據,不能直接修改緩存中數據,沒有負責將緩存中數據寫
        入磁盤的功能。
    寫緩存:oracle實現了寫緩存,buffer cache中的buffer修改後,產生日誌寫入日誌文件,實現了寫緩存,日誌寫入存儲,因存儲有
        寫緩存功能(存儲後本身的電池),提升了數據庫的性能。
    日誌是連續的順序,批量寫入日誌文件,減小尋道時間,由於日誌文件存在存儲上,LGWr繞過OS緩存直接寫入存儲的緩存中。
    
六、Log buffer大小設置
    9i之前,通常是3M在10g中ORACLE的ASMM會自動調整它的值,他遵循這樣一個原則,'Fixed SGA Size'+ 'Redo Buffers'是
granule size(粒度) 的整數倍,oracle中分配空間是按照granule size爲粒度,空間都是guanule size的整數倍。
    select * from v$sgainfo where name in ('Fixed SGA Size','Redo Buffers','Granule Size');
    查看日誌緩衝區大小 show parameter log_buffer;
    在10.2.0.3 中Log Buffer 默認值是14M,在10.2.0.4中,默認值是15M,修改log_buffer的大小不能指定單位和scope不能爲both
        alter system set log_buffer=10240 scope=spfile
    數據庫的版本信息
        select * from v$version
    redo log的IO塊大小通常與操做系統塊統一致
        select max(lebsz) from x$kccle;
    log buffer不足的表現:
        REDO NOWAIT #小於100%
        redo log space wait time #較大
        redo allocation,redo copy、redo writing #等閂鎖等待較爲嚴重
        log file sync  #發生在提交或回滾後,等待日誌緩衝寫入日誌文件,代表過多的提交或短事務
        
七、REDO LOG 切換的時間應該儘量的不低於10-20 分鐘
    一個日誌文件從開始寫,到寫滿的時間是10-20分鐘,設置日誌文件的大小,
    select to_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time,SEQUENCE# from v$log_history;--查詢日誌切換時間信息
    awr報告load profile,查看每秒產生的redo,再乘以你要的多少時間切換一次就出來了REDO的大小
    SELECT optimal_logfile_size   FROM   v$instance_recovery; --利用系統功能查詢日誌組推薦的大小單位是M
    日誌組的大小標準:不出現明顯的日誌等待,DG的日誌不宜設置過大
    
八、LOG buffer優化建議
        在OLTP 系統上,REDO LOG 文件的寫操做主要是小型的,比較頻繁,通常的寫大小在幾K,而每秒鐘產生的寫IO次數會達到幾
    十次,數百次甚至上千次。所以REDO LOG文件適合存放於IOPS 較高的轉速較快的磁盤上,IOPS 僅能達到數百次的SATA 盤不適合
    存放REDO LOG 文件。另外因爲REDO LOG 文件的寫入是串行的,所以對於REDO LOG文件所作的底層條帶化處理,對於REDO LOG寫
    性能的提高是十分有限的。
    LGWR:每次寫入的量小,寫入次數比較多,IOPS:每秒中磁盤的IO操做次數,tps:磁盤每秒的請求次數
    SATA,SAS,FC,固態盤
    
九、日誌組及成員文件相關的相關操做
日誌組大小調整,建立新大小的日誌組,切換使用後刪除原來日誌組,current,active日誌組不能刪
    ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/app/flashback/ipemsdb/onlinelog/redolog4_01.log') SIZE 50M REUSE ;
    ALTER DATABASE DROP LOGFILE GROUP 4; 
移動日誌到新目錄,將日誌組的狀態切至inactive,再將新路徑和文件放好,執行命令修改
    ALTER DATABASE RENAME FILE '/u01/app/flashback/ipemsdb/onlinelog/o1_mf_2_bw56d062_.log' TO '/u01/app/flashback/ipemsdb/redolog/o1_mf_2_bw56d062_.log';
日誌組成員增長(無狀態限制)和刪除(只能刪除非current和非最後一個成員)實體文件還需手動刪除
    ALTER DATABASE ADD LOGFILE MEMBER '+DG1/ora55/onlinelog_bak/group_2_02.log' TO GROUP 2;
    ALTER DATABASE DROP LOGFILE MEMBER '+DG1/ora55/onlinelog_bak/group_1_03.log';
切換日誌,使新建日誌聯機使用
    alter system switch logfile --不等歸檔完成就進行switch logfile操做,速度快,尤爲在非歸檔模式下適用,對當前實例生效。
    alter system archive log current --等待歸檔完成才操做,對全部實例生效。
    ALTER SYSTEM CHECKPOINT;  --切到inactive狀態
清空日誌文件的內容。主要用於數據庫沒法進行有效恢復的時候。如標識爲current日誌組的全部文件都壞了
等。只有非active 和非current狀態的組才能被清空
    ALTER DATABASE CLEAR LOGFILE group 1;--已歸檔
    ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1; --未歸檔
查詢日誌切換時間
    SELECT N.RECID  AS RECID ,N.FIRST_TIME  AS FIRST_TIME ,M.FIRST_TIME AS END_TIME ,
    ROUND((M.FIRST_TIME - N.FIRST_TIME) * 24 * 60, 2)AS MINUTES
    FROM V$LOG_HISTORY M, V$LOG_HISTORY N WHERE M.RECID = N.RECID + 1 ORDER BY M.RECID    
相關視圖
    SELECT * FROM V$LOG;
    SELECT * FROM V$LOGFILE;
    SELECT * FROM V$ARCHIVED_LOG;
    SELECT * FROM V$RECOVER_FILE;
    SELECT * FROM V$LOG_HISTORY;  --控制文件中日誌的歷史信息
    SELECT * FROM V$LOGHIST;
    
十、日誌組及日誌文件狀態v$log
    日誌文件組的狀態通常有INACTIVE、ACTIVE、CURRENT、UNUSED、CLEARING、CLEARING_CURRNT等六種狀態:
    UNUSED : 重作日誌文件組對應的文件還從未被寫入過數據,剛建立的日誌文件組會顯示成這一狀態。
    CURRENT: 正在使用的日誌文件組。當前Oracle數據庫正在使用的聯機重作日誌文件組。
    ACTIVE : 是活動的但不是當前組,實例恢復時須要這組日誌。表示雖然當前並未使用,但該文件未歸檔或
              對應的數據沒有所有寫入數據文件,實例恢復必須藉助該文件中保存的內容。
    INACTIVE:日誌文件中的內容已被妥善處理,處於空閒狀態。
    CLEARING:日誌文件正被重建(重建後該狀態會變成UNUSED)。
    CLEARING_CURRENT:表示該組重作日誌重建時出現錯誤。
    v$log.ARCHIVED列值爲YES表示已經歸檔,NO表示未歸檔。 
    v$log.SEQUENCE列值表示日誌序列號,每進行一第二天志切換就+1。
    v$log.FIRST_CHANGE# 列值爲日誌的SCN號,下一個日誌號即上一個日誌的next SCN
    
    日誌文件的狀態有STALE,INVALID 、DELETED、NULL 四種狀態。能夠經過v$logfile視圖查詢
    INVALID : 文件是不能夠被訪問的。
    STALE : 文件中的內容是不徹底的。
    NULL : 文件正在使用。
    DELETED : 文件已再也不有用了。
    
十一、異步提交技術:未等LGWr將日誌寫完就完成提交
系統級
    ALTER SYSTEM SET COMMIT_WRITE = IMMEDIATE, WAIT
會話級
    ALTER SESSION SET COMMIT_WRITE = IMMEDIATE, NOWAIT
語句級
    COMMIT WRITE BATCH WAIT
    COMMIT WRITE BATCH NOWAIT
    
十二、日誌與性能
    減小日誌量:nologing,臨時表
    redo 性能改進:加大批次提交的量,BULK DML
    
1三、歸檔
關歸檔:(設置的歸檔目錄依然存在)
    確認日誌組都已歸檔,除current外其餘日誌組爲inactive狀態;
    startup mount;
    alter database noarchivelog;
    alter database open;
開歸檔:
    shutdown immediate;
    startup mount;
    alter databae archivelog;
    alter database open;
配置歸檔目錄:
    歸檔目錄能夠配置本地和遠程兩種方式,且兩種方式互不兼容,同時爲了與閃回目錄區分統一採用方案2
MANADATORY歸檔必須成功複製到目的路徑以後,聯機重作日誌才能被複用,OPTIONAL正好相反。經過archive
log list確認歸檔目錄與閃回分開
    alter system set log_archive_dest = '' scope = spfile; --若是log_archive_dest有值先置空
    alter system set log_archive_dest_1 = 'location=/u01/arc_dir/' scope = spfile; --能夠設置多個
    log_archive_dest_2 = 'SERVICE=standby1';  --遠程 SERVICE 指定遠程數據庫的網絡服務名
自動歸檔參數LOG_ARCHIVE_START 10g已經廢棄,只要開啓歸檔就自動歸檔。
    ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;
歸檔進程調整,結合業務狀況設置,默認爲2,oracle也會根據系統要求自動調整
    ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=3;
歸檔相關信息查詢
    查詢歸檔目錄
    select dest_name,status,archiver,destination,log_sequence,reopen_secs,transmit_mode,process from v$archive_dest;
    查詢已歸檔信息
    select RECID,NAME,DEST_ID,SEQUENCE#,RESETLOGS_CHANGE#,ARCHIVED,STATUS ,BACKUP_COUNT from v$archived_log;
    select * from v$recovery_file_dest;
    select * From v$flash_recovery_area_usage;
    show parameter db_
清除歸檔日誌,歸檔日誌保留時間越久越好
    進入ORACLE數據備份工具 
    rman target / 
    DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; 
    若是物理文件被刪除
    crosscheck archivelog all; 
    delete expired archivelog all;     數據庫

參考文檔:
http://www.233.com/oracle/zhonghe/20070316/1327386.html
http://blog.csdn.net/leshami/article/details/5784713緩存

相關文章
相關標籤/搜索