设为首页 加入收藏

TOP

借助SCN的变化来理解oracle备份与恢复的基本原理(三)
2014-11-23 21:58:48 来源: 作者: 【 】 浏览:52
Tags:借助 SCN 变化 理解 oracle 备份 恢复 基本 原理
8050fkdh_.dbf
[oracle@localhost datafile]$ rm o1_mf_system_8050fk2z_.dbf
[oracle@localhost datafile]$ rm o1_mf_sysaux_8050fk3w_.dbf
[oracle@localhost datafile]$ rm o1_mf_users_8050fkdh_.dbf
[oracle@localhost datafile]$ rm o1_mf_undotbs1_8050fkc6_.dbf
这个时候,假如我们要启动数据库会报什么错呢?
[sql]
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jul 17 20:57:00 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 419430400 bytes
Fixed Size 1219760 bytes
Variable Size 142607184 bytes
Database Buffers 272629760 bytes
Redo Buffers 2973696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1:
'/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_8050fk2z_.dbf'
因为,有控制文件,所以,我们会到mount状态,这是个oracle的介态。这个状态,我们可以做很多事。这时,它报文件1不能锁定。那么,我们一个个来。先把冷备的文件1拷来。
[oracle@localhost datafile]$ cp o1_mf_system_8050fk2z_.dbf /u01/app/oracle/oradata/ORCL/datafile
然后,再来打开数据库,看会报什么错?
[sql]
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1:
'/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_8050fk2z_.dbf'
这个时候报的错误不一样了。报文件1需要媒介恢复。oracle是根据什么报这个错误的呢?要了解这个,我们需要借助两个视图。 www.2cto.com
[sql]
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 587004
2 587004
3 587004
4 587004
5 587004
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 583375
2 0
3 0
4 0
5 587004
这两个视图所取的信息来源完全不一样。v$datafile的信息来自控制文件;v$datafile_header的信息则来自每个数据文件的文件头。我们刚刚已经把file 1拷回来,所以,oracle可以读到它头上的scn。而2,3,4已经被删了便是读不到的。但是,file 1在两处的scn不一致。记住了,oracle会横向比较,纵向是不会比较的。即:不会拿file 1和file 3比较。oracle打开的必要条件是控制文件和数据文件的文件头的scn要一致。那么大于583375,而小于585469的scn都在归档日志里面。每个scn对应相关的操作。
[sql]
SQL> select sequence#,first_change#,next_change# from v$archived_log;
SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ------------- ------------
5 544404 558719
6 558719 559931
7 559931 560709
8 560709 560959
9 560959 560981
10 560981 583374
什么是next_change# 日志组由当前日志组却换到非当前日志组时,所取的 系统scn,来作为它的最大scn。first_change#是它成为current的开始;而next_change#则是它结束了current生涯的标志。
我们知道,比583375小的scn都已经写入数据文件。现在,我们需要确定583375是落在哪对first_change#和next_change#之间。从而确定广义前滚的起点。
[sql]
SQL> select sequence#,first_change#,next_change# from v$archived_log
2 where 583375>=first_change# and
3 583375<=next_change#;
SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ------------- ------------
11 583374 586090
由此,我们知道,583375落在归档日志11的first_change#
首页 上一页 1 2 3 4 5 6 下一页 尾页 3/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle更改默认端口 下一篇oracle表锁问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: