热备份

1、为什么要将表空间置于热备状态?

这是因为OS在Copy Block时的无序性,也就是说在Copy数据文件的时候并不能保证
最先Copy 出来的Block是Datafile header Block(因为Datafile header Block中记录着
datafile 的SCN,恢复的时候就是从这个Block中记录的SCN开始)。
例如:
OS Copy 开始时Block 1 的时间为t1,Copy 过程中Block 1 可能被别的进程修改,Copy 完成之时的时间为t2,
而此时开始Copy datafile Header block,时间为t3,这样在恢复的时候是从t3 开始恢复的,也就是说此时Block 1 将丢失t1到t3这段时间内的数据。所以说不置于热备状态是不可取的。

另 外当表空间置于热备状态时,会产生一个Checkpoint,这个Checkpoint 的SCN会记录在datafile header,恢复的时候就是从这个SCN开始,还有就是在热备状态下Oracle会锁定Datafile header,这个时候对数据文件的修改将 不会修改Datafile header的SCN,但是Checkpoint cnt是增加的。

最后,Oracle 建议Copy 数据文件是用Oralce 提供的Ocopy命令而不是OS 的Copy。


[@more@]2、热备过程中为什么要将 备份模式下在对Data block更新时,将这个Block的镜像写到Redo log中?

这 是由于Oralce Block 和OS Block的差异造成的,Oracle的最小存储单位是Block,通常是8K,而OS最小的最小存储单位是Sector,通常是512B。这种情况下一 个Oracle Block是由16个OS的Block组成。这样的话,就会有这样一种情况:

在Copy 一个Oracle Bock的时候,可能在Copy 这个Oracle Block 当中的一些OS Block的同时,
有些进程在对这个Oracle Block中的另外的OS Block进行修改,这样就造成了这个Oralce Block
的不一致。

所以在热备过程中,对备份块修改之前,先将这个块的镜像Copy 一份到Redo log,恢复的时候,遇到不一致的块的时候,就先从Redo log中将这个Block镜像Copy 回去,再应用以后的Redo
log 进行恢复。


3、备份过程中写不写数据文件?

写不写数据文件是由DBWn决定的,只要符合DBWn写数据文件的条件,写数据文件是肯定。
--------------------------------------------------
Oracle 版本:9i、10g
1、 进行热备份的要求?
热备份是一种数据库的处于打开时的物理备份,因为数据库在不断发生改变,因此备份的文件必然是不一致的,这就要求数据库必须处于归档日志模式。

2、 热备份的一般流程?
 查看数据库是否处于归档日志模式,若不是将数据库置为归档日志模式。
Rem check the archived mode
Archive log list;
Rem if not archivelog mode issue the following statements
Shutdown immediate;
Startup mount;
Alter database archivelog;
Alter database open;
 查看当前的归档日志情况确认已归档
Archive log list;
 将表空间置为热备份模式(以users 表空间为例)
Alter tablespace users begin backup;
 物理拷贝数据文件
Rem for windows
Sql> host copy c:oracleora92user01.dbf d:oraclehotbackup;
Rem for linux/unix
Sql>host cp /oracle/ora92/user01.dbf /oracle/oracle92/user01.dbf
 结束表空间的热备份模式
Alter tablespace users end backup;
 相同方法备份其他表空间(read only 和 offline 表空间不能置为热备份模式)
 备份二进制的控制文件
Alter system backup control file to ‘d:oraclehotbackcontrolfile.ctl’ reuse;
Rem reuse 表示当文件存在时覆盖。

3、 开始热备份时发生什么?
 执行一个checkpoint 将所有dirty data 写入文件(保证热备份开始前文件是一致的)
 锁定文件头的checkpoint scn,但是数据库的改变可以正常进行。
 在alert文件中增加一条记录

4、 热备份时相关SCN 如何处理?
在 开始进行热备份时,数据文件头的checkpoint scn 和控制文件中该文件的scn lock住,但是数据文件的dml操作可以正常进行,也就意味着block 的scn 是正常增加的,数据文件并没有锁定。为什么要Lock 文件的checkpoint scn(实际上对应了恢复时的rba) 主要是为了标示进行恢复操作时需要的redo log, 这样就可以保证数据文件内所有的块都能得到恢复,因为在进行数据文件拷贝时无法保证数据文件头是最先拷贝完成的。如果先拷贝的是数据文件的其他部分然后才 去拷贝的数据文件头,这时候很有可能数据文件头的checkpoint scn已经改变了而恢复时应用redo log的范围是由数据文件头的rba决定的。
当热备份结束时,在备份结束的时候,oracle会把数据文件头和control文件中关于这个数据文件的SCN号更新为数据库的SCN号。

5、 为什么热备份时产生的redo大量增加?
首 先说下造成大量增加的直接原因吧,因为数据文件在进行热备份时,该数据文件中的处于data buffer中数据块在首次发生改变时oracle会把整块的block image 写入redo log。注意该处首次改变是对处于buffer中的数据块而言的,而不是文件中的block,例如对于datafile1 的第20个块:
File ---data buffer 从文件中读入db buffer
Data buffer-----change 产生block image to redo log
Data buffer ------change 不产生blcok image 而是正常的change vector
Data buffer ----file 从db buffer 写入文件
File ----data buffer 又从文件中读入db buffer
Data buffer-----change 再次产生block image to redo log
Data buffer ------change 不产生blcok image 而是正常的change vector

之 所以要存储block image主要是为了处理由于oracle 的block size 和操作系统的block size 不一致而可能造成的split block(指数据块不一致)。热备份中我们用的是操作系统命令copy or cp 来拷贝数据文件,这些命令操作的块大小都是由操作系统决定的而操作系统块和数据库块大小一般不相同。如果当数据库块在改变的同时在进行拷贝,就很有可能造 成拷贝的数据块不一致(其中一部份改变前拷贝的一部分是改变后拷贝的)。Oracle 在恢复时将split block 当成是currption block,这时就需要redo log中的block image覆盖现有块来进行恢复

6、 Rman备份为什么不用锁文件头scn,不增加redo?
锁文件头scn只是为了可以正确标示恢复时的rba,热备份方式中这个rba需要从备份的数据文件本身获取,而rman方式将其写入了controlfile 或catalog,所以不用锁文件头。
Rman 在备份时需要使用两个缓冲区一个输入缓冲区,一个输出缓冲区。数据块在从输入缓冲区传送到输出缓冲区时会进行一致性校验,不一致时会重新读取直到一致。所以rman备份的文件数据块级都是一致的,不需要block image。
(两个缓冲区默认在pga中如果设置了io_slave 会在larger pool 中。)

7、 热备份过程中发生crash如何恢复?(以users 表空间 user01.dbf file# 9 为例)
如果在热备份的过程中发生crash在startup时会报:ORA-01113文件9需要恢复。
有两种方式可以解决这个问题:
1、 alter tablespace users end backup;
2、 recover datafile 9;
因为这时报的错误和restore了一个文件后需要恢复时一样的,所以在确定是没有end backup时用第一种方法否则应该用第二种。

8、 热备份恢复相关视图?
v$recover_file:需要恢复的文件
v$recover_log:需要应用的归档日志
x$kcvfh :可以查看各个文件的rba
v$backup:显示当前的备份状态

9、 热备份相关脚本?(备份脚本)
set linesize 800 verify off pagesize 0 feedback off
define dir='c:oracleadminhotback2008-10-26'
define log='c:oracleadminhotback2008-10-26bklog.txt'
define fil='c:oracleadminsqlsheetbkdatafile.sql'
set serveroutput on
spool &fil
prompt spool &log
prompt archive log list;;
prompt alter system switch logfile;;
declare
cursor c_tbs is select tablespace_name tbsname from dba_tablespaces where status='ONLINE';
cursor c_datafile(tn varchar2) is select file_name from dba_data_files where tablespace_name=tn;
begin
for row_tbs in c_tbs loop
dbms_output.put_line('alter tablespace '||row_tbs.tbsname||' begin backup;');
for row_file in c_datafile(row_tbs.tbsname) loop
dbms_output.put_line('host copy '||row_file.file_name||' &dir;');
end loop;
dbms_output.put_line('alter tablespace '||row_tbs.tbsname||' end backup;');
end loop;
end;
/
prompt alter system switch logfile;;
prompt alter database backup controlfile to '&dircontrofile.ctl';;
prompt archive log list;;
prompt spool off;;
spool off;
@&fil

10、 当归档日志文件不在默认位置时如何处理?
我们在进行热备份恢复时需要的归档日志文件很有可能从默认的归档位置移走了,在恢复时要一个一个指定归档日志位置很麻烦,可以使用以下方式解决。
 Recover from ‘new_dir’ datafile 9; -- 该方法我试了下不行,好像已被oracle废除
 Set logsource ‘new_dir’ --注意没有“=”
Recover datafile 9;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11997930/viewspace-1026572/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11997930/viewspace-1026572/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值