首页 > 代码库 > 专题实验 备份与恢复

专题实验 备份与恢复

备份方法: 逻辑备份和物理备份

逻辑备份: 拖过逻辑导出对数据进行备份, 逻辑备份的数据只能给予备份时刻进行数据转储, 所以, 恢复也只能恢复到备份时保存的数据. 逻辑备份适合备份哪些很少变化的数据表, 如果通过逻辑备份进行全库恢复, 通常需要重建数据库, 导入备份数据来完成, 对于可用性要求很高的数据库, 这种恢复的时间太长, 通常不被采用, 由于逻辑备份具有平台无关性, 所以更为常见的是, 逻辑备份被作为一个数据迁移及移动的主要手段.

物理备份: 指拖过物理文件拷贝的方式对数据库进行备份, 物理备份又可分为冷备份和热备份. 冷备份是指对数据库进行关闭后拷贝的备份, 这样的备份具有一致和完整的时间点数据, 恢复时只需恢复所有文件就可以启动数据库; (所有文件中包含redo日志文件, contrl file, datafile), 在生产系统中最为常见的备份方式是热备份, 进行热备份的数据库需要运行在归档模式下, 热备份不需要关闭数据库, 从而能够保证系统的持续运行, 在进行恢复时, 通过备份的数据文件及归档日志文件, 数据库可以进行完全恢复, 恢复可以一直进行到最后一个归档日志(剩下的内容可以通过redo日志文件进行恢复), 如果联机日志存在(redo log), 则恢复可以继续, 实现无数据损失的完全恢复.

恢复原理

恢复利用重做日志文件, redo log 及其衍生的归档日志文件(archived redo log file)

热备份恢复: 逐渐应用日志向前恢复的过程成为前滚, 前滚的过程实际上就是应用日志重演事务的过程, 完成前滚后, 数据文件将包含未提交和提交的数据, 然后需要应用回滚数据, 将未提交的事务回滚, 这个过程成为 rolling back 或 transaction recovery.

通常, 完全恢复应用于那些由于硬件故障导致的数据库损失, 在这种情况下需要最大可能的恢复数据; 不完全恢复通常用于恢复用户错误, 比如用户不小心删掉了不该删掉的内容.

在实际管理中, 很多情况下进行的是不完全恢复, 不完全恢复主要有 4 种类型: 基于时间的恢复(Time-based Recovery), 基于放弃的恢复(cancel-based Recovery), 基于改变的恢复(Change-based Recovery) 和基于日志序列的恢复(Log sequece recovery)

基于时间点的恢复最为常用, 当然更多情况下, 我们可能面对的是单个数据文件或表空间的损坏. 对于这类故障, 可以针对单个文件或表空间进行恢复, 恢复通常并不影响整个数据库的运行, 受影响可能只是和故障表空间相关的应用.

检查点 与 RBA

在恢复的内部控制上, oracle数据库通过检查点和RBA信息来确定恢复范围, 正常情况下, 最后一个完成检查点对应的RBA是恢复的起点(Cache-Low RBA), 恢复能达到的终点是on-disk RBA, 也就是最后一个写出到磁盘的 REDO 的日志记录, 在实例恢复中, oracle数据库就将进行介于Cache-Low RBA 和 On-Disk RBA 之间的自动实例恢复.

RBA(Redo Byte Address): it is a pointer to a specific location in the redo logs.

上边的起点和终点, 是指在 redo log file 这个文件中, 最后一个完成检查点的RBA(一个在redo log内部指向某条记录的指针, 这个指针的操作结果已经写入磁盘, 因为已经完成检查点), 这个RBA作为起点, 到on-disk RBA(只LGWR已经将某条记录写到 redo log file 中).

数据库的运行模式

archive log list; 获得当前归档的信息

生产库都运行在归档模式下. 曾经见过很多用户由于缺乏必要的监控和备份策略, 在归档模式下由于归档空间耗尽而导致数据库故障的案例.

更改数据库模式,(非归档->归档)

  • 修改必要的初始化参数(log_archive_start: 用于定义是否启动自动归档, oracle10g后, 这个参数废弃, log_archive_format: 用于定义归档文件格式, 可以采用缺省值, log_archive_dest: 用于定义归档文件路径, log_archive_dest_n: oracle准许多路归档路径, 一般可以使用 log_archive_dest_1 参数即可.
  • 以 immediate 方式关闭数据库
  • 启动实例到 mount 状态
  • 更改运行模式并打开数据库 alter database archivelog; alater database open; archive log list;

逻辑备份与恢复 ? 再确认

貌似这种方法, 只是导入导出数据, 但是骨架( tablespace, table, user 等等信息, 需要先创建在数据库中)

使用 EXP 进行逻辑备份, EXP 工具可以将 oracle 数据库中的数据提取出来, IMP 可以将数据导入.

但是需要注意的是, 使用 EXP 备份的数据进行全库恢复时, 需要重新建立数据库, 导入备份的数据, 恢复的过程可能极其漫长.

1) EXP 导出与字符集,

使用 IMP 进行逻辑恢复

由于使用 EMP 备份的数据进行恢复时, 一般需要重新创建数据库, 导入备份的数据, 恢复过程可能会极为漫长; 如果是做局部恢复(只针对部分用户或部分表的恢复)则要相对简单.

使用数据泵(EXPDP/IMPDP), 与EXP主要的不同, EXPDP 增加了一个主要的新的参数: DIRECTORY, 这个参数用来定义一个路径, 这个 DIRECTORY 就对应的是server端的路径, 可以自己创建一个DIRECTORY, 也可以使用缺省的路径.

物理备份与恢复

物理备份是只针对 Oracle 的文件进行的备份, 这与逻辑备份针对数据的备份不同. (control file, data file, control file, redo log, archive log(非必须), 参数和口令), 注意, 临时文件因为不永久存储数据, 所以不必备份.

冷备份

select name from v$database -- 先确定需要转储的文件的位置.

冷备份的正常步骤:

1) 正常关闭数据库

2) 备份所有重要的文件到备份目录

3) 完成备份后启动数据库

为了恢复方便, 冷备份应该包含所有的数据文件, 控制文件和日志文件, 这样当需要采用冷备份恢复时, 只需要将所有文件恢复到原有位置, 就可以启动数据库了.

热备份

分为用户管理热备份 和 rman

用户管理的热备份 指用户通过将表空间置于热备份模式下, 然后通过操作系统工具队文件进行复制备份, 备份完成后再结束表空间的备份模式.(即先将表空间设置备份模式, 然后copy文件, 然后再恢复表空间)

rman: 不需要将表空间设置成热备模式, 从而可减少对于数据库的影响, 另外 RMAN 的备份信息可以通过控制文件或者额外的目录数据库进行管理, 功能大但是相对复杂.

用户管理热备步骤: (会影响性能, 建议使用 rman)

1) 在备份之前需要显示发出 begin backup 命令 例如: alter tablespace system begin backup;

2) 操作系统 copy 文件 (copy system01.dbf 到别的地方)

3) 发出 end backup 命令通知数据库完成备份 alter tablespace end backup;

4) 备份归档日志文件

恢复时, 直接将数据库打开到 mount状态, 然后 alter database recover

rman 备份与恢复 ? 需要补充

任何使用 oracle 数据库的用户都应当使用 rman 来进行备份恢复管理, 这是非常重要的基本技能.

rman 的好处:

rman 支持除逻辑备份以外的所有备份类型, 包括完整备份, 增量备份, 表空间备份, 数据文件备份, 控制文件备份, 归档日志备份 等.

自动生成备份日志

rman 的备份脚本和 OS 无关, 方便移植.

强大的报表功能可以方便的获悉备份的可用性.

使用 rman 进行备份, 需要了解一个重要概念: 恢复目录, rman 在进行备份时, 需要将备份信息存储起来, 这些信息将用来进行恢复, 如果丢失了这些信息, 恢复将变得极其困难和复杂. 缺省 rman 将这些信息存储在控制文件中, 那么此时控制文件的安全就变得极为重要, 对于重要的数据库, 使用控制文件进行信息存储是不够稳妥的; oracle也支持将rman的备份信息存储在目录数据库中(catalog database), 目录数据库可以使用一个独立的数据库, 也可以使用现有的数据库中的一个表空间, 一个目录数据库可以备份多个数据库, 但是注意, 恢复目录同样需要进行备份, 通常使用逻辑备份即可.

1) 使用 nocatlog 方式进行备份( 即备份信息保存在 control file 中)

因为这样, contrl file的安全就变得很重要, oracle支持自动备份控制文件, 可以通过如下方式设置控制文件的自动备份:

rman target /

configure controlfile autobackup on;

这个设置可以在rman 中查询: show controlfile autobackup; 也可以在数据库中, select * from v$rman_configuration; 中查询, 注意一下备份路径, 由于oracle10g后引入了闪回区的新特性, 所以自动备份存储在闪回区中; 如果不适用闪回区或者适用 oracle 9i, 则自动备份存储于 $oracle_home/dbs 目录下

如果控制文件等出现问题, 就可以使用之前的自动备份的控制文件了(包含spfile)

在rman中输入: restore spfile to ‘spfile位置’ from autobackup;   -- 恢复 spfile

在rman中输入: restore controlfile to ‘spfile位置’ from autobackup;  -- 恢复 controlfile

最后, 强烈建议大家打开自动备份 control file

全备:

backup database tag=leon070301;   -- 表示7月3日的第1个备份