Oracle 备份杂谈

备份概述

Oracle 的备份可以分成物理备份和逻辑备份,物理备份就是把实际物理文件从一处拷贝到另一处(可 能是1 ∶1 的原样拷贝,也可能是 n ∶1 的压缩拷贝),操作系统备份、使用 RMAN 的备份、冷备份、热备 份都是物理备份的例子。

逻辑备份是利用SQL 从数据库中提取数据,并将其保存到文件中,这些数据可以在以后需要时重新导 入到原有数据库,或者导入其他数据库。就逻辑备份的思想而言,用户自己也可以开发一套逻辑备份工具, Oracle 也提供了 EXP 、IMP 、EXPDP、IMPDP工具,并随安装包发布。

物理备份

所谓物理备份,就是通过对数据文件的拷贝生成备份文件的方式。原始文件和备份文件可以是1 对1 的关系,也可以是 N 对1 的方式。联机热备和冷备份都属于物理备份,这一部分重点介绍联机热备。联机 热备根据使用的工具不同,又可以分成用户管理备份(User-Managed Backup)和恢复管理器备份(也就是 RMAN 备份,Recover Manager)。前者是借助操作系统的文件拷贝命令(比如 cp )来完成,而后者是利用 Oracle 提供的工具 RMAN 进行备份。

冷备份

所谓冷备份,就是正常关闭数据库后进行的备份。也叫做脱机(Offline )备份。进行这种类型的备份 最简单,但是也最不可取,因为关闭数据库就意味着关闭业务系统,也就是停止了一切商务活动。这种备 份包括以下3 个步骤。

(1)关闭数据库。

要进行冷备份,首先必须正常关闭数据库,也就是通过SHUTDOWN NORMAL 、IMMEDIATE 、 TRANSACTION方式关闭,而不能 SHUTDOWN ABORT方式。因为只有正常方式关闭的数据库,数据库 才会处在一致性状态。

(2)备份所需的 Oracle 文件。

需要备份的文件包括控制文件、数据文件、日志文件,而参数文件、密码文件、代码文件根据需要进 行可选的备份。

(3)以正常方式启动数据库。

如果数据库处于非归档模式,则只能使用“冷备份”一种备份方式。

热备份

如果数据库运行在归档模式下,Oracle 就允许在数据库运行的同时进行备份操作,无须关闭数据库, 也不会干扰用户对数据库的使用。和非归档模式的“冷备份”相对,这种备份就叫做“热备份”。同样和“脱 机备份”相对,也叫做“联机备份”。

Oracle 的“热备份”根据工具不同分成了两种,User-Managed Backup和RMAN Backup,下面分别介 绍这两种工具。

1.User-Managed Backup

对于这种备份方法本书只做简单介绍,不重点论述,读者只需做概念上了解即可,而应把更多的精力 放在后面的RMAN 上。这种备份方式是借助SQL 命令和操作系统的文件拷贝命令完成的,具体操作步骤分为3 步:

  • 使用 SQL 的 ALTER TABLESPACE … BEGIN BACKUP 命令把表空间置为备份模式;
  • 使用操作系统文件拷贝命令进行文件拷贝;
  • 拷贝结束后,使用 SQL 的 ALTER TABLESPACE…END BACKUP 结束备份。

下面通过一个例子解释这些步骤:

(1)把要备份的表空间置为备份模式:

alter tablespace test begin backup; 

(2 )操作系统的文件拷贝:

cp test1.dbf /backup/test1.dbf 

(3 )拷贝完成后,结束备份:

alter tablespace test end backup; 

对于这种备份方式,有以下3 个重点需要掌握。

2.ALTER…BEGIN BACKUP 命令

ALTER…BEGIN BACKUP 命令会有两个效果,首先会触发表空间上的检查点操作,强迫数据文件在 备份开始时处于一致性状态;然后数据文件头的SCN 就会被冻结,在结束备份前(也就是发出 ALTER…END BACKUP 命令)这个SCN 都不会改变。

这样做的原因是:把表空间置为备份模式并不会阻止后续对数据文件内容的修改,也就是说在备份过 程中,DBWR 进程仍然能向数据文件中写入数据。而操作系统的cp 命令不会感知这些变化。其结果就是在开始备份时数据文件处于一致性状态,但是在备份结束后,数据文件就处于不一致状态了,进而导致备 份文件也是不一致状态。通过冻结SCN ,Oracle 在恢复时就可以知道备份文件在这个SCN 对应的时点, 数据是一致的。恢复工作只需从这个SCN 开始就可以了。

3.备份期间数据库异常中止

如果使用User-Managed Backup 方式进行备份,需要注意一个问题。就是备份过程中发生了数据库异 常中止。这种异常会有两个影响。

  • 如果操作系统文件拷贝没有完成,则备份文件不可用,需要重新备份。这个影响相对于下一个影响 还小一些。
  • 数据文件会被认为是从备份中恢复出来的,再次打开数据库时会提示“ 数据文件需要恢复”,这个 影响需要 DBA 小心处理。下面介绍这个问题的成因及解决办法。

之所以会遇到这种提示,是因为数据文件头的SCN 被冻结了。其原因已经在前面解释过了。也正因 为SCN 被冻结,导致文件头的SCN 和数据库控制文件中的SCN 不一致,肯定会小于后一个SCN 。Oracle 在打开数据库时会比较这些SCN ,只有完全一致,才能够打开数据库。因此,Oracle 会认为这个数据文 件是从备份中恢复出来的,提示“数据文件需要恢复”。

对于DBA来说,如果你无法确定数据文件是不是从备份文件中恢复过来的,那么首先就要进行一个判 断:是否因为文件处于备份模式才导致了这个提示,这一点可以从视图中查看。

1
select file#,status,change#,time from v$backup;

如果是处于备份模式的数据文件,STATUS 列示ACTIVE,同时 CHANGE# 、TIME 列也会有相应的数 据值。 如果是正常模式的数据文件,STATUS 列是NOT ACTIVE ,同时CHANGE# 、TIME 列是 0 和空。 从另外一个视图也可以看到数据文件头SCN 被冻结的信息:

select name,status,fuzzy from v$datafile_header; 

如果是处于备份模式的数据文件,FUZZY列是YES ,否则是空值。 一旦确定是因为备份模式导致的这个错误,可以使用结束备份命令来解除这个冻结。 然后就可以打开数据库了。

alter database datafile 2 end backup; 
或者: 
alter database end backup; 

4.REDO 数量

使用这种备份比RMAN 备份会生成更多的Redo日志。 Oracle 的数据块和 OS的数据块不是1 ∶1 的关系,而是 1 ∶n 的关系。比如通常操作系统的数据块是 512 字节,而 Oracle 数据块通常是 8KB ,也就是说二者是 16∶1 的关系。操作系统的文件拷贝命令是在操 作系统级别进行的,也就是对OS Block 进行拷贝,ALTER …BEGIN BACKUP 命令不会禁止DBWR 进程 写入数据文件,也不会锁定数据文件,因此在操作系统拷贝的同时,DBWR 进程还是有可能把数据块写入 磁盘。

因为DBWR 进程和cp 命令处理的数据块大小不同,就可能出现下面这种情况:cp 命令把一个Oracle 数据块的头4KB 读入,正在向备份文件中写入。这时,DBWR 进程修改了 Oracle 数据块的内容,当然会 修改数据块头内容。然后cp 命令又把后4KB 内容读出,写到备份文件中。这时,备份文件中的这个数据 块就处于一种不一致的状态,这就是所谓数据块分裂(Split Block )。对于这种数据块,Oracle 在恢复中会 认为是损坏的数据块(Currpted Block)。

为了解决数据块分裂这个问题,对于User-Managed Backup 这种备份方式,Oracle 会使用一个特殊的 机制,也就是一旦数据文件处于备份模式,则在对数据块作修改时,Oracle 会把数据块的前镜像完整的记 录到联机日志中,这样以后的恢复中,就可以借助数据块的前镜像解决分裂问题,而非备份模式下联机日 志中只会记录被修改的记录的前镜像,这也是为什么采用User-Managed Backup会产生更多 Redo的原因。

但是如果通过RMAN 工具进行热备,RMAN 会先把Oracle 数据块读入一个缓存区,从工具级别就避 免了数据块分裂的问题。

RMAN备份下一文章讲解