Oracle数据库备份与恢复【RMAN】

1、理解备份与恢复

1.1、什么是备份与恢复

数据库备份通常分为如下两种:
1、物理备份:备份组成数据库的物理文件(包含数据文件、控制文件、归档重做日志文件),也即是在其他位置存放数据库物理文件的同本,比如脱机的磁盘或者磁带设备;
2、逻辑备份:指备份数据库中的逻辑数据,比如数据表和存储过程,可以使用Oracle的数据泵工具导出到二进制文件,在数据库恢复时导入到数据库。
1和2的关系:物理备份是制定任何备份策略的基础,逻辑备份可以看作是物理备份的有效补充,但是物理备份需要较长的备份和恢复时间,而逻辑备份可以仅对重要的数据库数据进行备份,可以实现较快的备份与恢复操作,因此在实际的工作中即要进行物理备份,也要确保对于重要数据的即时逻辑备份。
在实际工作过程中,需要DBA处理的故障有3大类,分别是介质故障、用户错误活应用程序错误,其他的错误不会造成数据的丢失,或需要从备份中恢复,比如可能需要重启数据库以便恢复数据库实例的失败。下面是对这3类DBA需要进行备份与恢复的错误详细描述:

  1. 介质故障,比如物理磁盘损坏导致读取或写入磁盘的失败,此时就需要进行介质恢复来实现数据完整性,对于这类故障,DBA必须制定完整的备份恢复策略,以防止出现灾难性的数据丢失。
    数据库备份以及介质恢复
  2. 用户错误
  3. 应用程序错误
  4. 实例恢复
  5. 介质恢复
    DBA必须尽量制定有效的备份恢复策略,缩减平均恢复时间(MTTR)延长平均故障间隔时间(MTBF),定期对备份和恢复的策略有效性进行检查(自动备份是否能够正常执行,备份后的文件能够正常恢复)。

1.2、备份与恢复的方法

1、进行Oracle备份恢复的方式有以下3种:

  1. 使用RMAN恢复管理器进行备份和恢复,RMAN是Oracle内置的备份恢复程序,不用单独安装。也可以通过Database Control界面来管理数据库实例;
  2. 用户管理的备份与恢复,这种是使用操作系统命令对数据库文件进行备份与恢复;
  3. 使用SQL*Loader或者数据泵导入导出工具进行逻辑备份与恢复,这种方式可以备份重要数据,并可以实现在不同操作系统或者不同的Oracle版本之间的数据传输。
    但是Oracke建议使用RMAN完成备份与恢复的工作,好处是用户不用记住备份的数据文件和归档重做日志文件,RMAN可以自己存储位置来记录这些信息,并且RMAAN能够验证备份文件内部数据块的有效性,并能欧在资料库中记录复制的情况。
    2、备份的方式
  4. 一致性备份:备份所包含的各个文件中的系统更改号(SCN)都相同,即备份所包含的各个文件中的所有数据均来自同一时间点。
  5. 非一致性备份:指文件包含来自不同时间点的数据,这主要用于联机备份模式,即数据库在处理事务时进行数据文件的备份,这种备份方式除了复原数据外,还需要使用归档和联机重做日志文件进行恢复,使数据库数据恢复到特定的时间点上。
  6. 数据库完全备份,是指对数据库内所有的数据文件、控制文件的备份,是最常用的备份类型,完全被分既可以是一致性备份也可以是非一致性备份。
  7. 部分备份数据库,对数据库部分内容进行备份,比如一个表或者一个数据文件,这种方式一般较少使用。
  8. 联机备份,是指数据库在运行过程中的备份,也称热备份,但是只有数据库运行在归档模式下,才能够对整个数据库进行联机备份,如果数据库雨荨在非归档模式下,则只能进行脱机备份。
  9. 脱机备份,数据处于关闭状态下的备份,也成热备份,只要数据库不适用SHUTDOWN ABORT进行关闭的,则备份总是一致性备份,否则备份就是非一致性备份,在富源数据库后需要应用重做日志文件使其保持一致性状态。

2、使用RMAN备份

2.1、设置归档日志模式

第一步:在SQL*PLUS中使用ARCHIVE LOG LIST 或者查询从v$database数据字典视图来查看当前数据库所处的模式。
1、在操作系统中使用sysdba账号登陆数据库

1、sqlplus / as sysdba;--登陆本机数据库
2、sqlplus [username]/[password]@[IP]:1521/[SID];--远程登陆数据库

第二步:查询v$database数据字典视图的log_mode字段,或者使用ARCHIVE LOG LIST来查看数据库所处模式。

set linesize 500;--格式化输出结果宽度
select dbid,name,log_mode,platform_name from v$database;--使用v$database查询

结果如下:NOARCHIVELOG代表非归档模式
v$database查询结果
或者

archive log list;

结果如下:
crchive log list查询结果
第二步:通过第一步中的结果可以看出当前数据库处于非归档模式,现在使用如下步骤将数据库设置成归档模式:
(1)、使用SHUTDOWN命令关闭数据库实例,然后将数据库启动到MOUNT状态,示例如下:

SQL> SHUTDOWN IMMEDIATE;--关闭数据库实例
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP MOUNT;--启动数据库到MOUNT状态
ORACLE 例程已经启动。

Total System Global Area 3373858816 bytes
Fixed Size                  2180424 bytes
Variable Size            2348812984 bytes
Database Buffers         1006632960 bytes
Redo Buffers               16232448 bytes
数据库装载完毕。

(2)、使用ALTER DATABASE ARCHIVELOG语句将数据库设置为归档日志模式,或者使用ALTER DATABASE NOARCHIVELOG将数据库设置为非归档日志模式,语句如下:

SQL> ALTER DATABASE ARCHIVELOG;

数据库已更改。

(3)、将数据库设置为打开状态,语句如下:

SQL> ALTER DATABASE OPEN;

数据库已更改。

(4)、此时数据库已经使用归档模式在运行,可以使用ARCHIVE LOG ALL将重做日志文件进行归档,示例语句如下:

SQL> ARCHIVE LOG ALL;
ORA-00271: 没有需要归档的日志

如上结果所示,报错ORA-00271: 没有需要归档的日志,这可能是已经进行了归档或日志文件组还没有开始写入,可以使用如下命令对当前的日志组进行归档。
(5)、解决报错信息ORA-00271

SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

系统已更改。

第三步:至此,数据库以能够自动完成归档,此时可以再次使用“第二步”中的语句查询出归档日志存储位置。

SQL> ARCHIVE LOG LIST;
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST--归档日志默认使用闪回区域
最早的联机日志序列     593
下一个存档日志序列   595
当前日志序列           595

如果需要查看归档日志文件可以执行以下命令:

C:\>RMAN TARGET /   --使用rman target / 命令登陆RAMN并连接数据库,或者使用rman target [username]/[passwd]@[IP]:1521/[SID]连接目标数据库

恢复管理器: Release 11.2.0.1.0 - Production on 星期四 1017 17:46:06 2019

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

连接到目标数据库: ORCL (DBID=1547773451)

RMAN> crosscheck archivelog all;--查看所有的归档日志文件

使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=129 设备类型=DISK
对归档日志的验证成功
归档日志文件名=D:\APP\MINGYUAN\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2019_10_17\O1_MF_1_594_GTJ9Q3HR_.ARC RECID=1 STAMP=1021912291  --这个就是归档日志存储位置
已交叉检验的 1 对象
RMAN>

2.2、完整数据库备份

创建一个完成的数据库备份,备份所有的数据库文件及SPFILE文件,复制Oracle的安装目录,语句如下:

2.2.1、指定备份集的位置

RMAN> BACKUP DATABASE FORMAT 'C:\backup\%d_bak_%U';--%d指定数据库名称,%U指定产生一个唯一的命名,%t指定备份集的时间戳,%s指定备份集编号及%p指定备份片编号。

启动 backup18-10-19
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00005 名称=D:\APP\ORADATA\ORCL\XTDATA.DBF
输入数据文件: 文件号=00003 名称=D:\APP\ORADATA\ORCL\UNDOTBS01.DBF
输入数据文件: 文件号=00004 名称=D:\APP\ORADATA\ORCL\USERS01.DBF
输入数据文件: 文件号=00001 名称=D:\APP\ORADATA\ORCL\SYSTEM01.DBF
输入数据文件: 文件号=00002 名称=D:\APP\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 正在启动段 118-10-19
通道 ORA_DISK_1: 已完成段 118-10-19
段句柄=C:\BACKUP\ORCL_BAK_04UEKOF4_1_1 标记=TAG20191018T150404 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:05:25
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
备份集内包括当前控制文件
备份集内包括当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 118-10-19
通道 ORA_DISK_1: 已完成段 118-10-19
段句柄=C:\BACKUP\ORCL_BAK_05UEKOP9_1_1 标记=TAG20191018T150404 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup18-10-19

RMAN>

2.2.2、默认使用闪回恢复区创建备份

RMAN> BACKUP AS BACKUPSET DATABASE SPFILE;

启动 backup18-10-19
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=192 设备类型=DISK
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00005 名称=D:\APP\ORADATA\ORCL\XTDATA.DBF
输入数据文件: 文件号=00003 名称=D:\APP\ORADATA\ORCL\UNDOTBS01.DBF
输入数据文件: 文件号=00004 名称=D:\APP\ORADATA\ORCL\USERS01.DBF
输入数据文件: 文件号=00001 名称=D:\APP\ORADATA\ORCL\SYSTEM01.DBF
输入数据文件: 文件号=00002 名称=D:\APP\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 正在启动段 118-10-19
RMAN-03009: backup 命令 (ORA_DISK_1 通道上,10/18/2019 14:32:33) 失败
ORA-19809: 超出了恢复文件数的限制
ORA-19804: 无法回收 52428800 字节磁盘空间 (4102029312 限制中)
继续执行其他作业步骤, 将不重新运行失败的作业
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
备份集内包括当前控制文件
备份集内包括当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 118-10-19
通道 ORA_DISK_1: 已完成段 118-10-19
段句柄=D:\APP\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2019_10_18\O1_MF_NCSNF_TAG20191018T143217_GTLQ426G_.BKP 标记=TAG20191018T143217 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
备份集内包括当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 118-10-19
通道 ORA_DISK_1: 已完成段 118-10-19
段句柄=D:\APP\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2019_10_18\O1_MF_NNSNF_TAG20191018T143217_GTLQ439W_.BKP 标记=TAG20191018T143217 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================

RMAN-03009: backup 命令 (ORA_DISK_1 通道上,10/18/2019 14:32:33) 失败
ORA-19809: 超出了恢复文件数的限制
ORA-19804: 无法回收 52428800 字节磁盘空间 (4102029312 限制中)

RMAN>

如上所示,出现报错信息,该信息是指归档文件过大,导致归档失败,db_recovery_file_desc有size限制,默认是2G。
解决方法:删除多余的归档文件。然后设置较大的db_recovery_file_dest_size。
过程如下:
(1)查看闪回恢复区空间

C:\Users>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期五 1018 16:07:10 2019

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select * from v$recovery_file_dest;--space_limit:该区域的大小是多少,space_used:已经使用了多少空间,space_reclaimable:删除一些垃圾数据之后可以回收的空间大小(如obsolete,redundant、low priority),number_of_files:说明该区域目前存在有多少文件

NAME                                           SPACE_LIMIT SPACE_USED        SPACE_RECLAIMABLE NUMBER_OF_FILES
---------------------------------------------- ----------  ----------------- ----------------- ---------------
D:\app\flash_recovery_area                     4102029312  372635648         372635648         12
SQL>

(2)、查询并删除无效归档日志文件

C:\Users>rman target /
RMAN>crosscheck archivelog all;   -- 运行这个命令可以把无效的expired的archivelog标出来。
RMAN>delete expired archivelog all;  -- 直接全部删除过期的归档日志。

(3)、如果无法删除归档日志文件,可以重新设置归档日志文件,并分配更大的空间,配置合理的覆盖策略。【具体方法请查询相关Blog文章】

2.2.3、查询、删除备份集


RMAN> LIST BACKUP OF DATABASE;--查询备份数据库文件


备份集列表
===================

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
3       Full    11.13G     DISK        00:05:17     18-10-19
        BP 关键字: 3   状态: AVAILABLE  已压缩: NO  标记: TAG20191018T150404
段名:C:\BACKUP\ORCL_BAK_04UEKOF4_1_1
  备份集 3 中的数据文件列表
  文件 LV 类型 Ckp SCN    Ckp 时间   名称
  ---- -- ---- ---------- ---------- ----
  1       Full 4228805    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\SYSTEM01.DBF
  2       Full 4228805    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\SYSAUX01.DBF
  3       Full 4228805    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\UNDOTBS01.DBF
  4       Full 4228805    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\USERS01.DBF
  5       Full 4228805    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\XTDATA.DBF

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
5       Full    11.13G     DISK        00:03:34     18-10-19
        BP 关键字: 5   状态: AVAILABLE  已压缩: NO  标记: TAG20191018T154338
段名:C:\BACKUP\HYYS0508_BAK_06UEKQPA_1_1
  备份集 5 中的数据文件列表
  文件 LV 类型 Ckp SCN    Ckp 时间   名称
  ---- -- ---- ---------- ---------- ----
  1       Full 4230473    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\SYSTEM01.DBF
  2       Full 4230473    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\SYSAUX01.DBF
  3       Full 4230473    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\UNDOTBS01.DBF
  4       Full 4230473    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\USERS01.DBF
  5       Full 4230473    18-10-19 D:\APP\MINGYUAN\ORADATA\ORCL\XTDATA.DBF

RMAN> DELETE BACKUPSET 5;--删除BS关键字为5的备份数据库文件

使用通道 ORA_DISK_1

备份片段列表
BP 关键字  BS 关键字  Pc# Cp# 状态      设备类型段名称
------- ------- --- --- ----------- ----------- ----------
5       5       1   1   AVAILABLE   DISK        C:\BACKUP\HYYS0508_BAK_06UEKQPA_1_1

是否确定要删除以上对象 (输入 YES 或 NO)? Y
已删除备份片段
备份片段句柄=C:\BACKUP\HYYS0508_BAK_06UEKQPA_1_1 RECID=5 STAMP=1021995818
1 对象已删除

RMAN>

3、使用RMAN恢复数据库

RMAN的恢复对应有两个操作:

  • 数据库复原【RESTORE】,指利用备份集的数据文件来替换已经损坏的数据库文件或者将起恢复到一个新的位置。
  • 数据库恢复【RECOVER】,应用所有的归档重做日志将数据库恢复到健康的状态,或者仅应用部分的REDO将数据库恢复到指定的时间点。
    执行数据库恢复时,需要将整个数据库进入到MOUNT状态,如果只是对个别的表空间或者数据文件的恢复可以在OPEN状态下进行操作。
    恢复操作时,可以使用完全恢复来恢复到最近的时间点,也可以使用部分恢复来恢复到特定的时间点,恢复完成后,在开启数据库,或者如果是不完全恢复,需要指定RESETLOGS打开数据库。
    完全恢复数据库步骤如下:
    (1)、启动数据库到MOUNT状态
RMAN> STARTUP MOUNT;--需要数据库已经被SHUTDOWN才能恢复到这个状态,如果是正常的数据库需要使用管理员账号进行SHUTDOWN IMMEDIATE之后才能进行该操作。
Oracle 实例已启动
数据库已装载
系统全局区域总计    3373858816 字节
Fixed Size                     2180424 字节
Variable Size               2348812984 字节
Database Buffers            1006632960 字节
Redo Buffers                  16232448 字节

RMAN>

(2)、使用RESTORE DATABASE还原数据库

RMAN> RESTORE DATABASE;

启动 restore18-10-19
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=212 设备类型=DISK

通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00001 还原到 D:\APP\MINGYUAN\ORADATA\ORCL\SYSTEM01.DBF
通道 ORA_DISK_1: 将数据文件 00002 还原到 D:\APP\MINGYUAN\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 将数据文件 00003 还原到 D:\APP\MINGYUAN\ORADATA\ORCL\UNDOTBS01.DBF
通道 ORA_DISK_1: 将数据文件 00004 还原到 D:\APP\MINGYUAN\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 将数据文件 00005 还原到 D:\APP\MINGYUAN\ORADATA\ORCL\XTDATA.DBF
通道 ORA_DISK_1: 正在读取备份片段 C:\BACKUP\HYYS0508_BAK_08UELAFM_1_1
通道 ORA_DISK_1: 段句柄 = C:\BACKUP\HYYS0508_BAK_08UELAFM_1_1 标记 = TAG20191018T201134
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:01:55
完成 restore18-10-19

RMAN>

(3)、在还原数据库后如果数据库在备份之后没有产生过任何事务,则恢复操作到此完成。
否则就需要使用RECOVER进行恢复操作。操作方式如下:

RMAN> RECOVER DATABASE;

启动 recover 于 18-10-19
使用通道 ORA_DISK_1
正在开始介质的恢复
介质恢复完成, 用时: 00:00:01

完成 recover 于 18-10-19

RMAN>

(4)、将还原好的数据库切换到OPEN状态完成对数据库的恢复工作。

RMAN> ALTER DATABASE OPEN;
数据库已打开

备注:以上的恢复命令可以使用RUN来批量执行

RMAN>RUN{
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN;
}

猜你喜欢

转载自blog.csdn.net/sinat_31633205/article/details/102602803