ORACLE热备份机制

ORACLE热备份机制

Oracle 版本:9i10g

1、进行热备份的要求?

热备份是一种数据库的处于打开时的物理备份,因为数据库在不断发生改变,因此备份的文件必然是不一致的,这就要求数据库必须处于归档日志模式。

2、热备份的一般流程?

u  查看数据库是否处于归档日志模式,若不是将数据库置为归档日志模式。

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;

 

u  查看当前的归档日志情况确认已归档

Archive log list;

 

u  将表空间置为热备份模式(users 表空间为例)

Alter tablespace users begin backup;

 

u  物理拷贝数据文件

Rem for windows

Sql> host copy c:\oracle\ora92\user01.dbf d:\oracle\hotbackup;

Rem for linux/unix

Sql>host cp  /oracle/ora92/user01.dbf  /oracle/oracle92/user01.dbf

 

u  结束表空间的热备份模式

Alter tablespace users end backup;

 

u  相同方法备份其他表空间(read only  offline 表空间不能置为热备份模式)

u  备份二进制的控制文件

Alter system backup control file to ‘d:\oracle\hotback\controlfile.ctl’ reuse;

Rem reuse 表示当文件存在时覆盖。

 

3、开始热备份时发生什么?

u  执行一个checkpoint 将所有dirty data 写入文件(保证热备份开始前文件是一致的)

u  锁定文件头的checkpoint scn,但是数据库的改变可以正常进行。

u  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覆盖现有块来进行恢复

 

6Rman备份为什么不用锁文件头scn,不增加redo

锁文件头scn只是为了可以正确标示恢复时的rba,热备份方式中这个rba需要从备份的数据文件本身获取,而rman方式将其写入了controlfile catalog,所以不用锁文件头。

Rman 在备份时需要使用两个缓冲区一个输入缓冲区,一个输出缓冲区。数据块在从输入缓冲区传送到输出缓冲区时会进行一致性校验,不一致时会重新读取直到一致。所以rman备份的文件数据块级都是一致的,不需要block image

(两个缓冲区默认在pga中如果设置了io_slave 会在larger pool 中。)

 

7、热备份过程中发生crash如何恢复?(users 表空间 user01.dbf  file# 9 为例)

如果在热备份的过程中发生crashstartup时会报:ORA-01113文件9需要恢复。

有两种方式可以解决这个问题:

1alter tablespace users end backup;

2recover datafile 9;

因为这时报的错误和restore了一个文件后需要恢复时一样的,所以在确定是没有end backup时用第一种方法否则应该用第二种。

 

8、热备份恢复相关视图?

v$recover_file:需要恢复的文件

v$recover_log:需要应用的归档日志

x$kcvfh :可以查看各个文件的rba

 

9、热备份相关脚本?(备份脚本)

set linesize 800 verify off pagesize 0 feedback off

define dir='c:\oracle\admin\hotback\2008-10-26'

define log='c:\oracle\admin\hotback\2008-10-26\bklog.txt'

define fil='c:\oracle\admin\sqlsheet\bkdatafile.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 '&dir\controfile.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/12330444/viewspace-709093/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12330444/viewspace-709093/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值