当前位置: 首页 > 编程日记 > 正文

关于 RMAN 备份 数据块 一致性的讨论

 

今天和 杭州恒生 的一个朋友讨论一个RMAN 在备份时数据块一致性的问题。

 

关于RMAN 的备份原理参考blog

    RMAN 系列(一)---- RMAN 体系结构概述

http://blog.csdn.net/tianlesoftware/archive/2010/06/09/5659701.aspx

 

先看官方文档上的一段话:

 

Consistent Backups

You can use the BACKUP command to make consistent and inconsistent backups of the database. A consistent backup occurs when the database is in a consistent state. A database is in a consistent state after being shut down with the SHUTDOWN NORMAL, SHUTDOWN IMMEDIATE, or SHUTDOWN TRANSACTIONAL commands. A consistent shutdown guarantees that all redo has been applied to the datafiles. If you mount the database and make a backup at this point, then you can restore the database backup later and open it without performing media recovery.

 

Inconsistent Backups

Any database backup that is not consistent is an inconsistent backup. A backup made when the database is open is inconsistent, as is a backup made after an instance failure or SHUTDOWN ABORT command. When a database is restored from an inconsistent backup, Oracle Database must perform media recovery before the database can be opened, applying any pending changes from the redo logs.

 

Note:

RMAN does not permit you to make inconsistent backups when the database is in NOARCHIVELOG mode. If you employ user-managed backup techniques for a NOARCHIVELOG database, then you must not make inconsistent backups of this database.

If the database runs in ARCHIVELOG mode, and you back up the archived redo logs and datafiles, inconsistent backups can be the foundation for a sound backup and recovery strategy. Inconsistent backups offer superior availability because you do not have to shut down the database to make backups that fully protect the database.

 

1  consistent backup:

一致性备份一个数据库或者数据库的一部分,那么这部分的数据文件及控制文件必须被checkpointed并且拥有相同的scn(system change number)oracle 决定是否一致性备份通过检查数据文件头以及这个数据文件头的在控制文件里的信息,如果是一致的,则表示为一致性备份。

 

这里补充一点知识:

当发生checkpoint时,会把SCN写到四个地方去。 三个地方于control file内,一个在datafile header

1.    System checkpoint SCN ===========> (SYSTEM CHECKPOINT SCN in control file)

2.    Datafile checkpoint SCN ===========> (DATAFILE CHECKPOINT SCN in control file)

3.    Stop SCN ======================> (STOP SCN in control file)

4.    Start SCN ======================> (DATAFILE HEADER)

         正是因为这些SCN,我们才保证了一致性。详细内容参考:

                   RedoLog Checkpoint SCN关系

                   http://blog.csdn.net/tianlesoftware/archive/2010/01/25/5251916.aspx

 

   

只有当数据库正常关闭,既通过normal,immediate,transactional选项关闭数据库,而后进行的备份才是一致的,如果instance fails或者shutdown abort进行关闭,那么数据文件是不一致的,这时当数据库打开时是需要instance 恢复,(当然数据库是read-only database不需要进行instance 恢复)

 

Oracle 通过checkpoint进程使控制文件和数据文件拥有一致的scn,当表空间处于只读(read-only)或者offline normal tablespace 时,允许使用旧的scns,这时该表空间中的数据文件跟其他的数据文件仍然被认为是一致的,因为在脱机后,表空间没有进行任何新的改变。

当数据库restore 一致性数据库全备份后,打开数据库将不需要应用redo,因为数据已经是一致的,不需要新的动作使数据文件变正确。

noarchivelog模式下,一致性全备份是唯一有效的选择,因为如果选择了不一致性备份,那么恢复需要apply redo,而非归档模式下,所需要的redo logs有可能是不存在磁盘上。

 

2  Inconsistent backup:

非一致性备份是备份中的数据文件和控制文件他们没有被checkpointed至相同的scnoracle将不能打开数据库直到所有的文件头header scnsconsistent,也就是说,直到在线重做日志中所有的改变的记录都应用到磁盘中数据文件中。
  
这里是我们讨论的重点。 因为如果数据库处与open 状态,那么数据块就会被修改,SCN 也会发生相应的变化。 但是RMAN 在备份前是通过快照控制来参考的。 这就会造成不一致状态。

 

控制文件存储数据库的结构信息,这些信息包括用于恢复的检查点SCN信息。但是控制文件是一个非常繁忙的文件,连续的SCN 和文件管理对于数据库的生命期来说至关重要,因此RDBMS 必须能够持续的使用控制文件。

RMAN 开始备份每一个数据文件时需要得到一个一致的控制文件视图, RMAN需要知道备份开始时最新的检查点信息和文件信息。开始备份后,RMAN 需要这些信息在备份操作期间保持一致,也就是说RMAN需要一个读取一致的控制文件视图。除非RMAN 在备份持续时间内锁定控制文件,否则数据库会不断更新控制文件,所以不可能。 但是,锁定控制文件意味着数据库不能执行检查点操作和切换日志,或则不能产生新的归档日志,这些操作是不可能的。

所以就有了快照控制文件(snapshot controlfile),快照控制文件是控制文件的副本。 RMAN 只在备份和同步操作期间使用快照控制文件。 这些操作开始时,RMAN 会根据实际控制文件来刷新快照控制文件,这样会短暂的锁住控制文件,随后,RMAN 会切换到快照并在备份持续使用这个快照。 这种方式具有读取一致性,且不妨碍数据库活动。

 

 作为24*7的系统,唯一的选择是进行非一致性的备份,这时数据库必须是归档模式,当offline a tablespace进行备份时,那么这时这个表空间中的数据文件将跟其他表空间是不一致的了,因为数据库在进行活动,数据库中的其他部分会被修改,那么这是offlineonline的数据文件可能会包含不一致的scn
   
当数据库处于归档模式下,可以建立一个全备份使用备份在线数据文件在不同的时间,例如,在不同时间分别备份数据库中所有的表空间及控制文件,我们认为这种交错排列的备份是一个全备份。
   
关闭状态下,可以进行非一致性备份,当数据库处于归档模式下,如果关闭时使用了shutdown abort,那么关闭后进行的备份,就是不一致性备份,但这个备份是有效的,因为可以应用在线和归档重做日志使数据库在打开的时候处于一致。
   
而在noarchivelog模式下,进行的非一致性全数据库备份,仅仅当redo logs包含所有在上次backup以来的改变,这种情况很少也不希望发生。oracle强烈建议别在noarchivelog 模式下进行shutdown abort命令,如果没有归档重做日志,那么将是不可能恢复。



3  重做日志,备份归档日志 控制文件
      
重做里面存放的是未归档的信息。 这些信息对恢复来说非常重要,因为当online backup inconsistent closed backup, 总会应用重做日志进行恢复,所以有时需要为未归档的重做日志进行归档,具体方式如下:

当数据库处于open状态:   alter system archive log current;

mounted,open or colsed: alter system archive log all;

mounted,open or colsed归档特定组:      alter system archive log group integer;

 

在打开或非一致性备份关闭的备份后,oracle推荐备份所有在备份期间产生的归档日志,并且在备份完成后备份控制文件。

 

我们在来理解一下归档日志的作用:

RMAN备份是一种物理的备份,它直接去读取数据块,因此rman是块级别的备份。从备份的那个时间点开始rman将锁定此刻的数据文件信息,也就是说只是备份数据文件到此刻的信息为之。

但是rman并不锁定数据文件的使用,也就是说rman的备份,不是数据库一致性状态的备份,由于rman备份是块级别的,它只备份控制文件中已经存在的数据块,同时数据库还在运行之中,那么就有可能会出现某些已经提交的操作,但是dbwn还没有写入数据文件,或者已经被rman备份过的数据块,又重新被修改,等等。

这些信息rman备份都不会记录,也是rman无法记录的。但是记录这些信息的是redo file,所以在rman完毕建议马上执行日志切换,然后备份归档日志,因为在rman恢复过程中,对于inconsistent backupRMAN要靠这些已经归档的redo file信息恢复和保持数据库的一直状态。

 

由此,我们可以可以看出,其实归档文件中真正有用的是从rman备份开始到rman备份结束时刻系统产生的归档日志。同时rman在恢复的时候,restore database完毕后,会依次利用归档日志和联机日志进行完全恢复。此时利用的这些归档就是从rman备份开始到rman备份结束产生的归档日志。

 

因此备份归档日志是很必要的,当然联机日志也是必须的,这些日志保证了rman能够完全的恢复数据库。

 

 

4. 热备份和RMAN redo 上的区别:

 

关于热备份的一些知识见blog

Oracle 备份与恢复 的补充说明

http://blog.csdn.net/tianlesoftware/archive/2010/06/04/5647494.aspx

 

热备份下 归档增加 的原因: 

热备份的时候redo log会增长较快,归档较平时增多,是由于在begin backup之后,如果正在备份(也就是OS命令拷贝cp)的数据块恰好又在被用户修改(因为是热备份,用户可以操作),那么可能会产生split block的情况(split blockoracle认为是corrupt block),也就是说,一个Oracle Block可能包含多个OS Block, OS Level的拷贝可能正拷贝的是一个Oracle Block的一部分(比如Header),而另一部分(比如尾端)被用户更新,发生变化,这样导致一个Oracle Block内部的不一致(不是consistent version),可能出现一个数据块包含了几个不同版本的操作系统块,被称为Split Block

 

注意:这里split blockOracle Block不是OS Block,是因为一个Oracle Block中不同版本的OS Block才导致产生Split Oracle Block的。

 

Oracle处理Split block的方法是将整个当前Oracle split block(变更后的)写入online redo log,恢复的时候如果发现datafile中某个Oracle Block中有不同版本(OS Block),就从redo把这个变更后的镜像拷贝回来,在这个版本一致的镜像上开始恢复。 不是像原来那样只写入更新部分到redo log, 所以热备期间redo log会激增

 

通过以上面的分析,可以看出,如果用热备份,那么会产生大量的redo log 因为热备份把不一致的内容全部写入了redo log

RMAN 备份允许不一致备份,那些不一致的数据块也会直接备份,但是,在这种情况下,必须通过应用归档文件,使数据块一直之后才能打开数据库。 所以RMAN 不会产生大量的redo,这也是RMAN的优点之一。

 

 

P S

         整理这篇文章是费了很多的脑细胞,因为理论的东西确实不好理解。 现在我把我对这块的理解整理了一下。 正确与否,还有待时间的考验。 因为随着时间的流逝,对Oracle的理解也在慢慢的变化。 以后会越来越清楚。 杭州恒生 这位朋友的讨论的收获就是加深了对 RMAN 数据块 这方面的理解。 也算是进步吧。 还是感觉做实验比较直观,按照文档一步一步下来,然后结果出来,正确,就大功完成了。 但理论这东西属于做学问,要花时间去理解,去研究。 费脑细胞啊….

 

 

 

 

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

Blog http://blog.csdn.net/tianlesoftware

网上资源: http://tianlesoftware.download.csdn.net

相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx

DBA1 群:62697716(); DBA2 群:62697977()

DBA3 群:63306533;     聊天 群:40132017

转载于:https://www.cnblogs.com/hibernate315/archive/2010/08/10/2399215.html

相关文章:

常用git命令

常用 Git 命令清单。专用名词的译名如下。半支烟 Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库 # 在当前目录新建一个Git代码库 $ git init# 新建一个…

springboot 读取配置文件内容的几种方式

1 使用 Environment 进行读取 env.getProperty("配置文件中的值") 2 使用注解的方式 PropertySource("classpath:application.properties") // 获取属性文件 //将其注解到类上 获取属性值 Value("${pictureSearchDemo.apiUrl}") // 获取属性…

Ubuntu9.10使用windows的字体的方法!

使用Ubuntu9.10已经有好几天了,安装字体算是我遇到的比较头疼的一件事,原本按照Ubuntu9.04的方法操作,发现无法使用windows中的字体,换了好几个方法,最终找打了解决方法,过程如下:1、新建一个文…

jmeter笔记(8)--关联

关联是jmeter中比较重要的一个点,在测试过程中有些数据是经常发生变化的,要获取这些数据,就需要使用关联,Jmeter可以通过“后置处理器”中的“正则表达式提取器”来处理关联。。 正则表达式提取器 1、在取样器下点击【添加】--【后…

java连接mysql以及增删改查操作

java连接数据库的代码基本是固定的,步骤过程觉得繁琐些,代码记起来对我来说是闹挺。直接上代码: (温馨提醒:你的项目提前导入连接数据库的jar包才有的以下操作 ) 1 class DBConnection{2 3 // 驱动类…

Jrebel 热部署插件的使用和破解

生成GUIDS 的网站:https://www.guidgen.com/ Jrebel 介绍和破解说明:https://www.cnblogs.com/wang1024/p/7211194.html 本地服务器软件,在使用eclipse或者idea 时打开就可以了。链接:百度云链接 密码:buin

微软SCRUM 1.0流程模板在中文版TFS2010上无法创建项目的解决办法(续)

原文: http://www.almnetworks.net/zh-CN/post/2010/08/04/Microsoft-Visual-Studio-Scrum-10-Template-on-Chinese-Version-of-TFS.aspx 经过我的进一步测试,发现以上步骤不能解决这个问题,但是我找到了一个可以暂时保证我们使用SCRUM模板的…

《父亲家书》选:给初为人师的儿子

文飞:离家已二十九天了,可能是年纪大了的缘故,不要说你妈妈,就连我也想念你了!为不影响你工作,我坚持不够一个月“决”不给你去信。这不到期了,就按时给你去信。你上次来信,早已收到…

vue-cli脚手架

安装 全局环境安装,不必要在项目地址下安装:npm install -g vue-cli 卸载 全局卸载:npm uninstall -g vue-cli 查看是否安装成功:vue list 查看vue版本,vue -V 回车,查看vue最新的版本。 使用 进入到编辑器…

JackJson 使用记录

Map<String,Object> map new HashMap();map.put("ssss","sadsad");// 定义JackJson 对象ObjectMapper mapper new ObjectMapper();//将map转换成JSON字符串String image_json mapper.writeValueAsString(map); https://blog.csdn.net/a123demi/art…

APUE 学习笔记 - Chapter 6. System Data File and Infomation

1.密码文件 每个系统都会有一个文件统一记录用户名与密码&#xff0c;通常是/etc/passwd。关于这个文件有&#xff1a;root 的 uin 通常为 0 .文件中的 x为占位符&#xff0c;代表真实的加密密码保存在另外的文件。没有这一列的时候&#xff0c;表示该用户没有设立密码。将用户…

加密工具和unlocker的使用

在我的电脑上&#xff0c;一些不想让人翻看的程序和资料都使用一款《E-钻文件夹加密大师》的伪加密软件来加密。 这个程序只防君子不防小人&#xff0c;真正想看的人还是可以找到方法看的。并且这个软件还有些bug和不方便之处。 我在电脑上编程之前需要对多个代码文件夹进行解密…

第四章:操作列表

第四章&#xff1a;操作列表4.1 遍历整个列表如果名单很长&#xff0c;将包含大量反复的代码。另外&#xff0c;每当名单的长度发生变化时&#xff0c;都必须修改代码。通过for循环&#xff0c;可让Python去处理这些问题1&#xff09;使用for循环来打印魔术师名单中的所有名字&…

约束,索引,rownumrownum

--constraint --not null 非空约束 --unique 唯一键 --非空&唯一 --自定义检查约束 --创建约束时&#xff0c;为约束起名 --在添加完列后&#xff0c;还可以添加约束 --除了not null不可以 --主键约束 --为了保证该列的数据能够证明行记录在表中是唯一的 --主键约束从形式看…

微信小程序如何搭建本地环境开发

必要软件 ngrok :用来搭建内网穿透微信小程序开发工具微信小程序账号 如何使用ngrok 搭建内网穿透 在官网下载windows版本的ngrok&#xff0c;并且注册一个免费的账号&#xff0c;至此会给你生成一个认证码。ngrok官网&#xff0c;附一个下载好的文件&#xff0c;里包括官方版…

跨域部署Silverlight时需要注意的问题

当我们的Silverlight程序(.xap)发布地址和网页发布地址处于不同服务器上(跨域状态)时&#xff0c;由于安全机制在Silverlight和Javascript调用时会出现一些问题&#xff0c;如&#xff1a;Silverlight调用页面中的Javascript方法或页面中的Javscript调用Silverlight方法时报错或…

做国内最好的ITSM服务管理软件

E8.HelpDesk支持多种服务台管理体系&#xff0c;支持事件管理、问题管理、变更管理、配置管理、发布管理、运行管理的全程自动化&#xff1b;整个处理工作以流程自动化的任务贯穿&#xff0c;形成闭环的工作流&#xff0c;并有计划任务机制、报警提醒机制、事件升级机制、跟踪反…

AppBaseJs 类库 网上常用的javascript函数及其他js类库写的

AppBaseJs类库。一个借鉴了网上常用的函数及其他js类库写的,方便大家的调用。代码如下:/*----------------------------------- Web Application JavaScript Library 2009.11 janchie ------------------------------------*///String原生对象扩展 置空左右端空格 String.proto…

字符串转换整数 (atoi)

题目&#xff1a; 请你来实现一个 atoi 函数&#xff0c;使其能将字符串转换成整数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时&#xff0c;则将该符号与之后面尽可…

Spring boot 忽略对mybatis的配置

SpringBootApplication(exclude{DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class}) https://blog.csdn.net/wo541075754/article/details/73379962

Git远程仓库地址变更

简单方法 使用方法三 方法有很多&#xff0c;这里简单介绍几种&#xff1a; 以下均以项目git_test为例&#xff1a; 老地址&#xff1a;http://192.168.1.12:9797/john/git_test.git 新地址&#xff1a;http://192.168.100.235:9797/john/git_test.git 远程仓库名称&#xff…

如何优化你的网站快速提高流量

网站页面优化的SEO策略 对那些会主动产生成百上千甚至成千上万页面的网站优化&#xff0c;一定要转换思维方式。传统SEO程序&#xff0c;先调查选定关键词&#xff0c;然后针对每个关键词主题产生页面&#xff0c;手动书写标题标签&#xff0c;段落标题标签 和页面简介&#xf…

c#正则表达式使用详解

正则表达式(Regular expressions)是一套语法匹配规则&#xff0c;各种语言&#xff0c;如Perl&#xff0c; .Net和Java都有其对应的共享的正则表达式类库。在.Net中&#xff0c;这个类库叫做Regex。简单的说&#xff0c;Regex是从字符窗中查找匹配字符串的应用类。通过Regex&am…

软件安装(ubuntu) --Linux基础编程

Ubuntu&#xff1a;一个以桌面应用为主的开源GNU/Linux操作系统 1、在线安装&#xff08;Ubuntu Example&#xff09; 【安装】&#xff1a;sudo apt-get install 安装包的名字&#xff0c;或者&#xff1a;sudo apt install 安装包的名字&#xff08;16.04及以上版本&#xff…

Springboot结合 framework 加载静资源 出现404 问题解决 记录

<!- 在HTML页面加入这样--><#assign ctxrequest.contextPath /> 在引入的静态资源路径上 添加以下内容

studyLink

http://order.csdn.net/myorder/detail?id850343 csdn 转载于:https://www.cnblogs.com/zhujiasheng/p/8010861.html

CCNA的一个综合实验(经典)

【背景描述】 该企业的具体环境如下&#xff1a; 1、企业具有2个办公地点&#xff0c;且相距较远&#xff0c;公司总共大约有200台主机。 2、A办公地点具有的部门较多&#xff0c;例如业务部、财务部、综合部等&#xff0c;为主要的办公场所&#xff0c;因此这部分的交换网络对…

关于EF中批量添加的个人探索

实际的测试代码和数据记录&#xff0c;还有最终的总结都在下面&#xff1a; /// <summary>/// 这种做法&#xff0c;不用了说了&#xff0c;每次遍历都会打开一次db链接&#xff0c;然后执行insert操作&#xff1b;/// </summary>static void CreateBluckInsertDat…

HDOJ 1157 HDU 1157 Who's in the Middle ACM 1157 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid1157 题目描述:Whos in the MiddleTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2451 Accep…

Keras使用多个GPU并行

model Model(inputs[v_i, v_j], outputsoutput_list) model multi_gpu_model(model,4) model.compile(....) 主要就是第二句话中的 multi_gpu_model函数&#xff0c;会把数据和模型分到多个gpu上执行有个坑&#xff0c;就是整个程序导入keras时要么全部from keras import ...…