oracle實驗記錄 (CKPT的觸發)

fufuh2o發表於2009-06-26

這是會觸發一個完全檢查點
SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            849115
            849115
            849115
            849115
            849115
            849115
                                
已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            849115

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            849115
            849115
            849115
            849115
            849115
            849115

已選擇6行。

SQL> alter system checkpoint;

系統已更改。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            849184
            849184
            849184
            849184
            849184
            849184

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            849184

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            849184
            849184
            849184
            849184
            849184
            849184

已選擇6行。                                     完全檢查點 寫如了 控制檔案的datafile scn,system scn,資料檔案頭的start scn

 

實驗2 alter system switch logfile 來實驗看下


SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            849184
            849184
            849184
            849184
            849184
            849184

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            849184

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------                                        環境
            849184
            849184
            849184
            849184
            849184
            849184

已選擇6行。
SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            849184
            849184
            849184
            849184
            849184
            849184

已選擇6行。

SQL> select checkpoint_change# from v$database; 

CHECKPOINT_CHANGE#
------------------
            849184

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            849184
            849184
            849184
            849184
            849184
            849184                                        也是一個完全ckpt

已選擇6行。

 


SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            854178
            854178
            854178
            854178
            854178
            854178

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            854178
            854178
            854178
            854178
            854178
            854178

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            854178

SQL> alter database datafile 5 offline;

資料庫已更改。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            854178
            854178
            854178
            854178
            854178       854559
            854178

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            854178
            854178
            854178
            854178
            854178
            854178

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            854178

SQL> shutdown immediatel
SP2-0717: 非法的 SHUTDOWN 選項
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啟動。

Total System Global Area  171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145750508 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
資料庫裝載完畢。
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            857631

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            857631
            857631
            857631
            857631
            854178
            857631

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            857631       857631
            857631       857631
            857631       857631
            857631       857631
            854178       854559
            857631       857631

已選擇6行。

SQL>
補充: 正常關閉也是一個 完全CKPT,完全CKPT的特點就是startscn=systescn=datafilescn 在mount下可以看到startscn=systescn=datafilescn =stopscn


不完全 SCN ,檔案級檢查點

SQL> alter tablespace testtb offline;           

表空間已更改。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            882119              

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            882119
            882119
            882119
            882119
            882119
            883616       883616                 當 一個表空間offline時發生CKPT 注意 寫入了STOP SCN ,datafile SCN (在控制檔案中)

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            882119
            882119
            882119
            882119
            882119
                 0                 資料檔案頭部SCN 歸為0 即start scn 標為0
 
已選擇6行。


SQL> shutdown immediate;        這是一個完全CKPT,
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL>

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            884221
            884221
            884221
            884221
            884221
                 0

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            884221       884221
            884221       884221
            884221       884221
            884221       884221
            884221       884221
            883616       883616

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            884221

SQL>                                       注意 這個正常關閉產生的完全CKPT 沒有影響到 TESTTB表空間的資料檔案,沒有寫入DATAFILE SCN,STOP SCN,SYSTEM SCN,
                                           STARTSCN還是0

SQL> alter database open; 這個語句產生了一個CKPT 全的 但是隻遞增了1

資料庫已更改。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            884222

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            884222
            884222
            884222
            884222
            884222
            883616       883616

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            884222
            884222
            884222
            884222
            884222
                 0

已選擇6行。


SQL> alter tablespace testtb online;

表空間已更改。
SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            884222
            884222
            884222
            884222
            884222
            884877

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            884222
            884222
            884222
            884222
            884222
            884877

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            884222


SQL> shutdown immediate;       關閉 正常產生了一個全CKPT 
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL>

SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145750508 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            886021

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            886021
            886021
            886021
            886021
            886021
            886021

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            886021
            886021
            886021
            886021
            886021
            886021

 

 

總結,當發生表空間offline時候,觸發一個檔案級CKPT,寫入資料檔案中datafilescn,stopscn,並且其資料檔案頭部SCN 寫為0
之後的一系列CKPT 都與該表空間無關 不寫入。之後online產生一個對該表空間產生一個CKPT,寫入  datafilescn, startscn 並且 stop scn 為NULL
此時該表空間的datafilescn,startscn >system scn ,而後執行中產生的 全域性CKPT 自動會同步system scn=startscn=stopscn

 

 


read only產生的 檔案級CKPT


1初始環境


SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            887555

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            887555
            887555
            887555
            887555
            887555
            887555

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            887555
            887555
            887555
            887555
            887555
            887555

已選擇6行。

SQL> alter tablespace testtb read only; 產生一個CKPT

表空間已更改。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            887555
            887555
            887555
            887555
            887555
            887925

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            887555
            887555
            887555
            887555
            887555
            887925       887925          

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            887555   

SQL> alter  system  checkpoint;

系統已更改。


SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            887948

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            887948
            887948
            887948
            887948
            887948
            887925       887925

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            887948
            887948
            887948
            887948
            887948
            887925

SQL> alter tablespace testtb read write;

表空間已更改。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            887948
            887948
            887948
            887948
            887948
            888032

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            887948
            887948
            887948
            887948
            887948
            888032

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            887948


SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145750508 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            888283

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            888283
            888283
            888283
            888283
            888283
            888283

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            888283
            888283
            888283
            888283
            888283
            888283

已選擇6行。

結論:
read only與 offline(TS)很象,區別在於 read only時候使用者還可以讀取 該檔案中資訊 所以read only產生的CKPT 不僅寫入了STOP SCN,DATAFILESCN ,更寫入了
資料檔案頭的STARTSCN,offline(TS)已經不可讀到資訊,所以oracle將offline表空間的資料檔案頭部SCN寫為0 標明,read write後也產生一個CKPT 使得該表空間資料檔案
STARSCN=DATAFILESCN>SYSTEMSCN stop scn變會NULL,之後oracle 正常執行中產生全域性CKPT 會自動同步STARSCN=DATAFILESCN=SYSTEMSCN

 

 

begin backup 這個是比較重要的也是比較容易出問題的
 
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            888283

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            888283
            888283
            888283
            888283                                   實驗環境
            888283
            888283

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            888283
            888283
            888283
            888283
            888283
            888283

已選擇6行。

 

SQL> alter tablespace testtb begin backup;

表空間已更改。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------                    
            888283
            888283
            888283
            888283
            888283
            888976                                產生了 檔案級CKPT

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            888283
            888283
            888283
            888283
            888283
            888976                      給這個檔案加鎖了

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            888283          

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            889668

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            889668
            889668
            889668
            889668
            889668
            888976

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            889668
            889668
            889668
            889668
            889668
            888976


SQL> shutdown abort;                   強行關閉了 沒有執行end backup
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啟動。

Total System Global Area  171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145750508 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
資料庫裝載完畢。
SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            889668
            889668
            889668
            889668
            889668
            888976

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            889668
            889668
            889668
            889668
            889668
            888976

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            889668

SQL>
                                         此時該檔案startscn=datafile scn 不等於SYSTEM SCN


SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01113: 檔案 6 需要介質恢復
ORA-01110: 資料檔案 6: 'D:\自建表空間資料檔案\TESTTB.DBF'   必須執行recover 介質恢復
SQL> recover datafile 6;
完成介質恢復。
SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            889668
            889668
            889668
            889668
            889668
            889811

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            889668

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            889668
            889668
            889668
            889668
            889668
            889811       889811

已選擇6行。                                                            奇怪了 這是為什麼造成的呢 readonly資料檔案 也可以出現這種情況呀 在來看看為什麼一定要
                                                                       介質恢復

SQL> alter database open;

資料庫已更改。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            909813
            909813
            909813
            909813
            909813
            909813

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            909813

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            909813
            909813
            909813
            909813
            909813
            909813

已選擇6行。

SQL> alter tablespace testtb read only;

表空間已更改。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            909813
            909813
            909813
            909813
            909813
            911343       911343

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            909813

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            909813
            909813
            909813
            909813
            909813
            911343

已選擇6行。

SQL> start force mount;
SP2-0310: 無法開啟檔案 "force.sql"
SQL> startup force mount;
ORACLE 例程已經啟動。

Total System Global Area  171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145750508 bytes
Database Buffers           25165824 bytes
Redo Buffers                 262144 bytes
資料庫裝載完畢。
SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            909813
            909813
            909813
            909813
            909813
            911343

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            909813

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            909813
            909813                                   stop scn沒有是因為 不是正常關閉 oracle沒有寫進controlfile中STOP SCN
            909813
            909813
            909813
            911343       911343

已選擇6行。

  通過以上結論可以看出 未 end backup 不是 是因為   stopscn為NULL在MOUNT下 ,mount下stopscn為NULL 只需要例程恢復 由SMON自動完成
 
那是因為啥呢 結論很簡單,當 offline(ts),read only時 都會產生CKPT 並寫入STOP SCN , 等於做了一個標註,stopscn=startscn=datafilescn時候不需要恢復
未endbackup則 datafilescn=startscn 不等於systemscn 並且沒有寫進控制檔案stopscn  所以必須recover recover 出startscn=datafilescn=stopscn
原因是begingbackup時候 對資料檔案加了SCN 使齊不變 備份時候的SCN ,但資料仍然可以 寫進 資料檔案,所產生的CKPT由SYSTEMSCN 來記錄endbackup後 startscn,datafilescn會自動同步到system scn

 


SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            931768

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            931768
            931768
            931768
            931768
            931768
            931768

已選擇6行。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            931768
            931768
            931768
            931768
            931768
            931768

已選擇6行。

SQL> alter tablespace testtb begin backup;

表空間已更改。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            931768
            931768
            931768
            931768
            931768
            931780

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            931768

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            931768
            931768
            931768
            931768
            931768
            931780

已選擇6行。

SQL> alter tablespace testtb end backup;

表空間已更改。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
            931768
            931768
            931768
            931768
            931768
            931780

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            931768

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
            931768
            931768
            931768
            931768
            931768
            931780

已選擇6行。

SQL>

 


~
08.08.19~~~~~~~~~~~~~~~實驗

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           1766408
           1766408
           1766408
           1766408
           1766408
           1766408

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
           1766408

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
           1766408
           1766408
           1766408
           1766408
           1766408
           1766408

已選擇6行。


SQL> alter system switch  logfile;

系統已更改。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           1766408
           1766408
           1766408
           1766408
           1766408
           1766408

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
           1766408

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
           1766408
           1766408
           1766408
           1766408
           1766408
           1766408

已選擇6行。

SQL> alter tablespace testtb begin backup;

表空間已更改。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
           1766408
           1766408
           1766408
           1766408
           1766408
           1766500

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
           1766408

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
           1766408

SQL> alter system switch logfile;

系統已更改。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
           1766477

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
           1766477
           1766477
           1766477
           1766477
           1766477
           1766500

已選擇6行。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           1766477
           1766477
           1766477
           1766477
           1766477
           1766500

已選擇6行。

SQL>


SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
           1766477
           1766477
           1766477
           1766477
           1766477
           1766500

已選擇6行。
SQL> alter tablespace testtb end backup;

表空間已更改。

SQL> select checkpoint_change# from v$datafile_header;

CHECKPOINT_CHANGE#
------------------
           1766477
           1766477
           1766477
           1766477
           1766477
           1766500

已選擇6行。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
           1766477

SQL>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12020513/viewspace-607610/,如需轉載,請註明出處,否則將追究法律責任。

相關文章