四种SCN
Oracle数据库中有四SCN分别为系统检查点SCN、数据文件SCN、数据文件头SCN、结束SCN。数据文件头SCN存数在数据文件头中,而其他SCN存储在控制文件中。
系统检查点SCN可通过如下语句:
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
632913
数据文件SCN查看:
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 632913
2 632913
3 632913
4 632913
结束SCN查看:
SQL> select file#,last_change# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1
2
3
4
数据文件头SCN查看:
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 632913
2 632913
3 632913
4 632913
实时的数据库SCN查看:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
635909
上面查看了五种SCN信息,其中最后一项的SCN是数据库闪回时经常用到的,它其实是数据库的系统检查点SCN的实时值,当使用select checkpoint_change# from v$database;语句查询时查出的是上次检查点事件发生时刷新的SCN。
查询系统检查点SCN,两者相差是比较大的。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
632913
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
636826
执行检查点事件后,两个值几乎相等。所以闪回数据库会使用第二种查询方法以准确的恢复到想要的SCN。
SQL> alter system checkpoint;
System altered.
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
636835
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
636839
从上可以看到LAST_CHANGE值为空,说明数据库处于开启状态。而当数据库一致性关闭后,系统会将四种SCN制成统一。如果数据库非一致性关闭则LAST_CHANGE值则仍为空。
从实验看出数据库一致性关闭后,四种SCN保持一致。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1273252 bytes
Variable Size 96469596 bytes
Database Buffers 180355072 bytes
Redo Buffers 7114752 bytes
Database mounted.
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
666440
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 666440
2 666440
3 666440
4 666440
SQL> select file#,last_change# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1 666440
2 666440
3 666440
4 666440
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 666440
2 666440
3 666440
4 666440
数据库非一致性关闭后LAST_CHANGE值仍为空。
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1273252 bytes
Variable Size 96469596 bytes
Database Buffers 180355072 bytes
Redo Buffers 7114752 bytes
Database mounted.
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
666443
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 666443
2 666443
3 666443
4 666443
SQL> select file#,last_change# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1
2
3
4
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 666443
2 666443
3 666443
4 666443
数据库SCN原理:
数据库重新启动时,系统会对SCN进行两次比较。第一次是比较数据文件头中的启动SCN与数据文件SCN,如果两个值匹配,说明数据文件不需要介质恢复。接下来比较数据文件头SCN与数据文件结束SCN,如果数值匹配,说明在数据库关闭时所有数据块已提交,数据库不需要恢复,正常开启。当数据库开启后,数据文件结束SCN再次被置为空。当数据文件被设置为只读或使用begin backup命令时该数据文件SCN将被冻结,直到被设置为正常状态。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29385747/viewspace-1063336/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29385747/viewspace-1063336/