如果LGWR的下一個日志是ACTIVE,那么LWGR會掛起,警告日志會報告"Checkpoint not complete",oracle會發起alter system checkpoint的操作 狀態為ACTIVE的日志也可能已經是歸檔日志了,ARCn進程會自動將非CURRENT的在線日志歸檔
V$LOG.STATUS反應的是完全檢查點的進度,因為alter system switch logfile后還是會發現原來為ACTIVE的日志還是ACTIVE狀態,但是alter system checkpoint后就一定會把ACTIVE變成INACTIVE(完全檢查點寫入控制文件和數據文件頭部,增量檢查點只寫入控制文件) V$LOG.STATUS=ACTIVE Log is active but is not the current log. It is needed for crash recovery. It may be in use for block recovery. It may or may not be archived. 代表最近一次的完全檢查點SCN小于該日志中最后一條重做記錄的SCN,說明完全檢查點還沒有越過這個在線日志 V$LOG.STATUS=INACTIVE Log is no longer needed for instance recovery. It may be in use for media recovery. It may or may not be archived. 代表最近一次的完全檢查點SCN大于該日志中最后一條重做記錄的SCN,說明完全檢查點已經越過這個在線日志
v$log.FIRST_CHANGE#:等于上一個online redo的v$log.NEXT_CHANGE#或上一個archive redo log的$archived_log.NEXT_CHANGE#,等于下一個archive redo log的v$archived_log.FIRST_CHANGE# v$log.NEXT_CHANGE#:Highest change number (SCN) in the log. When STATUS=CURRENT, NEXT_CHANGE# is set to the highest possible SCN, 281474976710655
V$DATABASE displays information about the database from the control file. V$DATABASE.CHECKPOINT_CHANGE#:Last SCN checkpointed V$DATABASE.CONTROLFILE_CHANGE#:Last SCN in backup control file; null if the control file is not a backup V$DATABASE.CURRENT_SCN:Current SCN; null if the database is not currently open. For a standby database, it is the checkpoint SCN of the mounted physical standby database during media recovery and is always less than the last applied SCN tracked in V$RECOVERY_PROGRESS. V$DATAFILE displays datafile information from the control file. V$DATAFILE.CHECKPOINT_CHANGE#:SCN at last checkpoint
V$DATAFILE_HEADER displays datafile information from the datafile headers. V$DATAFILE_HEADER.CHECKPOINT_CHANGE#:Datafile checkpoint change#
執行alter system switch logfile時,只有V$DATABASE.CONTROLFILE_CHANGE#變大了,其他V$DATABASE.CHECKPOINT_CHANGE#、V$DATAFILE.CHECKPOINT_CHANGE#、V$DATAFILE_HEADER.CHECKPOINT_CHANGE#都沒有變
執行ALTER DATABASE BEGIN BACKUP時,V$DATABASE.CONTROLFILE_CHANGE#、V$DATAFILE.CHECKPOINT_CHANGE#、V$DATAFILE_HEADER.CHECKPOINT_CHANGE#都變大了,只有V$DATABASE.CHECKPOINT_CHANGE#沒變
執行alter tablespace users begin backup時,V$DATABASE.CONTROLFILE_CHANGE#、對應的表空間文件V$DATAFILE.CHECKPOINT_CHANGE#、對應的表空間文件V$DATAFILE_HEADER.CHECKPOINT_CHANGE#變大了,$DATABASE.CHECKPOINT_CHANGE#沒變,其他表空間文件的V$DATAFILE.CHECKPOINT_CHANGE#、$DATAFILE_HEADER.CHECKPOINT_CHANGE#也沒變
執行alter system checkpoint時,則V$DATABASE.CONTROLFILE_CHANGE#、V$DATABASE.CHECKPOINT_CHANGE#、V$DATAFILE.CHECKPOINT_CHANGE#、V$DATAFILE_HEADER.CHECKPOINT_CHANGE#都變大了
查詢相應SCN的一些語句 select CHECKPOINT_CHANGE#,CONTROLFILE_CHANGE#,CURRENT_SCN from v$database; select distinct CHECKPOINT_CHANGE#,last_change# from v$datafile; select distinct CHECKPOINT_CHANGE# from v$datafile_header; select distinct FIRST_CHANGE#,NEXT_CHANGE#,sequence#,first_time from v$archived_log order by first_time desc; select SEQUENCE#,STATUS,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log
mount狀態下scn不會改變
查詢當前SCN的SQL 一般使用如下 select to_char(dbms_flashback.get_system_change_number) scn from dual mount狀態執行上述語句會報錯ORA-00904
下面這條查詢語句,每執行一次scn就會增加一次 select CURRENT_SCN from v$database; mount狀態下執行上述語句結果是0
COMMIT Statement The COMMIT statement ends the current transaction, making its changes permanent and visible to other users. COMMIT不會觸發任何的checkpoint,只是觸發lgwr把日志緩沖數據寫入在線重做日志并把事務對應的數據塊的最新scn和是否的提交狀態記錄在控制文件中,但是不會記錄在任何視圖中,V$DATABASE.CURRENT_SCN雖然也來自來自控制文件,但是記錄當前最新的SCN
database checkpoint The thread checkpoint that has the lowest SCN. All changes in all enabled redo threads with SCNs before the database checkpoint SCN are guaranteed to have been written to disk. 具有最低SCN的線程檢查點。 在數據庫檢查點SCN之前所有啟用的具有SCN的重做線程的所有更改都保證已寫入磁盤。
data file checkpoint A data structure that defines an SCN in the redo thread of a database for a particular data file. Every data file has a checkpoint SCN, which you can view in V$DATAFILE.CHECKPOINT_CHANGE#. All changes with an SCN lower than this SCN are guaranteed to be in the data file. 數據結構,用于定義特定數據文件的數據庫重做線程中的SCN。 每個數據文件都有一個檢查點SCN,您可以在V$DATAFILE.CHECKPOINT_CHANGE#中查看。 SCN低于此SCN的所有更改都將保證在數據文件中。
Overview of Checkpoints A checkpoint is a crucial mechanism in consistent database shutdowns, instance recovery, and Oracle Database operation generally. The term checkpoint has the following related meanings: A data structure that indicates the checkpoint position, which is the SCN in the redo stream where instance recovery must begin The checkpoint position is determined by the oldest dirty buffer in the database buffer cache. The checkpoint position acts as a pointer to the redo stream and is stored in the control file and in each data file header. The writing of modified database buffers in the database buffer cache to disk 檢查點是一致的數據庫關閉,實例恢復和Oracle數據庫操作的關鍵機制。 檢查點一詞具有以下相關含義: 指示檢查點位置的數據結構,該位置是實例恢復必須開始的重做流中的SCN 檢查點位置由數據庫緩沖區緩存中最舊的臟緩沖區確定。 檢查點位置用作指向重做流的指針,存儲在控制文件和每個數據文件頭中。 將數據庫緩沖區中的修改后的數據庫緩沖區寫入磁盤
When Oracle Database Initiates Checkpoints The checkpoint process (CKPT) is responsible for writing checkpoints to the data file headers and control file. Checkpoints occur in a variety of situations. For example, Oracle Database uses the following types of checkpoints: Thread checkpoints The database writes to disk all buffers modified by redo in a specific thread before a certain target. The set of thread checkpoints on all instances in a database is a database checkpoint. Thread checkpoints occur in the following situations: Consistent database shutdown ALTER SYSTEM CHECKPOINT statement Online redo log switch ALTER DATABASE BEGIN BACKUP statement Tablespace and data file checkpoints The database writes to disk all buffers modified by redo before a specific target. A tablespace checkpoint is a set of data file checkpoints, one for each data file in the tablespace. These checkpoints occur in a variety of situations, including making a tablespace read-only or taking it offline normal, shrinking a data file, or executing ALTER TABLESPACE BEGIN BACKUP. 檢查點進程(CKPT)負責將檢查點寫入數據文件頭文件和控制文件。 檢查點發生在各種情況。 例如,Oracle數據庫使用以下類型的檢查點: 線程檢查點 數據庫通過在某個目標之前的特定線程中重做修改的所有緩沖區寫入磁盤。 數據庫中所有實例上的一組線程檢查點是一個數據庫檢查點。 線程檢查點在以下情況下發生: 一致的數據庫關機 ALTER SYSTEM CHECKPOINT語句 在線重做日志切換 ALTER DATABASE BEGIN BACKUP語句 表空間和數據文件檢查點 數據庫將磁盤上的所有緩沖區寫入特定目標之前通過重做修改。 表空間檢查點是一組數據文件檢查點,一個用于表空間中的每個數據文件。 這些檢查點發生在各種情況下,包括使表空間為只讀或正常脫機,收縮數據文件或執行ALTER TABLESPACE BEGIN BACKUP。
Incremental checkpoints An incremental checkpoint is a type of thread checkpoint partly intended to avoid writing large numbers of blocks at online redo log switches. DBWn checks at least every three seconds to determine whether it has work to do. When DBWn writes dirty buffers, it advances the checkpoint position, causing CKPT to write the checkpoint position to the control file, but not to the data file headers. Other types of checkpoints include instance and media recovery checkpoints and checkpoints when schema objects are dropped or truncated. 增量檢查點是一種類型的線程檢查點,部分是為了避免在線重做日志切換中寫入大量塊。 DBWn至少每三秒檢查一次,以確定是否有工作要做。 當DBWn寫入臟緩沖區時,它會提前檢查點位置,導致CKPT將檢查點位置寫入控制文件,而不是數據文件頭。 其他類型的檢查點在模式對象被刪除或截斷時包括實例和介質恢復檢查點和檢查點。
增量檢查點 增量檢查點會推動dbwr將部分臟數據塊寫回數據文件,但是檢查點SCN只是記錄到控制文件即V$DATABASE.CONTROLFILE_CHANGE#,而沒有寫入數據文件頭部。實例恢復操作并不會因此而少索取日志記錄。比如:增量檢查點SCN到200了,意味著數據文件內數據塊的最高的SCN也已經是200了,但是數據文件頭部可能還寫著檢查點SCN是100,如果此時實例崩潰,實例恢復的前滾會從scn為100的重做記錄開始,實際上從scn號100~200的重做記錄根本不需要前滾。oracle當然了解這一點,所以每次寫完臟數據塊之后,dbwr會添加一條被稱為BWR(block written record,數據塊已寫)的重做記錄,該記錄的變更矢量不代表任何變更,只是用來標記哪些數據塊已經被寫回數據文件了。 因為有BWR這樣的記錄,oracle在進行自動前滾時實際上采用“兩次讀取法”讀取在線日志,仍然假設數據文件檢查點scn為100,增量檢查點已經到200了,第一次讀取日志中scn號100后的所有重做記錄,目的是確定所有的真正的需要恢復的數據塊有哪些,BWR記錄就像一個過濾器,可以大量減少這樣的數據塊。第二次讀取在線日志時oracle只對真正需要恢復的數據塊,即沒有被BWR記錄點到名的數據塊的重做記錄感興趣。結果是oracle會跳過scn從100到200之間的重做記錄,也就會使前滾相應變快
增量檢查點作用: 1.減少發生完全檢查點是dbwr進程的工作負擔 2.提高實例恢復的速度
增量檢查點發生時機 1.oracle自動控制(當三個參數都不設置或三個參數都設置不當時FAST_START_MTTR_TARGET、LOG_CHECKPOINT_TIMEOUT、LOG_CHECKPOINT_INTERVAL) 2.三個參數取最嚴厲的那個(FAST_START_MTTR_TARGET、LOG_CHECKPOINT_TIMEOUT、LOG_CHECKPOINT_INTERVAL) 3.lgwr切換在線日志 --alter system flush buffer_cache不會引發增加檢查點
FAST_START_MTTR_TARGET enables you to specify the number of seconds the database takes to perform crash recovery of a single instance. When specified,FAST_START_MTTR_TARGET is overridden by LOG_CHECKPOINT_INTERVAL. 當設置了LOG_CHECKPOINT_INTERVAL時,LOG_CHECKPOINT_INTERVAL的設置會覆蓋FAST_START_MTTR_TARGET的設置,而不是說11G已經取消了FAST_START_MTTR_TARGET這個參數的功能。
LOG_CHECKPOINT_INTERVAL specifies the frequency of checkpoints in terms of the number of redo log file blocks that can exist between an incremental checkpoint and the last block written to the redo log. This number refers to physical operating system blocks, not database blocks 這里指的blocks是OS的block,而不是DATABASE的block Regardless of this value, a checkpoint always occurs when switching from one online redo log file to another. Therefore, if the value exceeds the actual redo log file size,checkpoints occur only when switching logs. Checkpoint frequency is one of the factors that influence the time required for the database to recover from an unexpected failure 當LOG_CHECKPOINT_INTERVAL值大于redo log file size時,增量檢查點發生情況就是在線日志切換取代LOG_CHECKPOINT_INTERVAL Specifying a value of 0 (zero) for LOG_CHECKPOINT_INTERVAL has the same effect as setting the parameter to infinity and causes the parameter to be ignored. Only nonzero values of this parameter are considered meaningful. 當LOG_CHECKPOINT_INTERVAL為0時,LOG_CHECKPOINT_INTERVAL這個參數就不起作用了 Recovery I/O can also be limited by setting the LOG_CHECKPOINT_TIMEOUT parameter or by the size specified for the smallest redo log. LOG_CHECKPOINT_TIMEOUT和LOG_CHECKPOINT_INTERVAL都生效,但是取兩者更嚴厲的那個
LOG_CHECKPOINT_TIMEOUT specifies (in seconds) the amount of time that has passed since the incremental checkpoint at the position where the last write to the redo log(sometimes called the tail of the log) occurred. This parameter also signifies that no buffer will remain dirty (in the cache) for more than integer seconds. Specifying a value of 0 for the timeout disables time-based checkpoints. Hence, setting the value to 0 is not recommended unless FAST_START_MTTR_TARGET is set 不建議設置LOG_CHECKPOINT_TIMEOUT為0,除非你設置了FAST_START_MTTR_TARGET FAST_START_MTTR_TARGET、LOG_CHECKPOINT_INTERVAL為0時,LOG_CHECKPOINT_TIMEOUT也生效的
RAMN經常遇到的1號文件system太新的問題 如下三者都是說file 1太新了,file 1需要更多的恢復 ORA-01194: file 1 needs more recovery to be consistent ORA-01113: file 1 needs media recovery RMAN-06556: datafile 1 must be restored from backup older than scn 919248820 datafile 1的scn大于919248820,也就是datafile 1太新了,不夠舊不夠老 比如正常關機后,startup mount狀態, sql直接recover database會報錯ORA-00264: no recovery required rman直接recover database until sequence到前面幾個archivelog就會報RMAN-06556