一、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緩存