• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
热备份原理分析
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
热备份原理分析
软件发布 热备份原理分析
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 认证考试 >> Oracle认证 >> Oracle指导 >> 热备份原理分析

热备份原理分析

添加时间: 2008-4-19 22:07:54  作者: Oracle指导  阅读次数:17   来源: http://www.d9soft.com

       

我们都知道oracle的备份有几钟方式,冷备,热备,rman,imp等,我们注意到当我们采取热备的时候,需要对每个要备份的表空间置为backup模式。通常的热备脚本都是这样的
alter tablespace XXX begin backup;
cp XXX ....
alter tablespace XXX end backup;
(这里需要注意一点,oracle的最小存储单位是一个数据块,一个块的大小通常设置为8k,而操作系统的块通常是512bytes,这样的话一个oracle的数据由很多个操作系统的块组成。而且对于一个数据文件来说,它的所有块对应的操作系统的块并不是按顺序存储的,当运行cp
等操作系统命令时并不能指定从那个oracle数据块开始拷贝。)
当open数据库的时候,oracle会去比较控制文件中数据文件记录和数据文件头的checkpoint cnt,如果两者相同,则判断不需要介质恢复,如果不同,这时候oracle就会报某某文件需要介质恢复。然后拷贝回数据文件备份我们开始recover,这时候就从上次做备份时的scn开始恢复,运用日志,直到恢复结束。当cp数据文件时,比如说我们拷贝的第一个块可能是scn为100的数据块,当我们完成这个块的拷贝后,这个块有可能被别的进程多次修改,scn变为900。我们知道当数据库发生 检查 点时会去更新数据文件头和控制文件中的checkpoint scn,如果当我们在cp数据文件的同时发生了n次checkpoint,这时候数据文件头的scn可能被更新了很多次。这时候cp的进程去拷贝数据文件头所在的操作系统块,可能这个数据文件头的块因为被checkpoint了很多次导致它的scn为1000,这时候整个数据文件会出现不一致,当用这个备份文件去恢复时,恢复进程会从scn=1000开始恢复,这样的话开始那个scn=100的块将丢失从scn100-scn1000的数据,因为数据块并不应用scn在1000以前的日志,而且这样做的话可能出现一些数据块的corruption,所以不置成backup模式备份的话并不可取。当然,如果你能确保当cp的时候不发生checkpoint,或者你的操作系统块的大小不小于oracle的数据块大小,这些情况下不置backup mode拷贝出来的文件也是有效的。

现在我们知道了为什么不能不设置backup模式,下面来讲讲alter tablespace XXX begin backup做了什么?
当数据文件置于backup模式时,oracle会去锁定数据文件头,这时候数据库发生检查点的话将不会修改文件头的checkpoint scn,而只是增加checkpoint cnt,所以不管执行cp的时候操作系统块的拷贝顺序是如何,oracle总会从文件头的scn开始恢复,这样的话也就避免了数据丢失和数据块corruption.如果大家用的是rman来备份,那么就不会有这个问题,因为rman备份的时候rman会去对比数据块的头尾标志,如果发现不一致,那么它将会再去读这个块,直到读到一致的块才往备份集里写。

 

但是alter tablespace XXX begin backup带来的另一个问题是会导致产生多余的日志,通过一个小小的试验就可以证明这一点。

SQL> select name,value from v$sysstat where name='redo size';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo size                                                             43408

SQL> update test set a=a;

1 row updated.

SQL> commit;

Commit complete.

SQL> select name,value from v$sysstat where name='redo size';

NAME                                                                  VALUE
  


---------------------------------------------------------------- ----------
redo size                                                             44060

 

SQL> ALTER SYSTEM DUMP LOGFILE '/netappredo/redo05.log';

System altered.

                                      

一个update的动作产生44060-43408=652bytes的redo

把表空间置为backup mode

SQL> alter tablespace test begin backup;

Tablespace altered.

SQL> select name,value from v$sysstat where name='redo size';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo size                                                             44732

SQL> update test set a=a;

1 row updated.

SQL> commit;

Commit complete.

SQL> select name,value from v$sysstat where name='redo size';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
redo size                                                             53560

SQL> alter tablespace test end backup;

Tablespace altered.

一个update的动作产生53560-44732=8828bytes的redo


看看到底是记了些什么?


SQL> ALTER SYSTEM DUMP LOGFILE '/netappredo/redo05.log';

System altered.

REDO RECORD - Thread:2 RBA: 0x00004e.000000b0.0128 LEN: 0x01b0 VLD: 0x01
SCN: 0x0000.19ed24f7 SUBSCN:  1 06/29/2004 15:05:32
CHANGE #1 TYP:0 CLS:29 AFN:33 DBA:0x08400029 SCN:0x0000.19ed24f2 SEQ:  1 OP:5.2
...... (改动向量1,记载对undo header事务表的修改)
CHANGE #2 TYP:0 CLS:30 AFN:33 DBA:0x0840002e SCN:0x0000.19ed24f0 SEQ:  1 OP:5.1
...... (改动向量2,记载对undo block的修改)
CHANGE #3 TYP:2 CLS: 1 AFN:51 DBA:0x0cc0000f SCN:0x0000.19ed24e8 SEQ:  1 OP:11.5


KTB Redo (改动向量3,记载对数据块的修改,也就是在数据块上执行update test set a=a)
op: 0x11  ver: 0x01 
op: F  xid:  0x0007.001.00014ece    uba: 0x0840002e.0859.38
Block cleanout record, scn:  0x0000.19ed24f7 ver: 0x01 opt: 0x02, entries follow...
  itli: 1  flg: 2  scn: 0x0000.19ed24e8
KDO Op code: URP row dependencies Disabled
  xtype: XA  bdba: 0x0cc0000f  hdba: 0x0cc0000b
itli: 2  ispac: 0  maxfr: 4858
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 2 ckix: 0
ncol: 1 nnew: 1 size: 0
col  0: [ 2]  c1 02
CHANGE #4 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:  0 OP:5.20
......(改动向量4,一些标记)


我们看到了正常的日志记录,此外还有些block cleanout及回滚段改变的日志记录,但是相比较不是backup模式的日志来说多了这一部分。
Log block image redo entry
Dump of memory from 0x0AE48820 to 0x0AE4A808
AE48820 00280001 00002C32 19ED24E6 1FE80000  [..(.2,...$......]
AE48830 00321F02 0CC00009 00210005 000307F1  [..2.......!.....]
AE48840 0840000E 0021100C 00002001 19ED24E8  [..@...!.. ...$..]
AE48850 001F0016 0001A94C 0840007C 000D0C08  [....L...|.@.....]
AE48860 00008000 19ED2468 00000000 00000000  [....h$..........]
AE48870 00020100 00160001 1F791F8C 00001F79  [..........y.y...]
AE48880 1F920002 0F88FFFF 0ED00F2C 0E180E74  [........,...t...]
AE48890 0D600DBC 0CA80D04 0BF00C4C 0B380B94  [..`.....L.....8.]
AE488A0 0A800ADC 09C80A24 0910096C 085808B4  [....$...l.....X.]
AE488B0 07A007FC 06E40744 06240684 056405C4  [....D.....$...d.]
......
这一部分是对更改的数据块做的一个镜像,把这个块完全记录到redo里面去了,但是为什么要这么做呢。
这就又牵扯到一个概念,'block split',当数据文件在备份cp时,因为oracle数据块和操作系统块的差异,一个数据块可能由16个操作系统块组成(8k 数据块,512bytes 系统块),这样的话可能出现一个数据块包含了几个不同版本的操作系统块,会导致数据块的不一致,所以在备份模式下如果有语句对备份块产生更新,那么oracle会先把当前块复制一份到redo,当恢复的时候如果碰到数据块不一致就从redo把这个镜像拷贝回去,然后在这个一致性的镜像开始恢复。 如果使用rman来备份可以避免产生过多的块,就像上面所说的,rman会去建议块的一致性,所以不用复制镜像块到日志。

 

 

上下文章:

 

上一篇文章: 在T-SQL中实现Oracle的MINUS集合运算符 下一篇文章: Oracle9iAS Containers for J2EE独立版指南

相关文章:

  • 分析师:雅虎有4个理由接受微软收购搜索业务
  • 从公测内容展示视频分析《永恒之塔》
  • 分析师:别指望Windows 7在2010年前上市
  • Gartner分析师称杨致远表现差 或被伊坎逼宫
  • 小知识: 硬盘的读写原理和磁盘碎片的产生

相关软件:

  • 双色球大赢家彩票分析软件 V3.07 正式版
  • 聪慧幼儿园营养分析软件 v6.0
  • 中小学成绩统计分析系统 (教委与学校通用企业版) V4.01
  • 帐号备份大师 2009 网页版
  • 木马分析专家 2008 9.95 Build 1016
  • 木马分析专家个人防火墙 2008 1016

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

Oracle认证分类导航

  • Oracle动态
  • Oracle指导
  • Oracle题库

本类经典文章推荐

  • Oracle中关于逻辑备份与恢复
  • Oracle开发人员JAVA存储过程
  • 为数据库的表自动生成行号
  • Oracle中的OOP概念
  • 用java从oracle取数
  • 冷备份移植到另一台Solaris机器上
  • 如何将excel数据导入oracle中
  • Oracle10.2g安装记录
  • 数据库监控工具ForOraclev1.2
  • oracle双机群集系统

Oracle指导阅读排行

  • Oracle系统表查询
  • 实例:Oracle导出EXCEL文件
  • Oracle常用的OCI函数上
  • 案例学习Oracle错误:ORA-00060
  • 案例学习Oracle错误:ORA-00604
  • Tomcat+SQLServer连接池配置
  • 如何将excel数据导入oracle中
  • Oracle企业管理器(OEM 2.1)使用...
  • ORACLE数据库简介
  • 案例学习Oracle错误:ORA-00904

Oracle认证阅读总排行

  • Oracle系统表查询
  • 实例:Oracle导出EXCEL文件
  • Oracle常用的OCI函数上
  • 在ORACLE的存储过程中如何做简单的...
  • 案例学习Oracle错误:ORA-00060
  • 案例学习Oracle错误:ORA-00604
  • Tomcat+SQLServer连接池配置
  • 如何将excel数据导入oracle中
  • Oracle企业管理器(OEM 2.1)使用...
  • AIX下自动启动Oracle数据库与监听...

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有