scn: system change number
用以标识数据库在某个确切时刻提交的版本.
数据库的内部逻辑时钟.
每个数据库都有一个全局的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;
观察scn变化速率
不繁忙时:
select current_scn from v$database;
繁忙时:
set serveroutput on 设置标准输出
declare
a number;
begin
for i in 1..100 loop [变量i 不用定义 直接使用即可]
select current_scn into a from v$database;
dbms_output.put_line(a);
end loop;
end;
/ 斜杠表示 开始执行
用以标识数据库在某个确切时刻提交的版本.
数据库的内部逻辑时钟.
每个数据库都有一个全局的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;
观察scn变化速率
不繁忙时:
select current_scn from v$database;
繁忙时:
set serveroutput on 设置标准输出
declare
a number;
begin
for i in 1..100 loop [变量i 不用定义 直接使用即可]
select current_scn into a from v$database;
dbms_output.put_line(a);
end loop;
end;
/ 斜杠表示 开始执行
v$database.checkpoint_change#
(the scn of ckpt in controlfile)
=
v$datafile_header.checkpoint_change#
(the scn of every datafile in every datafile)
=
v$datafile.checkpoint_change#
(the scn of every datafile in controlfile)
(the scn of ckpt in controlfile)
=
v$datafile_header.checkpoint_change#
(the scn of every datafile in every datafile)
=
v$datafile.checkpoint_change#
(the scn of every datafile in controlfile)
v$datafile.last_change#
每个数据文件的终止scn都存储在controlfile中
在正常的数据库操作过程中,
所有正处于联机读写模式下的数据文件的
终止scn都为null.
用以标识数据库或数据文件是否正常关闭
[当数据库是read only open模式,v$database.current_scn=0]
每个数据文件的终止scn都存储在controlfile中
在正常的数据库操作过程中,
所有正处于联机读写模式下的数据文件的
终止scn都为null.
用以标识数据库或数据文件是否正常关闭
[当数据库是read only open模式,v$database.current_scn=0]
在安全关闭数据库的过程中,系统会执行一个检查点动作,
这时所有数据文件的终止scn,都会设置成数据文件头中
的那个checkpoint_change#的值。
这时所有数据文件的终止scn,都会设置成数据文件头中
的那个checkpoint_change#的值。
在数据库重新启动的时候,需要校验
(1)数据文件头部的 checkpoint cnt 与
控制文件中的 checkpoint cnt
是否一致,如不一致,停止往下进行,
如一致,继续校验
(2)数据文件头的SCN对应控制文件的结束SCN是否一致
Oracle将v$datafile_header.checkpoint_change#
与v$database.checkpoint_change#进行比较,
(介质恢复)
(1)数据文件头部的 checkpoint cnt 与
控制文件中的 checkpoint cnt
是否一致,如不一致,停止往下进行,
如一致,继续校验
(2)数据文件头的SCN对应控制文件的结束SCN是否一致
Oracle将v$datafile_header.checkpoint_change#
与v$database.checkpoint_change#进行比较,
(介质恢复)
如果这两个值相互匹配,oracle接下来还要比较
v$datafile_header.checkpoint_change#
和v$datafile.last_change# (实例恢复)
v$datafile_header.checkpoint_change#
和v$datafile.last_change# (实例恢复)
如果这两个值也一致,就意味着所有数据块
都已经提交,所有对数据库的修改都没有
在关闭数据库的过程中丢失,因此这次
启动数据库的过程也不需要任何恢复操作,
此时数据库就可以打开了。
当所有的数据文件都打开之后,存储在控制文件
中的v$datafile.last_change#的值再次被
更改为null,这表示数据文件已经打开
并能够正常使用了。
都已经提交,所有对数据库的修改都没有
在关闭数据库的过程中丢失,因此这次
启动数据库的过程也不需要任何恢复操作,
此时数据库就可以打开了。
当所有的数据文件都打开之后,存储在控制文件
中的v$datafile.last_change#的值再次被
更改为null,这表示数据文件已经打开
并能够正常使用了。
在数据文件打开过程中,
如果v$datafile_header.checkpoint_change#
与v$database.checkpoint_change#不同,需要介质恢复
如果v$datafile_header.checkpoint_change#
和v$datafile.last_change#不同,需要实例恢复
如果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; 由Mount阶段到open阶段SCN值会自动加1
比较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)介质恢复
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
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; 由Mount阶段到open阶段SCN值会自动加1
比较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)介质恢复
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
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。
没有checkpoint,控制文件也不会被更新,当数据库重新启动的时候,Oracle会发现这个SCN仍然是这个极大值,和数据库的Checkpoint SCN不一样,
此时数据库就会进行恢复,只有当这两个SCN一样,数据库才能OPEN。
redo: 已提交,datafile想要,但没有,需要应用redologfile里的redo sql
undo: 未提交,datafile不想要,但有了,需要应用undofile里的undo信息
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20670907/viewspace-742560/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/20670907/viewspace-742560/