【备份恢复】之scn
时间:2010-09-16 来源:kankanhoney
妞儿自学技术以来就没开过博,今儿跟风开一回,希望会坚持到天长地久。嘻嘻。
备份恢复大概是dba日常用的最多的了也算是基本的必备技术,妞儿自从做了第三方oracle数据备份软件开始,oracle的基本备份技术就开始一点一点的遗忘,所以准备开始复习喽,跟我亲爱的、亲爱的博一起成长。
oracle通过scn来维护数据的一致性,是备份恢复的主要机制,备份恢复离不开scn, scn思想贯穿始终,嗯嗯,开篇就来scn吧...//
oracle内部4个scn,三个实在controlfile里,一个在datafilel里,拿我的小环境查下:
系统检查点scn
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
874834
当一个检查点动作完成后,oracle就把系统检查点的scn存储到控制文件中去。 数据文件检查点scn
CHECKPOINT_CHANGE#
------------------
874834
当一个检查点动作完成后,oracle就把系统检查点的scn存储到控制文件中去。 数据文件检查点scn
SQL> column name format a100
SQL> set pagesize 14
SQL> set linesize 300
SQL> select name,checkpoint_change# from v$datafile; NAME CHECKPOINT_CHANGE#
---------------------------------------------------------------------------------------------------- ------------------
+DATA/oracl/datafile/system.256.729079823 874834
+DATA/oracl/datafile/sysaux.257.729079825 874834
+DATA/oracl/datafile/undotbs1.258.729079825 874834
+DATA/oracl/datafile/users.259.729079825 874834
当一个检查点动作完成后,oracle也把数据文件检查点scn单独记录到控制文件中。 终止scn
SQL> set pagesize 14
SQL> set linesize 300
SQL> select name,checkpoint_change# from v$datafile; NAME CHECKPOINT_CHANGE#
---------------------------------------------------------------------------------------------------- ------------------
+DATA/oracl/datafile/system.256.729079823 874834
+DATA/oracl/datafile/sysaux.257.729079825 874834
+DATA/oracl/datafile/undotbs1.258.729079825 874834
+DATA/oracl/datafile/users.259.729079825 874834
当一个检查点动作完成后,oracle也把数据文件检查点scn单独记录到控制文件中。 终止scn
SQL> select name,last_change# from v$datafile;
NAME LAST_CHANGE#
---------------------------------------------------------------------------------------------------- ------------
+DATA/oracl/datafile/system.256.729079823
+DATA/oracl/datafile/sysaux.257.729079825
+DATA/oracl/datafile/undotbs1.258.729079825
+DATA/oracl/datafile/users.259.729079825
联机读写模式下面的所有的数据文件的终止SCN为空或者无限大。 数据文件中的启动scn
NAME LAST_CHANGE#
---------------------------------------------------------------------------------------------------- ------------
+DATA/oracl/datafile/system.256.729079823
+DATA/oracl/datafile/sysaux.257.729079825
+DATA/oracl/datafile/undotbs1.258.729079825
+DATA/oracl/datafile/users.259.729079825
联机读写模式下面的所有的数据文件的终止SCN为空或者无限大。 数据文件中的启动scn
SQL> select name,checkpoint_change# from v$datafile_header;
NAME CHECKPOINT_CHANGE#
---------------------------------------------------------------------------------------------------- ------------------
+DATA/oracl/datafile/system.256.729079823 874834
+DATA/oracl/datafile/sysaux.257.729079825 874834
+DATA/oracl/datafile/undotbs1.258.729079825 874834
+DATA/oracl/datafile/users.259.729079825 874834
---------------------------------------------------------------------------------------------------- ------------------
+DATA/oracl/datafile/system.256.729079823 874834
+DATA/oracl/datafile/sysaux.257.729079825 874834
+DATA/oracl/datafile/undotbs1.258.729079825 874834
+DATA/oracl/datafile/users.259.729079825 874834
数据文件的检查点信息写入到每一个数据文件的头部。
再说说4个scn之间的关系吧:
数据库正常运行期间,控制文件中的系统检查点scn、数据文件检查点scn、数据文件头部的启动scn都相同,此时只有控制文件中的终止scn为null状态。
数据库正常关闭期间,系统执行一个checkpoint,将所有位于控制文件中的数据文件终止scn置成与数据文件头部的启动scn一致,数据库安全关闭之后,四个scn应该是相同的。
--PS:通常通过查看这四个scn状态来判断数据库是否正常关闭。
数据库启动的过程:
1、数据文件头部的启动SCN与控制文件中数据文件检查点SCN比较,如果相同,继续。若不同需介质恢复。
2、数据文件头部的启动SCN与控制文件中数据文件终止SCN比较,如果相同,那么表示正常关机,不需要恢复。若不相同此时将需要实例恢复。
3、数据库打开,控制文件中数据文件终止SCN被设置为NULL,数据库被打开,并且正常使用。此时所有数据块都已提交,所有数据库的修改都没有在数据库关闭的过程中丢失。
数据库正常关闭:
SQL> shutdown immediate; -------将终止scn置为与启动scn一致
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 238530560 bytes
Fixed Size 1335724 bytes
Variable Size 159387220 bytes
Database Buffers 75497472 bytes
Redo Buffers 2310144 bytes
Database mounted.
SQL> select checkpoint_change# from v$database
2 ;
CHECKPOINT_CHANGE#
------------------
880843
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
880843
880843
880843
880843
SQL> select last_change# from v$datafile;
LAST_CHANGE#
------------
880843
880843
880843
880843
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
880843
880843
880843
880843
比较数据文件头部启动scn与控制文件中数据文件检查点scn 比较数据文件头部启动scn与控制文件中终止scn
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 238530560 bytes
Fixed Size 1335724 bytes
Variable Size 159387220 bytes
Database Buffers 75497472 bytes
Redo Buffers 2310144 bytes
Database mounted.
SQL> select checkpoint_change# from v$database
2 ;
CHECKPOINT_CHANGE#
------------------
880843
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
880843
880843
880843
880843
SQL> select last_change# from v$datafile;
LAST_CHANGE#
------------
880843
880843
880843
880843
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
880843
880843
880843
880843
比较数据文件头部启动scn与控制文件中数据文件检查点scn 比较数据文件头部启动scn与控制文件中终止scn
SQL> alter database open;
Database altered.
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
880846
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
880846
880846
880846
880846
SQL> select last_change# from v$datafile;
LAST_CHANGE# ------------------把所有数据文件终止scn设为null
------------
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
880846
880846
880846
880846
获取数据库scn的两种方法:
Database altered.
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
880846
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
880846
880846
880846
880846
SQL> select last_change# from v$datafile;
LAST_CHANGE# ------------------把所有数据文件终止scn设为null
------------
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
880846
880846
880846
880846
获取数据库scn的两种方法:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
880630
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
880634
可以通过如下脚本来观察系统scn的变化速率:
GET_SYSTEM_CHANGE_NUMBER
------------------------
880630
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
880634
可以通过如下脚本来观察系统scn的变化速率:
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; 未完待续。
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; 未完待续。
相关阅读 更多 +