一. 准备知识
先来看一些准备知识,了解Oracle的物理结构,有如下4种。
1. 数据文件和数据块
Oracle 数据库的存储空间是用表空间来表示的,表空间只是一个逻辑概念,而物理上每个表空间是由磁盘文件组成,这些文件叫做数据文件(Data file),每个表空间可以由一个到多个数据文件组成,每个数据文件被划分为若干个最小的存储单位: 数据块(data block)。
Oracle 的用户数据是写到数据块上的,Oracle 是在SGA上操作数据的,修改数据或者添加数据都是在内存中进行,这些被修改的内存不会立即写入磁盘,而是以特定的时间间隔被写入磁盘。 如果哦数据库正常关闭,则在关闭之前将内存中的数据同步到磁盘,这时数据状态是一致的。如果数据库不正常关闭(如宕机,shutdown abort),内存中的内容没有完全写回磁盘,这时数据文件是不一致的。 如果数据文件是从备份中恢复出来的,数据文件也是不一致的,不一致性的数据文件必须恢复到一致的状态。
2. 日志文件
Oracle 数据库日志文件包括 联机日志 和 归档日志, 这些文件都是用来记录数据库修改历史的。Oracle 数据库至少要有两组联机日志,联机日志循环使用,当一组联机日志写满后,就要切换到另一组联机日志,后者的内容就会被覆盖,这个过程叫作日志切换(Log Switch),在日志切换时会触发检查点(CheckPoint)。
数据库的修改操作要记录到日志文件中,并且这个记录动作是在修改数据之前进行的,正因为日志文件中记录了所有的修改历史,因此如果有过去某个时点的备份文件,并且有从那是到当前的所有日志文件,就可以通过在备份文件上“重演”这些日志的方式,把数据文件恢复到当前状态或者之间的任何时点的状态。
日志线程(Redo Thread):
每个实例用到的联机日志就是一个Redo Thread,单实例有且仅有一个Redo Thread。在RAC 环境下,每个实例都需要自己的联机日志,也就是每个实例都有自己的Redo Thread。 这种每实例一个Redo Thread的设计就是为了避免实例间共享Redo 文件引发的竞争,提高系统性能。 但是这也带了一个问题,就是用RMAN 备份RAC 的时候,需要所有的日志文件。 故需要在两个节点上互相把日志传送到另一个节点。
Thread 这个参数用来指定实例使用的Redo Thread 线程号。一般和该实例的INSTANCE_NUMBER 参数相同。 通过视图V$LOG的Thread#列可以确定日志组所属的线程。
注意: 因为RAC 环境下有多个日志线程,所以在添加日志时必须指定线程号。
SQL>alter database add logfile thread 1 group 5 ('/oracle/oradata/redo5') size 50m;
在RAC 环境下,用户操作是分布在多个实例之间的,各实例都有自己的联机日志,恢复时必须把所有实例的联机日志都合并,把Redo Log Record 按照SCN 排序,才能整理出准确的用户操作记录,所以RAC的联机日志必须放在共享存储上,以保证实例都能访问其他实例的联机日志。
在看一个sql 的查询结果:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ---------------- ----
1 1 24585 104857600 1 YES ACTIVE
2 1 24583 104857600 1 YES INACTIVE
3 1 24584 104857600 1 YES INACTIVE
8 1 24586 104857600 1 NO CURRENT
从查询结果上,我们可以看到联机日志有3个状态。
INACTIVE: 表示DBWR 已经做完,该日志包含的数据修改已经写到数据文件
ACTIVE: DBWR 没有做完,数据还没有写到数据文件。
CURRENT:当前正在使用的日志。 没有DBWR 操作。
3. 控制文件
控制文件记录了数据库的物理结构和状态(比如数据文件名,每个数据文件的检查点号,联机状态),包括备份和恢复的信息也记录在控制文件中。 恢复过程要根据控制文件中的信息,比如数据库的检查点,当前联机日志,数据文件检查点等来进行恢复操作,如果控制文件丢失,则恢复的过程会很艰难。
4. Undo Segment
修改记录过程中,记录修改之前的状态会被记录到Undo Segment中, 这条记录叫作前镜像(before images)。 当需要撤销修改比如执行Rollback时,就用这条前镜像覆盖现有记录,对于Insert 操作,前镜像就是一个空记录,对于Undate,Delete 操作,前镜像就是修改之前的记录。
在数据库恢复过程中,日志和Undo Segment 共同起作用,二者保证了最终恢复的一致状态。二者也对应了恢复的两个阶段: 前滚(Roforware)和 回滚(Rollback)。在前滚阶段,在文件上重演日志内容,以把文件恢复到数据库关闭时的状态,但是数据库关闭时可能有很多修改操作没有提交,这些操作必须进行回滚,这就要利用Undo Segment的内容。
二.备份
备份是指数据的拷贝,这个拷贝可以用来重建数据库。 备份可以分为物理备份和逻辑备份。
物理备份: 指对数据文件,控制文件,联机日志文件等文件进行物理拷贝的方法,这种方法是在文件层进行的,通过冗余的文件备份来体统数据保护。物理备份又可分为联机备份(也叫作联机热备)和脱机备份(也称冷备)。
逻辑备份: 利用Oracle 提供的导出工具把重要数据导出到文件,以后恢复时在利用工具把数据重新导入到数据库中,这种保护是在数据层进行的。 该类工具有: exp/imp, expdp/impdp(10g 以后版本)。
物理备份是最强健的数据保护方也,也是备份策略中首选的方法,逻辑备份只能作为物理备份的补充手段,不足以保护数据丢失。
物理备份又可分为用户管理备份(User-Managed Backup)和RMAN备份(Recovery Manager)。 前者是联合使用SQL 命令和OS的cp 命来进行文件备份。 Rman 备份指利用RMAN 工具来进行备份。
Rman 备份有几点好处:
1. 增量备份
2. 数据块恢复:可以在新进行数据块恢复,不必进行数据文件恢复,提高系统的可用性。
3. 压缩备份
4. 加密备份
|