1. scn: system change number
用以辨別資料庫在某個确切時刻送出的版本.
資料庫的内部邏輯時鐘.
每個資料庫都有一個全局的SCN生成器.
它會随着外部變化的加快而加快變化,在資料檔案和控制檔案裡各存放一個SCN号,然後恢複(主要是媒體恢複)的時候它們會進行比對,
一般情況下,這倆個檔案裡的SCN号是一緻的;非正常情況下,要根據實時情況判斷這倆個檔案裡的SCN号的大小
ORACLE通過SCN維護資料庫的一緻性,
以及實施至關重要的恢複機制.
SCN的擷取
(1)select dbms_flashback.get_system_change_number from dual; 9i
(2)select current_scn from v$database; 10g
(3)select max(ktuxescnw*power(2,32)+ktuxescnb) from x$ktuxe; before 9i
(4)從記憶體中擷取SCN
sys:
sql>oradebug setmypid
sql>oradebug DUMPvar SGA kcsgscn_
kcslf kcsgscn_ [20009104, 20009124) =
00000000 000704BD 000007D2 00000000 00000000 00000000 00000000 20008F10
sql>select to_number('704BD','xxxxxx') SCN from dual;
select to_number('1078F3','xxxxxx') SCN from dual;
觀察scn變化速率
不繁忙時:
select current_scn from v$database;
繁忙時:
set serveroutput on
declare
a number;
begin
for i in 1..100 loop
select current_scn into a from v$database;
dbms_output.put_line(a);
end loop;
end;
/ **執行上面的PL/SQL語句
2. 轉儲control file和資料檔案頭資訊
控制檔案儲存的資訊:
DB名稱,建立時間
所有資料檔案和日志檔案名稱和路徑
表空間資訊
備份資訊
檢查點和SCN資訊
歸檔資訊
sqlplus sys/oracle as sysdba
SQL> show parameter user_dump_dest
/opt/oracle/admin/LH/udump
quit
cd /opt/oracle/admin/LH/udump
rm *.trc
sqlplus sys/oracle as sysdba
alter session set events
'immediate trace name controlf level 8';
quit
ll lh_ora_17702.trc
vi lh_ora_17702.trc
觀察内容
轉儲資料檔案頭資訊
cd /opt/oracle/admin/LH/udump
rm *.trc
sqlplus sys/oracle as sysdba
alter session set events
'immediate trace name file_hdrs level 10';
quit
vi .trc
每個資料檔案頭資訊都會轉儲出來
觀察内容
轉儲日志檔案
cd /opt/oracle/admin/LH/udump/
rm *.trc
sqlplus sys/oracle as sysdba
alter system dump logfile '/opt/oracle/oradata/lh/redo01.log';
quit
vi lh_ora_11346.trc
low scn
next scn
辨別該日志檔案包含這2個值之間的資訊
CKPT:
工作:
(1)向DBWR布置寫資料檔案
(2)更新控制檔案,資料檔案頭資訊,記錄檢查點
觸發:
(1)redolog切換
(2)alter system checkpoint;
(3)将tbs->offline,read only,backup
(4)初始化參數
log_checkpoint_interval
log_checkpoint_timeout
3.
v$database.checkpoint_change# 記錄最後一次檢查點發生控制檔案的SCN
(the scn of ckpt in controlfile)
select checkpoint_change# from v$database;
v$datafile_header.checkpoint_change# 記錄最後一次檢查個個資料檔案的SCN
(the scn of every datafile in every datafile)
select checkpoint_change# from v$datafile_header;
v$datafile.checkpoint_change# 記錄最後一次檢查個個控制檔案的SCN
(the scn of every datafile in controlfile)
select checkpoint_change# from v$datafile;
v$datafile.last_change# (select last_change# from v$datafile;)
每個資料檔案的終止scn都存儲在controlfile中
在正常的資料庫操作過程中,
所有正處于聯機讀寫模式下的資料檔案的終止scn都為null.
用以辨別資料庫或資料檔案是否正常關閉
[當資料庫是read only open模式,
v$database.current_scn=0]
在安全關閉資料庫的過程中,系統會執行一個檢查點動作,
這時所有資料檔案的終止scn,都會設定成資料檔案頭中
的那個checkpoint_change#的值。
在資料庫重新啟動的時候,需要校驗
(1)資料檔案頭部的 checkpoint cnt 與
控制檔案中的 checkpoint cnt
是否一緻,如不一緻,停止往下進行,
如一緻,繼續校驗
(2)資料檔案頭的SCN對應控制檔案的結束SCN是否一緻
Oracle将v$datafile_header.checkpoint_change#與v$database.checkpoint_change#進行比較 (媒體恢複)
(比較v$datafile_header和v$database的checkpoint_change#)
如果這兩個值互相比對,oracle接下來還要比較v$datafile_header.checkpoint_change#和v$datafile.last_change# (執行個體恢複)
(比較v$databasefile_header的checkpoint_change#和v$databasefile的last_change#)
**執行個體恢複是由SMON,自動恢複
*1.如果這兩個值也一緻,就意味着所有資料塊都已經送出,所有對資料庫的修改都沒有
在關閉資料庫的過程中丢失,是以這次啟動資料庫的過程也不需要任何恢複操作,此時資料庫就可以打開了。
*2.當所有的資料檔案都打開之後,存儲在控制檔案中的v$datafile.last_change#的值再次被
更改為null,這表示資料檔案已經打開并能夠正常使用了。
在資料檔案打開過程中,
如果v$datafile_header.checkpoint_change#
與v$database.checkpoint_change#不同,需要媒體恢複
如果v$datafile_header.checkpoint_change#
和v$datafile.last_change#不同,需要執行個體恢複
open:
select checkpoint_change# from v$database 622419
select checkpoint_change# from v$datafile 622419
select last_change# from v$datafile null
select checkpoint_change# from v$datafile_header 622419
(1)正常關閉
ORACLE_SID=LH
sqlplus sys/oracle as sysdba
shutdown immediate 把所有資料檔案的終止scn(null),都會設定成資料檔案頭中的那個checkpoint_change#的值
startup mount
select checkpoint_change# from v$database 623414
select checkpoint_change# from v$datafile 623414
select last_change# from v$datafile 623414
select checkpoint_change# from v$datafile_header 623414
alter database open;
比較v$datafile_header.checkpoint_change#與v$database.checkpoint_change#
比較v$datafile_header.checkpoint_change#和v$datafile.last_change#
select checkpoint_change# from v$database 623415
select checkpoint_change# from v$datafile 623415
select last_change# from v$datafile null
select checkpoint_change# from v$datafile_header 623415
(2)非正常關閉
在ORACLE打開狀态下,斷電,直接關機
啟動OS
ORACLE_SID=LH
sqlplus sys/oracle as sysdba
startup mount
select checkpoint_change# from v$database 623415
select checkpoint_change# from v$datafile 623415
select last_change# from v$datafile null
select checkpoint_change# from v$datafile_header 623415
alter database open;
比較v$datafile_header.checkpoint_change#與v$database.checkpoint_change#
比較v$datafile_header.checkpoint_change#和v$datafile.last_change#不同,需要執行個體恢複
tail -f -n 300 alert_LH.log
SMON: enabling cache recovery
SMON: enabling tx recovery
select checkpoint_change# from v$database 645765
select checkpoint_change# from v$datafile 645765
select last_change# from v$datafile null
select checkpoint_change# from v$datafile_header 645765
(3)媒體恢複(DBA要介入)
open:
ORACLE_SID=LH
sqlplus sys/oracle as sysdba
alter database begin backup;
$ cp tbs16.dbf tbs16.dbf.bak
sqlplus sys/oracle as sysdba
select checkpoint_change# from v$database 517792
select checkpoint_change# from v$datafile 517962
select last_change# from v$datafile null
select checkpoint_change# from v$datafile_header 517962
alter database end backup;
select checkpoint_change# from v$database 517792
select checkpoint_change# from v$datafile 517962
select last_change# from v$datafile null
select checkpoint_change# from v$datafile_header 517962
shutdown immediate
$ mv tbs16.dbf.bak tbs16.dbf
startup mount
select checkpoint_change# from v$database 518771
select checkpoint_change# from v$datafile 518771
select file#,last_change# from v$datafile 518771
select file#,checkpoint_change# from v$datafile_header 518771 (7) 517962
alter database open; 比較v$datafile_header.checkpoint_change#與v$database.checkpoint_change#不同,需要媒體恢複
ORA-01113: file 7 needs media recovery
recover database;
Media recovery complete.
select checkpoint_change# from v$database 518771
select checkpoint_change# from v$datafile 518771
select file#,last_change# from v$datafile 518771 (7) 518770
select file#,checkpoint_change# from v$datafile_header 518771 (7) 518770
alter database open; 比較v$datafile_header.checkpoint_change#和v$datafile.last_change# 不同,需要執行個體恢複
SMON: enabling cache recovery
SMON: enabling tx recovery
select checkpoint_change# from v$database 518772
select checkpoint_change# from v$datafile 518772
select file#,last_change# from v$datafile null
select file#,checkpoint_change# from v$datafile_header 518772
sqlplus sys/oracle as sysdba
SQL> oradebug setmypid
sql> oradebug dump controlf 4
$ORACLE_BASE/admin/hj/udump/hj_ora_4198.trc
我們可以看到所有的資料檔案Stop scn: 0xffff.ffffffff,這是一個極大的值,說明我們的資料庫是打開的。我們知道,shutdown abort的時候,
沒有checkpoint,控制檔案也不會被更新,當資料庫重新啟動的時候,Oracle會發現這個SCN仍然是這個極大值,和資料庫的Checkpoint SCN不一樣,
此時資料庫就會進行恢複,隻有當這兩個SCN一樣,資料庫才能OPEN。
redo: 已送出,datafile想要,但沒有,需要應用redologfile裡的redo sql
undo: 未送出,datafile不想要,但有了,需要應用undofile裡的undo資訊