网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.详细介绍Oracle 8i中怎样实现实时.
.oracle 使用杂记一.
.oracle自动imp脚本代码.
.Oracle在Linux操作系统下的安装小.
.Oracle 的标准系统服务脚本 for .
.Oracle存储过程中任务和管道的应.
.TestKing Oracle 1z0-024 V3.
.Oracle中细粒度访问控制的工作方.
.Java开发中使用Oracle数据库的一.
.如何在硬碟建置Linux系统之启动虚.
.关于SGA设置的一点总结.
.Oracle9.2.0.1.0 for HP-UX11iv1.
.向基于Linux的Oracle RAC 10g集群.
.PL/Sql循序渐进全面学习教程.
.Oracle的翻页Sql语句.
.Oracle创建实例的最少参数需求.
.Oracle数据库技术(8).
.oracle调优之sql语句.
.技术笔记-Forms的错误控制.
.ORACLE获取DDL的几种常用的方法.

热备份原理分析

发表日期:2008-2-9


我们都知道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会去建议块的一致性,所以不用复制镜像块到日志。

上一篇:rman备份,未用catalog,控制文件丢失的解决(2) 人气:628
下一篇:在Oracle中获取磁盘空间的使用情况 人气:591
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐