Oracle手工管理的备份恢复
1备份恢复的概念
Oracle数据库提供了完备的数据库备份恢复方法以及工具。手工管理的备份恢复需要DBA参与备份恢复的全过程,并且针对不同的备份策略、不同的数据库故障原因执行不同恢复过程。在备份过程中需要DBA启动不同程度的备份模式、使用操作系统工具备份数据库文件、关闭备份模式。在恢复阶段需要根据当时的故障造成的数据库状态执行相应的策略。
数据库备份是DBA一项十分重要的任务,使用备份的数据库文件可以在数据库出现人为或设备故障时迅速的恢复数据,保证数据库系统对外提供持续、一致的数据库服务。备份是数据库的一个副本,具体内容包含控制文件、数据文件等,也可以是逻辑备份,通过备份DBA还原数据可以有效防止不可预测的数据丢失或应用程序错误造成的数据丢失。
物理备份:
物理备份是将数据库文件如数据文件、控制文件以及重做日志文件复制到指定目录作为数据文件备份的方式,采用物理备份时无论数据库文件中是否有数据,会复制整个数据文件,显然物理备份会增加备份的存储空间,需要DBA事先查看数据库文件的大小,使用合理的存储空间,物理备份方式有两种:
· 使用操作系统工具如CP或DD进行备份和管理数据文件。
· 使用Oracle使用工具RMAN来恢复和管理数据文件,使用RMAN时既可以使用命令行模式,也可以使用GC或BM图形化工具实现。

逻辑备份
逻辑备份是指使用Oracle提供的数据迁移工具如EXPDP、EXP等,导出数据库对象的逻辑结构以及数据。此时会先导出数据库对象的结构,如表的定义或者所标的结构、索引的定义等,然后导出相应的数据库对象中的数据,逻辑备份是DBA可以采用的备份方式之一,但是使用逻辑备份时,如果是恢复整个数据库往往需要很长的时间,如果此时使用物理备份相对快得多,因为物理备份主要是复制数据文件的过程,逻辑备份的恢复需要Oracle数据库创建所有的数据库对象,并插入相应的数据。逻辑备份不能代替物理备份。

冷备份与热备份
冷与热是对数据库运行状态十分形象的表示,冷备份是指在数据库关闭的情况下备份,如果数据库是正常关闭的如shutdown immediate,此时冷备份是一致的数据库备份。热备份是指在数据库打开的状态下备份,此时用户可以继续访问数据库,执行DML操作。但是要求此时的数据库必须运行在归档模式下,归档模式下可以对整个数据库、单独的表以及数据文件进行备份。如果数据库运行在非归档模式,则会提示错误。

数据库恢复
1、实例恢复
实例是Oracle非常重要的概念,实例包括内存结构和后台进程。实例故障恢复是指实例突然失败造成的数据库故障,如使用shutdown abort关闭数据库,此时再启动数据库就会实施实例恢复。实例恢复使用当前的数据文件以及当前的重做日志文件实现数据恢复。实例恢复由Oracle数据库自动完成,不需要用户的干涉。
实例恢复由两个步骤完成:一个是前滚,一个是回滚。
· 前滚:将重做日志文件中记录的用户提交和未提交的事务涉及的数据写入联机数据文件。
· 回滚:将未提交的事务涉及的修改通过UNDO中的记录退回去,即如果原先未提交事务设计了DELETE操作,回滚就是使用UNDO记录将删除的数据INSERT操作写回当前的数据文件,以保证事务的原子性。
2、介质恢复
介质恢复是由于磁盘损坏或者数据文件损坏而需要的数据库恢复方式。介质恢复不是Oracle数据库自动完成的,需要用户干预来启动整个介质恢复过程。介质恢复必须具有备份的数据库文件,如果需要完全恢复还需要自备份以来的归档日志文件,当前的日志文件。
介质恢复需要两个步骤:复原和恢复。
复原:将备份的数据文件复制到相应的目录,如果不是该文件以前的目录则需要使用alter database rename datafile指令来告诉数据库新的数据文件的位置。
恢复:使用归档重做日志文件以及当前的日志文件恢复数据库到最新的状态,恢复包含两个步骤:前滚和回滚。其中前滚将利用重做日志(包括归档日志和当前日志)来应用提交和未提交的事务。这个过程显然包含了一些不一致的数据,即未提交的数据,对应的事务需要回滚,回滚是恢复的第二个步骤,通过UNDO记录中的原始数据来恢复未提交事务更改的数据,保证事务的原子性。
3、完全恢复和不完全恢复
完全恢复是指当数据库发生故障后,通过备份将数据库恢复到最新的状态,不丢失任何数据。如果数据库有数据文件的备份,并且有备份以来全部的归档日志文件和当前的日志文件,就不会丢失数据,可以不同粒度实现完全恢复,如数据库级、表空间级和数据文件级。

2非归档模式下的冷备与恢复
冷备是关闭数据库后的数据库备份,此时的备份一定是一致的数据库备份。因为数据库安全关闭。冷备是最简单也是最可靠的备份方法。简单是因为只需要复制需要的数据库文件,这些文件包括数据文件、控制文件以及重做日志文件。可靠是因为在数据库安全关闭的条件下备份数据库文件,此时是一致的数据库备份。
冷备的缺点同样很明显,冷备需要备份所有数据文件,如果超大型数据库则需要较大的存储介质,如果数据变化很小,则为了备份这些变化的数据同样需要备份整个数据库,显然这样的备份效率不高。
冷备的步骤:
冷备最明显的特点就是安全关闭数据库,然后通过操作系统执行复制数据库文件。以下介绍步骤:
实验ing
Step1:查看数据库文件的存储目录,如控制文件、数据文件和重做日志文件。此时需要使用数据字典dba_data_files,v$controlfile,v$logfile,明确需要备份的数据库文件。

查看控制文件:

查看重做日志文件

注意:在生产数据库中,重做日志文件以及控制文件应该实现冗余配置。
Step2:安全关闭数据库

Step3:创建备份目录

Step4:复制数据文件、控制文件和重做日志文件

Step5:打开数据库

冷备下的恢复
为了演示恢复,首先模拟故障,首先创建表、插入数据,最后删除数据,模拟用户的错误操作,然后用冷备份实现误操作的恢复。
Step1:创建新表,并插入数据。

Step2:模拟数据损坏故障。删除数据文件users01.dbf文件。

Step3:关闭数据库并复制数据文件、控制文件和重做日志文件。

Step4:重启数据库并通过DESC指令查看t1是否存在表t1是否存在。


缺少重做日志文件的恢复文件
备份了控制文件和数据文件,但是没有备份重做日志文件,此时需要启动到mount状态,使用recover database until cancle using backup controlfile,然后再通过alter database open resetlogs开启数据库。
3归档模式与非归档模式
归档模式Oracle提供的一种数据库完全恢复的重要措施。Oracle的重做日志文件是循环使用的,在切换日志时,如果启动了归档模式,后台进程ARCH就会启动将当前重做日志文件中的记录存储到归档目录下,形成归档文件。归档数据记录了Oracle数据库自启动归档以来所有的数据变化信息,使用归档和备份的数据文件可以实现数据库的完全恢复,当然还需要其他文件如当前的重做日志文件以及控制文件。
设置数据库的归档模式:
归档可以自动进行,也可以手动执行。所谓自动进行就是在事件触发的条件下Oracle数据库自动启动归档进程完成重做日志数据的归档。只要有足够的磁盘空间归档过程就可以持续下去。一旦启动了归档模式,就可以完成很多操作。当然最重要的就是实现数据库的完全恢复,对数据库实现联机热备并且可以实现不完全恢复。
实验ing
Step1:open状态查看归档状态

Step2:系统查看归档进程

Step3:手动归档当前重做日志

设置归档进程相关参数
归档进程作用:将重做日志文件备份到指定的归档目录。LGWR进程会将REDO LOG BUFFER中的重做数据写入REDOLOG,此时的REDOLOG分组,每当一个REDOLOG GROUP满时,或者发出SWITCH LOGFILE指令时都会触发日至组的切换,当发生日至组切换时,ARC进程会将当前的重做日志中数据写入归档目录。
LGWR进程是将内存中的数据写入重做日志文件,是内存读磁盘写。而ARC进程是将重做日志文件写入归档文件,是磁盘读磁盘写。显然LGWR进程的读写效率或读写速度比ARC进程要快,而频繁发生DML操作的数据库中,可能会发生由于归档慢而重做日志写入速度快造成的数据库被HANG住的情况。此时数据库什么也不做就等待ARC进程将当前的重做日志数据写入归档文件。为了匹配二者的速度问题可以考虑修改归档进程参数log_archive_max_processes。它的作用就是提高归档进程的数量,启动更多的归档进程完成写归档的过程。
默认情况,该参数的值是2,由于参数log_archive_max_process是动态参数文件,我们可以直接修改。

管理归档文件和归档目录
如果只有一份归档日志的话,一旦该归档日志损坏或者所在的磁盘故障,都会造成数据库无法完全恢复。此时就需要考虑通过冗余来解决归档日志文件不安全的问题。
在Oracle中可以设置最多10个归档目录,也就是可以设置10个不同的归档地址,通过冗余来保障归档日志的安全。
Step1:创建多个归档目录并应用

Step2:查看设置结果

Step3:手动执行日志切换启动归档并查看归档文件

Step4:设置最小的成功归档地址数量并查看(只要达到满足的条件当前日志组才能切换)

4手工热备数据库的步骤
热备是数据库运行过程中的数据库备份,手工管理的热备要求使用操作系统工具将数据文件备份到指定的目录。热备可以备份某个表空间的所有数据文件,也可以备份某个表空间的一个数据文件,在备份过程中表空间依然可用,DML操作依然支持。
在备份过程中数据文件头的SCN被锁定,此时不会有任何数据再写入数据文件,那么为什么还支持DML操作呢?因为数据的变化都写入到了重做日志文件,当表空间或数据文件结束备份时,会触发恢复过程,将设计该表空间的所有变化数据吸入该表空间。提升数据文件头部的SCN。使得控制文件和数据文件记录的SCN一致。
热备的前提是数据库出于归档模式,此时一般只需要备份数据文件,而对于控制文件、重做日志文件以及归档日志文件可以不考虑备份,这些文件我们可以通过前期的冗余设计来实现,也就是连接热备时,我们只需要考虑备份数据文件即可。
热备的好处有:不需要关闭数据库
热备的缺点有:归档模式下数据库的管理复杂,系统开销增大。
手工备份的具体步骤:

· 将表空间至于备份模式,使用alter tablespace user begin backup指令。
· 使用操作系统工具将表空间对应的数据文件备份到指定目录。
· 结束备份模式,使用alter tablespace users and backup指令。
· 归档当前日志、备份归档日志
Step1:查看USERS表空间对应的数据文件

Step2:将表空间至于备份目录中,并查看数据文件是否处于备份状态并进行备份


Step3:结束备份

Step4:查看v$backup查看文件是否已经结束了备份模式

Step5:将当前重做日志文件信息写入归档日志文件。查看当前数据文件检查点信息是否一致。

5热备过程中对数据库奔溃的处理方法
在热备过程中如果发生数据库奔溃该如何处理:
· 以热备表空间USERS为例,此时数据文件头都锁定,备份正在复制文件但是系统奔溃了。显然表空间的数据文件头的SCN与控制文件中的不一致,此时数据库无法打开,会要求介质恢复。此时需要的是结束表空间的备份模式,解锁数据文件头SCN,Oracle会自动使用实例恢复或者使用remove datafile指令实现数据文件的恢复。
Step1:启动表空间对应的数据文件的备份模式,查看备份模式是否启动,并且观察SCN情况。

注意:数据文件4的SCN比其他任何数据文件大,原因是一旦使用alter tablespace users begin backup就会触发检查点事件,刷新数据文件头SCN,并冻结SCN。
Step2:模拟实例失败故障

此时报错,提示文件4需要介质恢复。由于表空间热备过程后实例故障,数据文件头依然锁定、数据文件头的SCN与控制文件中的SCN不同。此时数据库处于MOUNT状态,我们查询数据字典视图v$backup查询那些数据文件处于备份状态。
Step3:查看当前备份状态并恢复数据库

6热备的原理
Tip1:Oracle数据块的大小是操作系统大小的整数倍,直接复制数据文件到备份介质的过程中,由于数据库一致可用,数据块中不断有数据进出,使用操作系统命令复制文件时,是基于操作系统进行复制的,也就是说复制一个操作系统块的时候,首先要锁定这个块,复制完成后解锁这个块。这样这个块在复制前和复制后是一致的。但是对于一个Oracle数据库来说,一个块要分成几次进行复制,可能在复制一个操作系统块的时候,另外一个操作系统数据块被改变了,导致Oracle数据块在复制到备份介质以后,前一半是没有改动过的,后一半是改动过的,数据块的状态不一致,数据块就不能够使用,备份就不能够使用,这就叫分离数据块现象。
Tip2:Oracle在数据块的头部和尾部各存了一个版本号,通过这个来确认这个数据块是否是分离数据块。Oracle修改过一个数据块以后,将这个数据块的版本号在头部和尾部各存放了一份。
Tip3:为了修复分离数据块,我们在备份某个表空间时候,首先进行begin backup,通知数据库备份,在没有end backup命令之前,只要是进程修改了被备份的表空间所包含的数据块中的某条记录,Oracle就会把该数据块中所包含的所有的数据行的数据生成重做记录,记录到日志文件中。
Tip4:通过发出begin backup以后,第一次修改数据块中的数据行之前,在联机重做日志文件中记录数据块的修改前的数据,这样在热备份恢复的时候,一旦发现某个数据块被分离,则会利用日志文件里的记录的数据对整个数据块进行恢复。
Tip5:备份表空间中的所有的被修改过的数据块的所有数据行都被保存在了联机重做日志文件中,而不是只记录被修改的数据行的记录,因此在热备份过程中,会发现生成的联机重做日志文件的量比较大,这取决于业务的繁忙程度,例如DML量比较大,那么产生的日志会非常多。
Tip6:发出begin backup命令以后,Oracle会对被备份的表空间所对应的数据文件触发文件级别的检查点进程,将内存中属于该表空间的所有脏数据块写入数据文件,检查点结束以后,数据文件头部(第一个和第一个数据块)的检查点SCN和日志序列号都不再变化,直至发出end backup,数据文件头部的SCN和日志序列号才会被更新。
Tip7:在热备份的过程中,数据文件头部的SCN和日志序列号被冻结,但是数据文件本身还是最新的,和正常一样的更新和使用,DML更新了某个表,这些更新都会被写入到数据文件中去。
Tip8:冻结数据文件头部的SCN号和日志序列号,是为了将来使用热备份进行恢复的时候,能够知道应该从哪里开始应用重做记录,也就是备份的数据文件头部所记录的SCN和日志序列号,定位到日志文件中,从日志文件中找到开始的SCN,向后应用所有的日志文件。
Tip9:end backup以后,所有的数据文件的头部SCN和日志序列号推进到最新,因为数据文件本身就是最新的。

小陈今天的分享就到这里啦!
期待下一期的邂逅!




