天天看點

手動修改oracle scn号,SCN(系統改變号)

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資訊