ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle专题深入讨论 » 热备份(hot backup)期间到底做了什么?

标题: [精华] 热备份(hot backup)期间到底做了什么?
离线 Arraygrassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (102)
社区积分 365 (1739)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-8-10 23:39 
热备份(hot backup)期间到底做了什么?

热备期间最大的特点就是产生了比平常更多的日志文件,为什么会这样?在恢复的时候有什么用呢?

热备期间日志文件记录的是修改的row所在的整个block的image,而不仅仅是修改的row的信息。
这样做的目的是为了尽量避免热备份的数据文件中因为包含SPLIT BLOCK ,而不能用于恢复的可能性。
为了理解这段话,还要提一下SPLIT BLOCK的概念.

我们都知道,oracle 的block 是由多个OS blocks组成。比如,某个Unix 文件系统使用 512bytes
的blocksize,而oracle 使用8k 的db_block_size. 当热备份数据文件的时候,我们使用文件
系统的命令工具copy 拷贝文件,并且使用文件系统的blocksize 读取数据文件。

假设这种情况:当我们拷贝数据文件的同时,数据库正好向数据文件写数据。这就使得拷贝的文件中
包含这样的database block,它的一部分OS block 来自于数据库向数据文件(这个db block)写操作之前,
另一部分来自于写操作之后。这个database block就是一个SPLIT BLOCK.

所以,通过在日志中记录整个变化的db block 的image,可以保证在恢复的过程中,任何在热备的数据文件中出现的
SPLIT BLOCK可以通过日志文件中的full image of the block 覆盖掉得以解决。以保证将来恢复的成功。


SPLIT BLOCK 的概念可以参考:http://tahiti.oracle.com/  中查找 fractured block


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (102)
社区积分 365 (1739)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-8-10 23:40 
证实热备过程产生了更多的redo:
PHP code:


'--- 正常运行产生的redo---'



SQLselect value from v$sysstat where name='redo size';



     
VALUE

----------

   
2989820



SQL
insert into t select from dba_objects;



24652 rows created.



SQLcommit;



Commit complete.



SQLselect value from v$sysstat where name='redo size';



     
VALUE

----------

   
5774388



SQL
select 5774388-2989820 from dual;



5774388-2989820

---------------

        
2784568





'--- hot backup 期间产生的redo---'

SQLtruncate table t;



Table truncated.



SQLshow user;

USER is "SYS"

SQL

SQLalter tablespace system begin backup;



Tablespace altered.



SQLselect value from v$sysstat where name='redo size';



     
VALUE

----------

   
5782896



SQL
insert into t select from dba_objects;



24652 rows created.



SQLcommit;



Commit complete.



SQLselect value from v$sysstat where name='redo size';



     
VALUE

----------

   
8608520



SQL
select 8608520-5782896 from dual;



8608520-5782896

---------------

        
2825624



SQL
alter tablespace system end backup;



Tablespace altered.





'--- 两者比较---'

SQLselect 2825624-2784568 from dual;



2825624-2784568

---------------

          
41056



SQL
>




__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (102)
社区积分 365 (1739)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-8-11 12:01 
我的问题:

我一直对为什么begin backup后要锁定这个数据文件的checkpoint scn 不太明确?

我的理解和猜测:

热备过程中使用统一的checkpoint scn ,可以在日至文件中很方便的找到哪些日志是hot backup时产生的日志,这个过程中的有可能产生SPLIT BLOCK ,需要在恢复时特别注意。而不需要影响到其他的block。

大家有什么意见?


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
顶部
离线 xzh2000
仙人抚我须 结发授长生



精华贴数 13
个人空间 0
技术积分 46551 (14)
社区积分 5188 (293)
注册日期 2002-7-17
论坛徽章:32
现任管理团队成员ITPUB元老授权会员2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:垒球生肖徽章2007版:狗
2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:帆船生肖徽章2007版:虎ITPUB新首页上线纪念徽章数据库板块每日发贴之星数据库板块每日发贴之星

发表于 2004-8-11 12:27 
create or replace procedure print_redo( v_sql varchar2, v_commit boolean default true)
as
        v_redo1 number(17,2);
        v_redo2 number(17,2);
        v_redos number(17,2);
        v_redok number(17,2);
begin
  /*初始*/
        select m.value into v_redo1
   from v$mystat m,v$statname s
  where m.statistic#=s.statistic# and s.name like '%redo size%';
        /*exec sql*/
  execute immediate v_sql;
        /*结束*/
        select m.value into v_redo2
   from v$mystat m,v$statname s
  where m.statistic#=s.statistic# and s.name like '%redo size%';
        /*计算*/
        v_redos := v_redo2 - v_redo1;
        v_redok := v_redos/1024;
        dbms_output.put_line('            trans redo calc                ');
        dbms_output.put_line('-------------------------------------------');
        dbms_output.put_line('my redo size:  '||to_char(v_redos)||'  (Bytes)');
  dbms_output.put_line('my redo size:  '||to_char(v_redok)||'  (Kbytes)');
  dbms_output.put_line('-------------------------------------------');
        /*提交否*/
        if v_commit = true then
                commit;
        else
          rollback;
        end if;
end;

/*demo*/
exec print_redo('delete from a_test',false);


__________________
过目即忘  插柳成荫
顶部
在线/呼叫 biti_rainy
人生就是如此



精华贴数 38
个人空间 0
技术积分 111201 (4)
社区积分 11832 (132)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2004-8-11 14:07 


QUOTE:
最初由 grassbell 发布
我的问题:

我一直对为什么begin backup后要锁定这个数据文件的checkpoint scn 不太明确?

我的理解和猜测:

热备过程中使用统一的checkpoint scn ,可以在日至文件中很方便的找到哪些日志是hot backup时产生的日志,这个过程中的有可能产生SPLIT BLOCK ,需要在恢复时特别注意。而不需要影响到其他的block。

大家有什么意见?


冻结的checkpoint  scn , 使得备份出来的文件可以从该scn(实际上对应了日志文件的RBA)开始恢复,这样保证所有的block都能得到完好的恢复(当然包括split  block)。另:文件被拷贝的时候,并不能确保文件头是最先被完整地拷贝成功的。


BTW: 文件置于热备份状态之后,当buffer第一次被修改的时候产生整个块的before image。注意是buffer而不是block。 也就是说,当buffer被写入文件再读进来,再发生变化的时候将重新产生 block 的 before image。 这是由block中一个标志位所控制的。


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (102)
社区积分 365 (1739)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-8-11 16:38 


QUOTE:
最初由 biti_rainy 发布

BTW: 文件置于热备份状态之后,当buffer第一次被修改的时候产生整个块的before image。注意是buffer而不是block。 也就是说,当buffer被写入文件再读进来,再发生变化的时候将重新产生 block 的 before image。 这是由block中一个标志位所控制的。


biti_rainy, 这句话我理解起来有困难

能否通俗一点,再来一便,多谢


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
顶部
在线/呼叫 biti_rainy
人生就是如此



精华贴数 38
个人空间 0
技术积分 111201 (4)
社区积分 11832 (132)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2004-8-11 17:20 


QUOTE:
最初由 grassbell 发布


biti_rainy, 这句话我理解起来有困难

能否通俗一点,再来一便,多谢


对于同一个block依次发生如下情景

file  block  ---server  process  read  from  file--- into  sga  buffer
buffer  ----  server  process modify  the buffer  --- generate  redo  (whole   block   before  image)
buffer  ---- server  process modify  the  buffer  agin  --- no  redo   for  block  before  image
sga buffer  --- dbwr write the  buffer  to  file  ----  file

file  block  ---server  process  read  from  file--- into  sga  buffer
buffer  ----  server  process modify  the buffer  --- genarate  redo  (whole   block   before  image)
……
……


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
顶部
离线 lifeng@itpub
初级会员



精华贴数 0
个人空间 0
技术积分 42 (31760)
社区积分 0 (135769)
注册日期 2004-8-10
论坛徽章:0
      
      

发表于 2004-8-15 16:38 
在热备过程中虽然数据文件文件头中checkpoint scn更新被冻结,但数据文件块还是会被更新,导致在使用OS命令备份数据文件时,备份的数据文件会产生split现象,即在拷贝某个数据块的过程中数据块被更新,因此oracle就必须将数据块的past image写入日志文件中以用于重建SPLIT的数据块.从而导致了日志文件的增大.past image的写入受init.ora参数log_blocks_during_backup控制,缺省值是true,表示须写入日志文件


顶部
离线 grassbell
深入讨论区斑竹


精华贴数 9
个人空间 0
技术积分 11852 (102)
社区积分 365 (1739)
注册日期 2003-6-13
论坛徽章:6
管理团队成员ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2006贡献徽章授权会员
      

发表于 2004-8-16 22:10 
RMAN的热备就取消了 alter tablespace... begin backup; 命令,不必锁定数据文件;而且不会产生多余的日志文件。

这是因为:
RMAN采取了类似于 sql 查询时的一致性读的原理进行热备的,所以不必要在日志中产生整个快的image;并且将开始热备时的scn 记录在rman 目录或者控制文件中,不必要冻结数据文件头。

我的问题:
RMAN采取的一致性读是什么范围的?
整个数据文件?不应该,这样跨越的范围太大,对回滚段的要求太高;

还有,既然RMAN采取 oracle server process 读取数据块,我觉得本身就不会产生split block 的情况。


__________________
不是自己的,多研究,多做实验,把心得写出来,变成自己的

欢迎访问Alibaba DBA 团队Blog: www.alidba.net
顶部
在线/呼叫 d.c.b.a
人生积极一点好


精华贴数 6
个人空间 0
技术积分 14167 (83)
社区积分 1359 (804)
注册日期 2004-2-19
论坛徽章:22
现任管理团队成员Heart of PUBITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章会员2007贡献徽章
生肖徽章2007版:猴ITPUB新首页上线纪念徽章    

发表于 2004-8-16 22:16 
The file's block was still being modified by Oracle.


__________________

专业Oracle/Shareplex技术支持服务, 管理, 培训, 调优, 备份, 恢复!

个人主页: 订阅AnySQL | AnySQL | dbatools | AUL Step by Step | OracleSOS.com
联系方法: MSN: anysql©live.com, Skype: anysql, QQ: 37223884
顶部

CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问