- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
热备份原理分析(上).pdf
热备份原理分析(上)
我们都知道oracle的备份有几钟方式,冷备,热备,rman,imp等,我们注意到当我们
采取热备的时候,需要对每个要备份的表空间置为backup模式。通常的热备脚本都是这样的:
alter tablespace XXX begin backup;
cp XXX …
alter tablespace XXX end backup;
(这里需要注意一点,oracle的最小存储单位是一个数据块,一个块的大小通常设置为
8k,而操作系统的块通常是512bytes,这样的话一个oracle的数据由很多个操作系统的块组
成。而且对于一个数据文件来说,它的所有块对应的操作系统的块并不是按顺序存储的,当
运行cp等操作系统命令时并不能指定从那个oracle数据块开始拷贝。)
当open数据库的时候,oracle会去比较控制文件中数据文件记录和数据文件头的
checkpointcnt,如果两者相同,则判断不需要介质恢复,如果不同,这时候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
文档评论(0)