达梦备份还原简介,全部参照官方文档。
- 数据库备份是DBA日常最重要的工作内容,备份不是目的,还原与恢复才是备份的目的。DBA不仅要保证备份成功,还要保证一旦数据库发生故障时备份可以还原恢复。
- DM数据库中的数据存储在数据库的物理数据文件中,数据文件按照段、簇、页的方式进行管理,数据页是最小的数据存储单元,任何一个对DM数据库的操作,归根结底是对某个数据文件页的读写操作。因此DM备份的本质就是从数据库文件中拷贝有效的数据页保存到备份集中,这里的有效数据页包括数据文件的描述页和被分配使用的数据页。而在备份过程中,若数据库系统还在运行,这期间的数据库操作并不是都会立即体现到数据文件中,而是首先以日志的形式写到归档日志中,因此为了保证用户可以通过备份集将数据恢复到备份结束时间点的状态,就需要将备份过程中产生的归档日志也保存到备份集中。
- 还原与恢复是备份的反过程,还原是将备份集中的有效数据页重新写入目标数据文件的过程;恢复则是指通过重做归档日志,将数据库状态恢复到备份结束时的状态,也可以恢复到指定时间点和指定LSN。恢复结束以后,数据库中可能存在处于未提交状态的活动事务,这些活动事务在恢复结束后的第一次数据库系统启动时,会由DM数据库服务器自动进行回滚。
- DM的物理备份还原不支持:TEMP表空间和HUGE表空间。即数据库备份和还原不包括HMAIN和用户创建的HUGE表空间,也不支持对HMAIN和用户创建的HUGE表空间进行表空间备份和还原。DM提供了HUGE表备份和还原系统函数,支持HUGE表的联机备份还原(可参考SQL语言使用手册)。
- 重做日志,又叫REDO日志,忠实记录了所有物理页的修改,基本信息包括操作类型、表空间号、文件号、页号、页内偏移、实际数据等。数据库中INSERT、DELETE、UPDATE等DML操作以及CREATE TABLE等DDL操作最终都会转换为对某些数据文件、某些数据页的修改。因此在系统故障重启时,通过重做REDO日志,可以将数据库恢复到故障时的状态。DM数据库默认包含两个扩展名为log的日志文件,用来保存redo日志,称为联机重做日志文件。这两个文件循环利用,任何数据页从内存缓冲区写入磁盘之前,必须保证其对应的redo日志已经写入到联机日志文件中。
- DM数据库可以在归档和非归档两种模式下运行。当数据库处于归档模式下且配置了本地归档时,redo日志先写入联机日志文件,然后再异步写入归档日志文件。建议将归档目录与数据文件保存在不同的磁盘上。
- 除了表备份还原,其它的联机备份与还原都必须运行在归档模式下。(为啥?前面说是再备份过程中数据库还在运行,这时对数据库的更改都记录在联机日志文件中,所以同时要备份归档日志,那为啥表联机备份不用?)
- DM数据库在运行过程中,用户的所有操作都在内存中进行,每修改一条记录都必须先把记录所在的数据页加载到BUFFER缓冲区中,然后进行修改。事务运行时,会把生成的redo日志保留在日志缓冲区RLOG_BUF中,每条日志记录对应一个LSN,每当事务提交或日志缓冲区满或执行检查点时会进行日志刷盘;
- 检查点(checkpoint)是一个数据库事件,它的功能是按照数据页的修改顺序,依次将BUFFER缓冲区中的脏页写入磁盘,并在这个过程中动态调整CKPT_LSN,释放日志空间。DM的检查点分为两类:完全检查点和部分检查点。完全检查点会将内存缓冲区中的所有脏页写入磁盘,并调整CKPT_LSN,在数据库正常关闭时会产生一个完全检查点;部分检查点,根据ini配置CKPT_FLUSH_RATE和CKPT_FLUSH_PAGES确定每次检查点刷脏页的数量。执行部分检查点的过程中DDL/DML操作都可以正常执行,DM系统中绝大多数情况下触发的是部分检查点。(有一个问题困扰我很久,若有一个很长时间的事务没提交,产生检查点的时候怎么办?刚刚在网上查了一下,好像检查点不关注事务状态,只是把脏页写入数据文件。)
- 几种LSN值的含义:LSN(long sequence number),是由系统自动维护的bigint类型数值,具有自动递增,全局唯一特性,每一个LSN值代表着DM系统内部产生的一个物理事务。物理事务(physical transaction,简称ptx)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(transaction)概念相对应,具有原子性、有序性、无法撤销等特性(无法撤销??一个事务应该包含很多物理事务,那这个时候这个事务回滚了,这个物理事务不撤销吗?);CUR_LSN,表示系统当前LSN,代表已经分配的最大LSN值,物理事务提交时,系统会为其分配一个唯一的LSN值(CUR_LSN+1),同时修改CUR_LSN为CUR_LSN+1(迷惑了,搞不清楚物理事务和事务的关系);FILE_LSN,表示文件LSN,是已经写入联机重做日志文件的最大LSN值,每次将RLOG_BUF写入联机重做日志文件后,都会修改FILE_LSN值;FLUSH_LSN,是已经发起日志刷盘请求,但还没有真正写入联机redo日志文件的最大LSN值;CKPT_LSN,表示检查点LSN,所有LSN≤CKPT_LSN的物理事务修改的数据页,都已经从BUFFER缓冲区写入写入磁盘,因此数据库故障重启时,CKPT_LSN之前的REDO日志不需要重做,只需要从CKPT_LSN+1开始重做REDOR日志,就可以将系统恢复到故障前状态,并且在联机重做日志文件中LSN≤CKPT_LSN的redo日志都可以被覆盖(明白了,CKPT保护的数据并不一定是已经提交的事务,引入CKPT只是为了恢复的时候更快,事务的完整性由REDO日志保证);为了确定备份范围特别定义了两个LSN:START_LSN,为了保证备份的完整性和有效性,必须包含归档日志起始LSN值,START_LSN=备份开始时CKPT_LSN+1;END_LSN,为了保证备份的完整性和有效性,必须包含归档日志结束LSN值,END_LSN=备份结束时FILE_LSN;若START_LSN等于END_LSN+1,则表明备份过程中没有任何数据被修改。
在联机日志文件中,可以覆盖写入redo日志的文件长度为可用日志空间;不能被覆盖的redo日志,系统故障重启时需要重做的redo日志为有效日志,有效日志的lsn取值范围为(CKPT_LSN,FILE_LSN]。数据库运行过程中产生的待写入日志首先写入日志缓冲区RLOG_BUF,当日志刷盘时一起写入联机日志文件中。
- 在做增量备份时,要求其START_LSN必须大于等于基备份的END_LSN,这个要求可以简化还原过程,避免还原基备份后必须先进行恢复再还原增量备份。
- 备份集用来存放备份过程中产生的备份数据及备份信息。一个备份集对应了一次完整的备份,一般情况下,一个备份集就是一个目录,备份集包含一个或多个备份片文件,以及一个备份元数据文件。
- 备份片是用来存储备份数据的文件。备份时,目标数据文件内容或归档日志内容经过处理后,都会存放到各自的备份片文件中,后缀为.bak。备份集中存放数据页的文件称为数据备份片,存放redo日志的备份片称为日志备份片(看不出来哪个是存放数据页的,哪个是存放日志文件的呀)。备份片的大小可以在备份时通过MAXPIECESIZE指定,一个备份集中可能生成多个备份片。
- 元数据文件用来存放备份信息,元数据文件的后缀为.meta,通过元数据文件,可以了解整个备份集信息。元数据文件中包含的备份信息有:备份集本身相关的信息,如是否是联机备份,备份的范围,备份的加密信息,以及备份的压缩信息等;备份源库的建库参数信息,如DSC节点数,是否大小写敏感,PAGE_CHECK属性等;数据文件信息,如备份了哪些数据文件,文件大小以及文件相关的表空间信息等;备份片的信息,如包含哪些备份片文件,备份片大小等信息;备份库的dm.ini参数信息和密钥文件(dm_service.prikey或dm_external.config,若指定usbkey加密,则不备份)
- 备份集搜索目录,用于搜索目标备份集的文件路径。备份集搜索目录包括四类:数据库的默认备份目录;WITH BACKUPDIR子句指定的目录;还原时备份集所在的上级目录;增量备份时基备份所在的上级目录。若使用第三方备份(介质为TYPE类型),则只搜索WITH BACKUP子句指定的备份集目录,具体搜索方式由第三方备份程序决定。
- 备份就是从源库(备份库)中读取有效数据页、归档日志等相关信息,经过加密、压缩等处理后写入备份片,并将相关备份信息写入备份元数据文件的过程。
- 逻辑备份是指利用dexp导出工具,将指定对象(库级、模式级、表级)的数据导出到文件的备份方式,逻辑备份针对的是数据内容,并不关心这些数据物理存储在什么位置;物理备份则直接扫描数据库文件,找出那些已经分配、使用的数据页,拷贝并保存到备份集中,物理备份过程中,不关心数据页的具体内容是什么,也不关心数据页属于哪一张表,只是简单的根据数据库文件系统的描述,来挑选有效的数据页。
- 数据库处于运行状态、并正常提供数据库服务情况下进行的备份操作称为联机备份;数据库处于关闭状态时进行的备份操作称为脱机备份。从V2.0开始,使用dmrman工具进行脱机备份,并且支持对异常关闭的数据库进行脱机库备份,备份异常关闭的数据库要求配置了本地归档,若本地归档不完整,则需要先修复本地归档,再进行备份。联机备份则使用客户端工具连接到服务器实例后,通过执行SQL语句进行,也可以通过配置作业,定时完成自动备份。联机备份不影响数据库正常提供服务,是最常用的备份手段之一。联机备份时,可能存在一些处于活动状态的事务正在进行,为确保备份数据的一致性,需要将备份期间产生的redo日志一起备份,因此只能在配置本地归档、并开启本地归档的数据库上执行联机备份。只有已经关闭的数据库才允许执行脱机备份,正在运行的数据库,无法执行脱机备份,系统会报错。
- 按照备份内容的不同,可以分为数据备份和归档日志备份。数据备份主要针对数据文件内容,包括库备份、表空间备份和表备份。库备份就是对整个数据库执行的备份,会拷贝数据库中所有数据文件的有效数据页,若是联机备份,则还会拷贝备份过程中产生的归档日志,写入到备份集中;表空间备份是针对特定表空间执行的备份,只能在联机状态下执行;表备份拷贝指定表的所有数据页到备份集中,并会记录各个数据页之间的逻辑关系用以恢复,表备份只能在联机状态下执行,一次表备份操作只能备份一张用户表,并且不支持增量备份。归档日志备份,是专门针对归档日志文件进行操作,不涉及任何数据文件内容,归档日志备份扫描归档目录收集归档日志文件,并将归档日志写入到备份集中,既可以在数据库运行状态下执行联机归档日志备份,也可以在数据库关闭状态下执行脱机归档日志备份。
- 按照备份集中的数据是否满足一致性,可以将备份划分为一致性备份和非一致性备份。一致性备份的备份集包含了完整的数据文件内容和归档日志信息,利用一个单独的备份集可以将数据库恢复到备份时状态,不指定WITHOUT LOG选项的联机备份生成的备份集就是一致性备份。脱机备份会强制将检查点之后的有效REDO日志拷贝到备份集中,因此脱机备份一定是一致性备份。数据库正常关闭时,会生成完全检查点,脱机备份生成的备份集中不包含任何redo日志;非一致性备份的备份集只包含数据文件相关内容,没有归档日志信息,利用非一致性备份还原的数据库,无法直接启动,必须借助归档日志来恢复。表空间备份、指定WITHOUT LOG选项的联机备份生成的备份集都是非一致性备份集。(之前做表空间备份还原测试的时候,先备份,然后再删除表空间里的数据,然后再用备份还原,被删掉的数据并不会恢复,因为又重做了redo日志,不禁在想那表空间备份的意义何在?)
- 按照备份数据完整性,可将备份分为完全备份和增量备份。库备份和表空间支持增量备份,表备份不支持增量备份。完全备份生成的备份集包含了指定库(或表空间)的全部有效数据页;增量备份是在某个特定备份集基础上,搜集数据库新修改的数据页进行备份(好神奇,怎么实现的?),可以有效减少备份集的空间占用、提高备份速度,这个特定的、已经存在的备份集称为增量备份的基备份,根据对基备份的要求不同,可以分为差异增量备份和累积增量备份两种。差异增量备份的基备份既可以是一个完全备份集,也可以是一个增量备份集;累积增量备份的基备份只能是完全备份集,而不能是增量备份集。利用增量备份进行还原操作时,要求其基备份必须是完整的,若差异增量备份的基备份本身也是一个增量备份,那么同样要求其基备份是完整的,任何一个增量备份,最终都是以一个完全备份作为其基备份,因此完全备份是增量备份的基础。增量备份时,并不关心其备份集是脱机备份生成的,还是联机备份生成的,脱机增量备份的基备份集可以是联机备份生成的,联机增量备份的基备份集也可以是脱机备份生成的。
- 还原是备份的逆过程,就是从备份集中读取数据页,并将数据页写入到目标数据库对应数据文件相应位置的过程。由于联机备份时,系统可能存在一些处于活动状态的事务正在执行,并不能保证备份集中的所有数据页是处于一致性状态;而脱机备份时,数据页不一定是正常关闭的,也不能保证备份集中所有数据页是处于一致性状态,因此还原结束后,目标库可能处于非一致性状态,不能马上提供数据库服务,必须要进行数据库恢复操作后才能正常启动。
- 逻辑还原是逻辑备份的逆过程,就是使用dimp工具,把dexp导出的备份数据重新导入到目标数据库;物理还原是物理备份的逆过程,物理还原一般通过dmrman工具(或sql语句)把备份集中的数据内容(数据文件、数据页、归档文件)重新拷贝、写入目标文件。
- 联机还原指数据库处于运行状态时,通过SQL语句执行还原操作,表空间还原和表还原可以在联机状态下执行,并且表空间还原要求目标表空间不是ONLINE状态;脱机还原指数据库处于关闭状态时执行的还原操作,脱机还原通过dmrman工具进行,库备份、表空间备份和归档备份可以执行脱机还原。
- 还原还可分为数据还原和归档日志还原。根据备份集类型,数据还原可以分为库还原、表空间还原和表还原,库还原的目标库必须处于关闭状态,表空间还原可以联机也可以脱机,表还原只能联机。表空间还原的数据来源可以是表空间备份集,也可以是库备份集,还原的目标表空间不能是TEMP表空间,只能是MAIN、SYSTEM、ROLL表空间,或用户自定义的表空间。表还原从表备份集读取数据,重新恢复目标表数据,还会在目标表上重建索引、约束;归档日志还原将归档日志备份集中的日志内容,重新生成到指定目录中。
- 完全还原是指直接利用完全备份集进行数据还原操作;增量还原是指通过增量备份集进行数据还原操作,但是考虑到增量备份的基础一定是一个完全备份集,因此增量还原过程中隐含了一个完全还原操作,若增量备份集被删除了,那么单独使用这个增量备份集是无法进行还原操作的。
- DM通过介质管理层MML,将备份、还原和恢复过程中备份片文件和元数据文件的读取写入动作进行抽象、隔离,备份还原过程中MML层会调用一组SBT接口来访问备份存储介质。SBT接口是DM定义的一组API函数,允许第三方厂商定制、管理备份存储介质;DM系统自带的备份还原功能也遵循了SBT规范。若备份还原时指定DEVICE TYPE为TAPE,且使用第三方提供的dmsbtex.dll(linux上是.so)来完成备份文件的存取功能。DEVICE TYPE指定TAPE时还提供了PARMS关键字,用于传递第三方可识别的自定义字符串。使用第三方动态库时,用户层应用不受影响,默认DEVICE TYPE为DISK,使用DM自带的SBT磁盘存储。
- DM备份与还原先后发布了两个版本:V1.0和V2.0。因为不同版本的策略不同,所有备份文件在各版本之间不能混用。V1.0不是基于备份集组织的备份,使用dmbackup工具执行脱机备份,使用dmrestore工具执行脱机还原;V2.0引入备份片、原数据文件、备份集等概念,提供第三方备份(TAPE类型)接口,支持DSC备份,使用dmrman工具进行脱机备份还原。V2.0的备份还原实现策略有两种:dmap辅助进程和无辅助进程方式,可通过ini参数BAK_USE_AP来选择(dmrman使用参数use_ap),BAK_USE_AP默认取值为1,表示使用dmap辅助进程方式,可支持第三方备份(指定DEVICE TYPE为TAPE),DMAP插件执行改造了备份还原任务子系统,允许指定并行度,大幅提升了备份还原的效率,特别是加密、压缩的处理效率,若选择使用DMAP辅助进程,执行备份还原之前就必须启动DMAP服务;取值为2表示无辅助进程方式,不依赖DMAP,由主进程dmserver自身执行备份还原,但不支持第三方备份(指定DEVICE TYPE为TAPE)。
- DMSERVER和DMRMAN使用DMAP都是通过管道通讯实现,其中DMRMAN产生的管道命名规则为DM_PIPE_DMRMAN-PID_SEQ,其中PID为DMRMAN实例进程ID,SEQ为同一实例上管道的序号,从1开始。在WIN环境下,垃圾管道文件会被自动清理掉;在非WIN环境下,若系统没有正常退出,就会遗留垃圾文件,需要用户手动删除,删除垃圾管道文件时,需要根据PID值来判断,文件名中的PID不是当前正在运行的DMRMAN的进程ID即为垃圾文件,都可以删除。(在linux里,一般有垃圾管道文件的时候,再启动dmap就不会成功,报错管道文件已存在,需要先删除再重启。)
- 用户可以通过设置INI参数BAK_POLICY来选择备份策略,可取值有0、1、2。默认为0,表示同时支持V1.0和V2.0版本,这里的同时支持表示用户如果使用V1.0的语法或者工具,则DM服务器按照V1.0的策略执行,若用户使用V2.0的语法或者工具,则DM服务器按照V2.0执行,但是V1.0与V2.0不能混用,若使用V1.0生成的备份,不能使用V2.0进行还原,也不能在V1.0的基备份上使用V2.0进行增量备份,反之亦然;取值1表示只支持V1.0版本;取值2表示只支持V2.0版本。
- 备份与恢复过程都依赖归档日志。
- REDO日志本地归档就是将REDO日志写入到本地归档日志文件的过程,配置本地归档情况下,redo日志刷盘线程将redo日志写入到联机redo日志文件后,对应的RLOG_BUF由专门的归档线程写入本地归档日志文件中。本地归档日志文件不能被覆盖,写入其中的redo日志信息会一直保留,直到用户主动删除。若配置了归档日志空间上限,系统会自动删除最早生成的归档redo日志文件,腾出空间。DM提供了按照指定的时间或指定的LSN删除归档日志的系统函数:SF_ARCHIVELOG_DELETE_BEFORE_TIME和SP_ARCHIVELOG_DELETE_BEFORE_LSN。本地归档文件在配置的归档目录下生成并保存,若磁盘空间不足,且没有配置归档上限(或配置的上限超过实际空间),系统将自动挂起,直到用户主动释放出足够的空间后继续运行。当磁盘损坏导致归档日志写入失败时,系统会强制HALT。
- 远程归档就是将写入本地归档的redo日志信息发送到远程节点,并写入远程节点指定的归档目录中。DMDSC集群中各个节点在配置本地归档之外,再互相配置一个远程归档,就可以在任意一个节点的本地磁盘中,找到DMDSC集群所有节点产生的、完整的归档日志文件。远程归档的触发时机是在REDO日志写入本地归档文件的同时,将REDO日志通过MAL系统发送给指定的数据库实例。远程归档与本地归档的主要区别是REDO日志写入的位置不同。另一个区别是归档失败的处理策略不同,本地归档写入失败(如磁盘空间不足),系统将会挂起,而远程归档失败则会直接将远程归档失效,不再发送REDO日志到指定数据库实例,当节点间网络恢复或者远程节点成功重启后,系统会自动检测并恢复远程归档,但不会主动补齐故障期间的redo日志,因此在出现节点故障的情况下,远程归档的内容可能是不完整的,而本地归档的内容肯定是完整的,若备份还原恰好需要用到这部分丢失的远程归档日志,可以从源端的本地归档拷贝、补齐这部分内容。(直接拷贝过来就可以用吗?)远程归档必须双向配置,单向配置时目标实例上不会接收归档日志,归档状态将变为无效。
- 由于本地归档和远程归档是异步写入归档日志文件的,REDO日志在写入联机日志文件后,再由专门的归档线程负责将这些REDO日志写入本地归档日志文件,通过归档切换(看后面说的感觉不像是切换归档,而像是切换联机日志文件,切换联机日志文件的时候,会将当前在用的联机日志文件的内容写入到归档日志文件中)功能,将这些已经写入联机日志文件,但还没有写入归档日志文件的REDO日志,写入到归档日志文件中,命令如下:ALTER DATABASE ARCHIVELOG CURRENT;或ALTER SYSTEM ARCHIVE LOG CURRENT;或ALTER SYSTEM SWITCH LOGFILE;
- DM数据库服务器正常退出时,会将所有的REDO日志写入本地归档日志文件中,但是数据库服务异常关闭时,可能存在部分REDO日志未写入本地归档日志文件中。归档修复会扫描联机日志文件,将那些已经写入联机日志文件、但还没有写入到归档日志文件中的REDO日志重新写入归档日志文件。若数据库异常关闭,并且没有进行归档修复,则归档日志文件中的内容比实际可恢复的数据少一部分,将无法利用归档日志文件将数据恢复到最新状态,利用归档修复功能,将归档日志文件重新补齐后,利用本地归档日志恢复时,就可以将数据库恢复到故障时刻的最新状态。归档修复的流程包括:收集本地归档日志文件;截断最后一个本地归档日志文件,并创建一个新的归档日志文件;扫描联机日志文件,将CKPT_LSN之后的REDO日志拷贝、写入到新创建的归档日志文件中。(不给具体的操作步骤??)
- 任何一个对DM数据库的操作,归根结底都是对某个数据文件页的读写操作,物理备份就是对这些数据文件中有效的数据页备份起来,在出现故障时,用于恢复数据(假如数据页中有坏块,备份出来的文件也有坏块)。DM的物理备份一般包括数据备份和日志备份两部分,数据备份是拷贝数据页内容,日志备份则是拷贝备份过程中产生的REDO日志。
- DM的联机库备份和表空间备份要求必须配置并开启本地归档。
- 数据备份过程中,根据DM数据文件系统的描述信息,准确判断每一个数据页是否被分配、使用,将未使用的数据页剔除,仅保留有效数据页进行备份,这个过程称为智能抽取。与直接文件拷贝的方式相比,DM物理备份丢弃了那些没有使用的数据页,因此可以节省对存储空间的要求,并有效减少IO,提升备份还原的效率。对处于RES_OFFLINE和CORRUPT状态的表空间,则只记录表空间相关信息和状态,不会真正拷贝数据页。数据备份过程中,会对数据进行简单校验,若校验失败则会将相关信息写入到日志文件dm_BAKRES_xxx.log中,但不会终止当前备份操作。
- 使用dminit建库时,通过设置参数page_check指定页校验模式(建库后不能修改),当指定值不为0时,在执行备份过程中会对数据页执行校验操作,校验结果会记录在备份集中,并在备份结束后给出警告信息,警告码为609,告知用户此备份集中存在被破坏的数据页。该警告只是提示作用,并不影响备份集的有效性,在还原库上,备份集中备份的被破坏数据页在经过还原和恢复操作后,可以正常使用。(??可以正常使用吗?是怎么修复的?物理备份不是只是单纯的拷贝数据页吗?)
- 执行完全备份,备份程序会扫描数据文件,拷贝所有被分配、使用的数据页,写入到备份片文件中。库备份会扫描整个数据库的所有数据文件(除TEMP表空间外),表空间备份则只扫描表空间内的数据文件;执行增量备份,备份程序会扫描数据文件,拷贝所有基备份结束以后被修改的数据页,写入到备份片文件中。
- 表空间备份支持完全备份和增量备份,但只能在联机状态下执行,不支持temp表空间的备份还原。
- 表备份主要包括数据备份和元信息备份两部分,与库备份和表空间备份不同,表备份不是直接扫描数据文件,而是从BUFFER中加载数据页,拷贝到备份片文件中,表备份的元信息则包括建表语句、重建约束语句、重建索引语句,以及其它相关属性信息。表备份不需要配置归档就可以执行,并且不支持增量表备份。(BACKUP TABLE TAB_NAME BACKUPSET ‘XX’; 若进行表备份时,该表上有事务未提交,会报错锁超时。还原语法:RESTORE TABLE TAB_NAME FROM BACKUPSET ‘XX’;)
- 所谓日志备份就是将备份过程中产生的REDO日志拷贝到备份片文件中,用来在数据库还原结束后,将数据库恢复到一致性状态。在执行备份过程中,用户可能修改数据库中的数据,并产生对应的redo日志,增量备份和完全备份的日志备份流程完全相同。在备份开始时,记录一个START_LSN,在备份结束后记录一个END_LSN,那么[START_LSN,END_LSN]之间的REDO日志,就对应备份过程中用户对数据的修改,其中START_LSN=CKPT_LSN+1,作为日志备份的起点,END_LSN=数据备份结束时的FILE_LSN,作为日志备份的终点。联机库备份默认开启日志备份,将备份过程中产生的REDO日志单独写入备份片作为备份集的一部分,也可以通过WITHOUT LOG子句取消这部分REDO日志的拷贝,这种情况下生成的备份集本身是不完整的,数据库还原后,还要依赖备份库的本地归档日志来进行恢复操作后,才能将数据恢复到一致性状态,否则还原后的数据库将无法正常启动。
- 还原后目标库的REDO日志的数量,由目标库本身redo日志的数量决定,跟源库中redo日志的数量无关。
- DM支持对备份数据进行压缩和加密处理,用户在执行备份时,可以指定不同的压缩级别,以获得不同的数据压缩比。默认情况下,备份是不进行压缩和加密处理的。DM共支持9个级别(1~9)的压缩处理,级别越高压缩比越高,但相应的压缩速度越慢、CPU开销越大。备份加密包括加密密码、加密类型和加密算法三个要素,加密密码通过使用IDENTIFIED BY <加密密码>来指定,使用备份集的时候必须输入对应密码;加密类型分为不加密、简单加密和完全加密,简单加密仅仅对部分数据进行加密,加密速度快。完全加密对所有数据执行加密,安全系数高。加密类型和算法,用户均可手动指定,若用户指定了加密密码,但没有指定加密类型和算法,则使用默认加密算法进行简单加密,用户也可以指定加密密码,但将加密类型指定为不加密。若同时指定加密和压缩,则备份过程中,会先进行压缩处理,再进行加密处理,备份的所有数据页和REDO日志都会进行压缩、加密处理。若基备份指定了加密算法,那么增量备份的加密算法和密码必须与基备份保持一致;若基备份没有进行加密,那么增量备份可以使用任意的加密算法和密码。
- 库备份、表空间备份和归档日志备份可以进行并行处理,用户通过关键字PARALLEL指定是否进行并行备份,以及并行备份的并行数。并行备份以数据文件为单位,也就是说一个数据文件仅可能出现在一个并行分支中,若指定了PARALLEL关键字,但不指定并行数,那么默认的并行数为4,但实际的备份并行度由DMAP最终创建成功的并行子任务数决定,增量备份是否并行以及并行数与其基备份集无关。目前的数据库并行备份还原都是以文件为单位,适用于待备份文件大小比较均匀的情况,若文件大小差别比较大,特别存在个别文件巨大时,并行备份还原基本没有优势,因此在进行数据库备份时,需要指定READ SIZE <拆分块大小>,将巨大的数据文件先进行拆分之后再进行备份。执行并行备份会生成一个主备份集和若干个子备份集,子备份集不能单独还原,也不能作为其它备份集的基备份,备份过程中产生的REDO日志保存在主备份集中,子备份集仅包含数据文件相关内容。
- 还原的主要动作是将数据页从备份集中拷贝回数据库文件相应位置,恢复则是重做REDO日志,将数据库恢复到一致性状态。
- 库还原就是根据备份集中记录的文件信息重新创建数据库文件,并将数据页重新拷贝到目标数据库的过程,DM既可以将一个已存在的数据库作为还原目标库,也可以指定一个路径作为还原目标库的目录。库还原的主要步骤包括:清理目标库环境;重建数据库文件;拷贝数据页、重建联机日志文件、修改配置参数等。
- 清理目标库环境:若指定已存在的数据库作为还原目标库,还原操作首先解析dm.ini配置文件,获取dm.ctl控制文件路径,删除控制文件中的数据文件,然后根据overwrite选项,若指定overwrite选项,且待还原文件存在,则删除;若未指定overwrite选项,若待还原文件存在,则报错,但保留目标库的日志文件、控制文件等(默认有没有overwrite选项呢?我平时没有写overwirte子句,待还原文件也存在,但是也没有报错呀);若指定还原到一个目录,则根据overwrite参数选择策略,检查目标目录内的dm.ini文件、dm.ctl文件,默认的日志为DBNAME01.log和DBNAME02.log(其中DBNAME为数据库名称),待还原的数据文件等,若用户指定overwrite并且存在相关文件情况下,还原过程中会自动删除这些已经存在的文件,若没有指定overwrite,并存在相关文件,则会报错。
- 重建数据库文件:若将一个已存在数据库作为还原目标,则需要将目标数据库的dm.ini路径作为还原参数,还原过程中,会重新创建数据文件,并将相关信息写入dm.ctl控制文件中;若将数据库还原到指定目录,则会在这个目录中创建一个dm.ini配置文件,设置ctl_path、system_path配置项指向这个目录,并在这个目录下创建dm.ctl控制文件。DMDSC不支持指定目录还原数据库。数据文件重建策略如下:
- 目标库和备份集中的SYSTEM_PATH路径相同,则按照备份集中记录的原始路径创建文件;
- 目标库和备份集中的SYSTEM_PATH路径不相同,默认在SYSTEM_PATH目录创建文件;
- 若已存在同名文件导致文件创建失败,会重命名后在SYSTEM_PATH目录创建,文件重命名规则是:DB_NAME+序号.DBF,若重命名后仍然冲突,会一直重试;
- 使用mapped file指定源文件与目标文件的映射关系,定制数据库文件的物理分布情况,可以很好的满足用户关于数据文件分布的需求;
- 重建联机日志文件:指定目录还原,系统目录使用指定还原目录,所有库配置文件均认为在指定还原目录下,联机日志文件命名规则,单机环境为db_name+文件编号.log,其中db_name取自备份集备份库的名称;
- 拷贝数据页:从备份集中读取数据页,并将数据页写入数据文件指定位置。由于备份过程中,只将有效的数据页写入备份集中,因此还原过程也只涉及这些被分配使用的数据页;
- 重置目标库:具体包括更新日志信息(设置当前CKPT_LSN为备份集中START_LSN-1,并设置日志文件状态为INACTIVE)、更新DB_MAGIC(还原后,库中PERMANENT_MAGIC仍与备份集中相同)、设置还原标志(标识当前库为指定库要还原的库,不允许使用)、更新目标库的控制文件dm.ctl(把当前库中的数据文件信息都记录到控制文件中,使用备份集中的服务器密钥文件,重新生成新的密钥文件)。服务器密钥文件(dm_service.prikey或dm_external.config)仅在备份集中备份库非usbkey加密的情况下重建,并使用备份集中备份的密钥内容进行还原。
- 修改配置参数:还原到指定库时,默认会保留目标库的配置参数不变,也可以在还原时指定REUSE DMINI子句,使用备份集中的配置参数替换目标库中dm.ini中的配置参数;还原到指定目录时,会重新建立一个dm.ini配置文件,并用备份集中的参数值来设置这些配置项。需要注意的是,一般与路径相关的参数,比如SYSTEM_PATH等不会被替换;
- 需要注意的有:指定的dm.ini必须存在且各项配置信息有效,其中CTL_PATH必须配置且路径必须有效;若指定目录还原,则指定目录作为数据库系统目录处理;由于还原是要确保数据库数据的完整性,因此对于增量备份的还原,需要搜集完整的备份集链表,然后从前到后,逐个还原备份集中的数据,鉴于增量备份START_LSN的确定规则,增量备份还原的过程中,不需要重做任何归档日志。
- 由于表空间的数据库对象等字典信息保存在数据库的SYSTEM表空间中,所以表空间备份恢复只能在备份源库上联机执行,且要求在源库正常启动状态下执行表空间还原操作。同时由于需要重建表空间文件、并拷贝数据页,还原过程中用户不能访问目标表空间,因此ONLINE状态的表空间不能执行还原操作,必须先将目标表空间OFFLINE后,才能执行表空间还原操作。处于RES_OFFLINE或CORRUPT状态的表空间,也可以执行表空间还原操作。开始还原表空间时,会修改表空间为RES_OFFLINE状态,并在还原结束后重新设置为OFFLINE状态,处于RES_OFFLINE状态的表空间,在还原结束前不允许重新ONLINE。在部分数据文件损坏或部分物理磁盘损坏的情况下,可以指定还原数据文件,跳过那些正常的数据文件,以提升还原速度。表空间还原也可以使用mapped file进行数据文件映射,若不指定mapped file,则默认当前系统目录与备份集中一致,实际创建过程中,若发现已经存在或创建失败后,处理方式与数据库还原中数据重建策略处理一致。
- 表空间状态包括:ONLINE(联机状态)、OFFLINE(脱机状态)、RES_OFFLINE(还原状态)、CORRUPT(损坏状态)。V$TABLESPACE表的STATUS$列表示表空间状态,取值0/1/2/3分别表示ONLINE/OFFLINE/RES_OFFLINE/CORRUPT。表空间发生故障,比如还原失败(处于RES_OFFLINE状态)、表空间文件损坏或缺失(处于OFFLINE状态),这两种故障情况下如想直接删除表空间,不考虑还原恢复的方式,则可以手动将表空间切换到CORRUPT状态,再执行删除操作,否则无法删除。已经切换到CORRUPT状态后,仍然允许再次执行还原恢复。
- 表还原是表备份的逆过程,表还原从表备份集中读取数据替换目标表,将目标表还原成备份时刻的状态。表还原主要包括三部分内容:表结构还原、数据还原、以及重建索引和约束。若还原目标表不存在,则利用备份集中记录的建表语句重建目标表;若还原目标表已经存在,则清除表中的数据、删除二级索引和约束;若备份表存在附加列(通过ALTER TABLE语句快速增加的列),那么还原目标表必须存在,并且目标表所有列的物理存储格式与备份源表完全一致。数据还原过程从表备份集拷贝数据页,重构数据页之间的逻辑关系,并重新形成一个完整的表对象。在数据还原结束后,使用备份集中记录的信息,重新在表上创建二级索引,并建立各种约束。表还原只支持在联机状态下执行,表还原过程中也不需要重做REDO日志,并且表备份集允许跨库还原,但要求还原目标库与源库的数据页大小等建库参数相同,需要匹配的参数有:PAGE_SIZE/BLANK_PAD_MODE/CASE_SENSITIVE/CHARSET/USE_NEW_HASH/LENGTH_IN_CHAR。可以使用dmrman的show功能查看备份的数据页大小等建库参数。
- 数据恢复是指在还原执行结束后,重做REDO日志,将数据库恢复到一致性状态,并执行更新DB_MAGIC的过程。其中重做REDO日志可以多次执行,直到恢复到目标状态。还原结束后,必须经过恢复操作,数据库才允许启动。即使备份过程中没有修改任何数据,备份集不包含任何REDO日志,在数据库还原结束后,也必须使用DMRMAN工具执行数据恢复操作后,才允许启动数据库。未经过还原的数据库,也允许执行数据恢复。
- 数据恢复重做的REDO日志,既可以是那些在备份过程中产生的、包含在备份集中的REDO日志,也可以是备份数据库本地归档日志文件。在本地归档日志完整的情况下,数据还原结束后,可以利用本地归档日志,将数据库恢复到备份结束后任意时间点状态。不管采用哪种数据恢复方法,REDO日志的范围至少要覆盖备份过程中产生的REDO日志,也就是说必须完整包括备份集中记录的[START_LSN,END_LSN]之间的REDO日志,若归档日志缺失将会导致数据库恢复失败。只有库备份和表空间备份还原后,需要执行数据恢复,表还原结束后,不需要执行数据恢复。
- PERMANENT_MAGIC和DB_MAGIC是用来标识数据库的INTEGER类型值,DM在初始化数据库时生成PERMANENT_MAGIC和DB_MAGIC值,其中PERMANENT_MAGIC一经生成永远不会改变,称为数据库永久魔数;DB_MAGIC称为数据库魔数,同样可以用来标识某一个数据库,但是DB_MAGIC是可以变化的,每经过一次还原恢复操作后,DB_MAGIC就会产生变化,用来区分备份源库和还原目标库。可通过如下命令查询:SELECT PERMANENT_MAGIC; SELECT DB_MAGIC FROM V$RLOG;
- 指定备份集恢复:默认未指定WITHOUT LOG子句的联机库备份生成的备份集,包含了备份过程中产生的REDO日志,数据还原结束后,可以直接指定备份集,将数据库恢复到备份结束时的状态。由于执行增量备份时,要求≤基备份END_LSN的所有数据页已经写入磁盘,因此基备份集中包含的REDO日志不需要重做,只需要重做指定还原操作的备份集中包含的REDO日志,就可以将数据库恢复到一致性状态。
- 指定备份集恢复的简要过程包括:从备份集读取REDO日志,并生成一个临时的本地归档日志文件;利用生成的临时归档日志文件,重做REDO日志,并将数据修改写入磁盘;删除临时生成的归档日志文件;更新数据库日志信息,设置CKPT_LSN为最后一个重做的REDO日志的LSN值;修改数据库状态为ACTIVE,标记数据库启动时需要进行相应的回滚活动事务、PURGE已提交事务。
- 指定归档恢复:若备份时指定了WITHOUT LOG子句,那么产生的备份集不包含备份过程中产生的REDO日志,这种备份集还原后就必须利用本地归档日志,将数据库恢复到一致性状态。执行恢复前,会检查本地归档日志文件的完整性,要求必须包括[START_LSN,END_LSN]之间完整的REDO日志。利用本地归档日志进行恢复时,dmrman工具会扫描指定的归档日志目录,收集与恢复数据库PERMANENT_MAGIC值相等的归档日志文件,与指定备份集恢复相比,利用本地归档日志恢复不需要生成、删除临时归档日志文件,其余的执行流程完全相同。指定归档恢复的执行场景主要包括:将还原后处于非一致性状态的数据库恢复到一致性状态;将已经处于一致性状态的数据库尽可能恢复到最新状态;将数据库恢复到指定时间点状态;将数据库恢复到指定LSN产生时的状态。DM中的归档日志包含时间信息,重做归档日志过程中,一旦发现达到了指定时间点,就马上终止归档日志重做;除了指定时间点,还可以通过指定LSN进行恢复,DM中每条REDO日志记录都对应一个唯一的LSN值,指定LSN值以后,数据库将会精准的恢复到产生这个LSN时间点的状态。
- 使用DDL CLONE方式备份的数据库,不支持指定归档恢复(什么是DDL CLONE)。
- 若备份集满足START_LSN等于END_LSN+1,即在备份过程中未产生REDO日志,则使用此备份集还原后只需要更新DB_MAGIC即可完成恢复。更新DB_MAGIC不重做REDO日志,仅仅更新库的DB_MAGIC值和数据库状态。只能在还原后的数据库上执行更新DB_MAGIC的操作。
- 表空间恢复:考虑到用户表空间上的数据库对象定义是保存在SYSTEM表空间的系统表内,而用户表空间仅保存这些数据库对象的数据,为了避免出现数据库对象的数据与定义不一致的情况,一般要求在还原表空间后,重做指定表空间所有REDO日志将这个表空间数据恢复到最新状态。若用户确定数据库对象定义没有发生变化,那么表空间也允许恢复到指定的时间点或指定LSN,否则可能导致数据与定义不一致,致使后续访问发生异常。
- 与库恢复一样,表空间恢复的REDO日志既可以是来源于一个库备份集,也可以从本地归档日志文件中提取,表空间备份默认不会拷贝REDO日志到备份集中,因此从表空间备份集还原后,需要从本地归档日志文件获取相关的REDO日志。表空间恢复同样要求满足归档日志覆盖[START_LSN,END_LSN]的要求。
- 需要注意的是,表空间恢复结束,并执行ONLINE操作后,用户就可以访问这个表空间,但ONLINE操作并不会触发事务回滚,所以重做REDO日志产生的未COMMIT事务,也不会被回滚掉(那这个事务当前是处于什么状态呢?结束了还是没结束呢?)。
- 未还原库恢复:未还原库是指没有经过数据还原的库,比如过去工作数据库的一份拷贝,这份拷贝库就称为未还原库。这类库要恢复到最新状态,需要先将数据库调整未还原状态,然后再执行数据恢复操作(怎么调整为未还原状态??)。
- DMDSC库恢复:DMDSC库与普通单节点数据库的区别在于DMDSC库的多个节点共同维护一份库数据,每个节点上都有独立的联机日志和本地归档日志。重做REDO日志恢复时,需要重做所有节点上的REDO日志,因此需要提供各个节点的归档日志(是将不同节点的归档日志全放在同一个目录下一起恢复还是分别恢复?分别恢复的话怎么保证先后关系呢?)。DMDSC库恢复也支持未还原库恢复。
- 解密和解压缩是备份过程中加密和压缩的逆操作,若备份时未指定加密或压缩,还原和恢复过程中也不需要执行解密或解压缩操作。若备份时进行了加密,那么还原时用户必须指定与备份时一致的加密密码和加密算法,否则还原会报错。DM还原时的解密过程主要包括:检查用户输入的密码和算法是否与备份集中记录的加密信息一致;从备份集读取数据后,在写到目标文件(包括目标数据文件和临时归档文件)之前执行解压缩操作。与解密不同,解压缩不需要用户干预,若备份集指定了压缩,从备份集读取数据写到目标文件之前,会自动进行解压缩操作。若备份时既指定了加密又指定了压缩,那么与备份过程处理相反,还原时会先进行解密,再进行解压缩,然后将处理后的数据写入到目标文件中。
- 指定并行备份生成的备份集,在还原时默认采用并行方式还原,并行度上限为备份时指定的并行数,实际并行度由DMAP最终创建成功的并行子任务数决定。并行备份产生的备份集在还原时可以通过指定NOT PARALLEL子句关闭并行还原功能,以非并行方式还原。目前非并行方式备份生成的备份集,不支持以并行方式还原。
- 除了通常意义上的数据备份、还原之外,DM还支持对本地归档日志文件进行备份和还原。归档日志备份是数据库备份的一个有效补充,归档日志文件中保存了所有数据库操作产生的REDO日志,因此在理论上,只要有一个基准备份集,加上完整的归档日志,可以将数据库恢复到任意时间点的状态。
- 与联机备份收集备份过程中产生的REDO日志写入备份集不同,归档日志备份专门用来备份本地归档日志文件,将符合条件的本地归档日志文件拷贝到备份集中保存起来。归档日志备份仅备份指定数据库生成的本地归档日志文件,要求归档日志文件的DB_MAGIC与数据库的DB_MAGIC保持一致,若本地归档目录中包含多个不同数据库的归档日志文件,也只会备份一个特定的数据库的归档日志。由于经过还原后数据库的DB_MAGIC会产生变化,因此即便PERMANENT_MAGIC相同,DB_MAGIC不同的数据库产生的归档日志也不会备份。
- 与普通的数据库备份一样,归档日志备份也支持加密与压缩功能,可以联机执行归档日志备份,也可以在数据库关闭的情况下使用dmrman工具进行脱机备份。归档日志备份时,可以指定是否删除已经备份的归档日志文件,在生成归档日志备份集的同时,删除本地归档日志文件,释放磁盘空间。由于本地归档的异步实现机制,为了确保归档日志备份的完整性,一般会在归档日志备份之前执行一个归档切换动作。
- 归档日志还原就是将备份集中的归档日志文件重新拷贝到指定归档目录中。使用归档日志备份集,既可以将归档日志文件还原到指定数据库(还原时指定目标库的dm.ini)的归档目录,也可以还原到用户指定的任意归档目录中。归档日志还原的过程包括:
- 根据过滤条件,从归档日志备份集中收集需要还原的归档日志文件;
- 在指定的归档目录创建归档文件,若目标归档文件已经存在,默认采用认为该归档完好,生成一条日志记录,不再还原策略,也可以使用OVERWRITE指定策略:取值1表示认为归档文件完好,不再还原该归档文件,添加一条日志记录;取值2表示存在同名归档立即报错返回,终止还原;取值3表示强制删除归档,重新还原同名归档。
- 从备份集拷贝REDO日志,写入目标归档日志文件;
- 若备份时指定了加密或压缩,还原过程中会先经过解密和解压缩处理,再写回到目标归档日志文件中。