- oracle alter日誌的位置:/u01/app/oracle/admin/orcl/bdump
- @@@
- ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE;
- 這設置以後系統的checkpoint將會被記錄alert_$SID.log文件中。
- @@@@
- 什麼是checkpoint(一個數據庫事件)
- 在數據庫系統中,寫日誌和寫數據文件是數據庫中IO 消耗最大的兩種操作,在這兩種操作
- 中寫數據文件屬於分散寫,寫日誌文件是順序寫,因此爲了保證數據庫的性能,通常數據庫
- 都是保證在提交(commit)完成之前要先保證日誌都被寫入到日誌文件中,而髒數據塊着
- 保存在數據緩存(buffer cache)中再不定期的分批寫入到數據文件中。也就是說日誌寫入
- 和提交操作是同步的,而數據寫入和提交操作是不同步的。這樣就存在一個問題,當一個數
- 據庫崩潰的時候並不能保證緩存裏面的髒數據全部寫入到數據文件中,這樣在實例啓動的時
- 候就要使用日誌文件進行恢復操作,將數據庫恢復到崩潰之前的狀態,保證數據的一致性。
- 檢查點是這個過程中的重要機制,通過它來確定,恢復時哪些重做日誌應該被掃描並應用於
- 恢復。
- 一般所說的checkpoint 是一個數據庫事件(event),checkpoint 事件由checkpoint 進程
- (LGWR/CKPT 進程)發出,當checkpoint 事件發生時DBWn 會將髒塊寫入到磁盤中,同
- 時數據文件和控制文件的文件頭也會被更新以記錄checkpoint 信息。
- @@@@
- 當檢查點發生時(此時的scn被成爲checkpointscn)oracle會通知dbwn進程,把修改過的數據,也就是此checkpoint
- scn 之前的髒數據從buffer cache 寫入磁盤,當寫入完成之後,ckpt進程更新控制文件和數據文件頭,記錄檢查點信息,標識變更。
- 當檢查點(數據庫事件)完成之後
- 查v$datafile 獲得checkpoint scn號,此檢查點之前修改過的數據都已經寫回磁盤。
- SQL> select checkpoint_change# from v$datafile;
- CHECKPOINT_CHANGE#
- ------------------
- 679453
- 679453
- 679453
- 679453
- 679453
- @@@
- 當發生checkpoint時,會把SCN寫到四個地方去。
- 三個地方於control file內,一個在datafile header。
- Control file三個地方爲
- 1.System checkpoint SCN ===========> (SYSTEM CHECKPOINT SCN in control file)
- SQL> select checkpoint_change# from v$database;
- CHECKPOINT_CHANGE#
- --------------------
- 292767
- 2.Datafile checkpoint SCN ===============> (DATAFILE CHECKPOINT SCN in control file)
- SQL> select name,checkpoint_change#
- from v$datafile where name like '%users01%';
- NAME CHECKPOINT_CHANGE#
- ----------------------------------- --------------------
- /u02/oradata/OMFD1/users01.dbf 292767
- 3.Stop SCN ======================> (STOP SCN in control file)
- SQL> select name,last_change#
- from v$datafile where name like '%users01%';
- NAME LAST_CHANGE#
- ----------------------------------- ------------
- /u02/oradata/OMFD1/users01.dbf
- 正常datafile在read-write mode下 last_change#一定是NULL
- 另外一個地方在datafile header內
- @@@
- 4.Start SCN ================================> (DATAFILE HEADER)
- SQL> select name,checkpoint_change#
- from v$datafile_header where name like '%users01%';
- NAME CHECKPOINT_CHANGE#
- ----------------------------------- --------------------
- /u02/oradata/OMFD1/users01.dbf 292767
- SQL> show parameter checkpoint
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- log_checkpoint_interval integer 0
- log_checkpoint_timeout integer 1800
- log_checkpoints_to_alert boolean FALSE(此值最好改爲true)
- SQL> alter system set log_checkpoints_to_alert=true;
- System altered.
- 通常情況下:alter system 改內存 alter database/tablespaces 改硬盤
- @@@@
- checkpoint和SCN有什麼關係?
- 在Oracle 中SCN 相當於它的時鐘,在現實生活中我們用時鐘來記錄和衡量我們的時間,
- 而Oracle 就是用SCN 來記錄和衡量整個Oracle 系統的更改。
- Oracle 中checkpoint 是在一個特定的“時間點”發生的,衡量這個“時間點”用的就是SCN,
- 因此當一個checkpoint 發生時SCN 會被寫入文件頭中以記錄這個checkpoint。
- SQL> select resetlogs_change#,checkpoint_change#,current_scn from v$database;
- RESETLOGS_CHANGE# CHECKPOINT_CHANGE# CURRENT_SCN
- ----------------- ------------------ -----------
- 525876 669103 670673
- sys> select resetlogs_change#,checkpoint_change#,current_scn from v$database;
- RESETLOGS_CHANGE# CHECKPOINT_CHANGE# CURRENT_SCN
- ----------------- ------------------ -----------
- 525876 669103 670673
- (時間原點) (當前時間)
- sys> select checkpoint_change# from v$datafile;(數據文件頭部scn)
- CHECKPOINT_CHANGE#
- ------------------
- 669103
- 669103
- 669103
- 669103
- 669103
- 表空間級檢查點
- 表空間:system(數據庫開啓時必須在線,) ,undotbs(數據庫開啓時必須在線,)
- 其餘的表空間可下線(sysaux,emample(方案對象的表空間),users)
- 數據庫開啓時system,undotbs 不可下線
- SQL> alter tablespace system offline;
- alter tablespace system offline
- *
- ERROR at line 1:
- ORA-01541: system tablespace cannot be brought offline; shut down if necessary
- SQL> alter tablespace undotbs1 offline;
- alter tablespace undotbs1 offline
- *
- ERROR at line 1:
- ORA-30042: Cannot offline the undo tablespace
- A、
- SQL> update employees set salary=24001 where employee_id=100;
- 1 row updated.
- B、
- SQL> select checkpoint_change#,name from v$datafile;
- CHECKPOINT_CHANGE#
- ------------------
- NAME
- --------------------------------------------------------------------------------
- 669442
- /u01/app/oracle/oradata/orcl/system01.dbf
- 669442
- /u01/app/oracle/oradata/orcl/undotbs01.dbf
- 669442
- /u01/app/oracle/oradata/orcl/sysaux01.dbf
- CHECKPOINT_CHANGE#
- ------------------
- NAME
- --------------------------------------------------------------------------------
- 669442
- /u01/app/oracle/oradata/orcl/users01.dbf
- 676942
- /u01/app/oracle/oradata/orcl/example01.dbf
- SQL> alter tablespace example offline;
- Tablespace altered.
- B、
- SQL> select checkpoint_change#,name from v$datafile;
- CHECKPOINT_CHANGE#
- ------------------
- NAME
- --------------------------------------------------------------------------------
- 669442
- /u01/app/oracle/oradata/orcl/system01.dbf
- 669442
- /u01/app/oracle/oradata/orcl/undotbs01.dbf
- 669442
- /u01/app/oracle/oradata/orcl/sysaux01.dbf
- CHECKPOINT_CHANGE#
- ------------------
- NAME
- --------------------------------------------------------------------------------
- 669442
- /u01/app/oracle/oradata/orcl/users01.dbf
- 671527--scn增大
- /u01/app/oracle/oradata/orcl/example01.dbf
- @@@
- 增量檢查點:當增量檢查點發生時,ckpt將檢查點隊列中的髒快第一次被髒的LRBA地址記錄到控制文件中。
- 增量檢查點並不會去更新數據文件,以及控制文件中的文件scn以及數據文件頭部的scn信息,而只是沒三秒由ckpt
- 去更新控制文件中的LRBA信息,也就是檢查點位置。
- @@@
- 完全檢查點:完全檢查點發生時,ckpt會觸發dbwn將所有髒塊寫回磁盤
- 完全檢查點實驗:
- A、
- SQL> conn hr/hr
- Connected.
- SQL> update employees set salary=24001 where employee_id=100;
- B
- SQL> alter system checkpoint;(實現完全檢查點。相當於正常關機(shutdown immediate))
- System altered. 此時出發完全檢查點進程將database bffer cache 中的數據全部寫入數據文件(內存最乾淨,日誌到最後一條)
- @@@
- SQL> show parameter fast_start
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- fast_start_io_target integer 0
- fast_start_mttr_target integer 0(默認值爲0,最大值爲3600,單位秒。表示沒有打開,系統自動採樣出一個時間,用於實例恢復時跑日誌的時間)
- fast_start_parallel_rollback string LOW
- SQL> alter system set fast_start_mttr_target=300;
- System altered.
- 觸發完全檢查點 條件
觸發完全檢查點,促使DBWR 將檢查點時刻前所有的髒數據寫入數據文件。
另外,一般正常運行期間的數據庫不會產生完全檢查點。
1. 通過正常事務處理或者立即選項關閉例程時(shutdown immediate 或者
Shutdown normal).
2. 當通過設置初始化參數:
LOG_CHECKPOINT_INTERVAL,
LOG_CHECKPOINT_TIMEOUT ,
FAST_START_IO_TARGET 強制時;
3. 當數據庫管理員手動請求時:
ALter system checkpoint;
alter tablespace ... offline;
4. 每次日誌切換時;
alter system switch logfile
注意:
1. alter system switch logfile也將觸發完全檢查點的發生。
2. alter database datafile ... offline 不會觸發檢查點進程
如果是單純的offline datafile,那麼將不會觸發文件檢查點,只有針對offline
tablespace 的時候纔會觸發文件檢查點,這也是爲什麼online datafile需要media
recovery而online tablespace不需要。
觸發增量檢查點
1. 在聯機熱備份數據文件前,要求該數據文件中被修改的塊從DB_Buffer 寫
入數據文件中。所以,發出這樣的命令:
ALTER TABLESPACE tablespace_name BIGEN BACKUP / end backup;
也將觸發和該表空間的數據文件有關的局部檢查點;
2. 另外,
ALTER TABLESPACE tablespace_name READ ONLY;
ALTER TABLESPACE tablespace_name OFFLINE NORMAL;
等命令都會觸發增量檢查點。
對於表空間的offline後再online這種情況,最好做個強制的checkpoint比較好。