恢复 Oracle 数据库

使用管理控制台恢复数据库

还原到原始数据库会将原始生产应用数据替换为指定的时间点映像。此恢复会导致所有当前应用数据丢失,因为应用会恢复到创建映像时所处的状态。此操作无法撤消。完成恢复操作所需的时间取决于涉及的数据量。您还可以将数据库恢复到其他目标平台

按照以下说明从管理控制台自动使用 RMAN 恢复 Oracle 数据库,并覆盖原始生产数据库。

  1. 打开管理控制台,进入应用管理器,然后输入数据库应用名称,或使用过滤条件查找所需的数据库映像。

  2. 右键点击该应用,然后选择访问

  3. 访问页面上,选择一个映像,然后点击装载菜单下的恢复

  4. 恢复页面上,选择传统(而非“装载并迁移”)。

  5. 使用恢复范围滑块选择要恢复数据库的特定时间点。将滑块工具滑动到最左侧,以仅恢复未应用日志的数据库。

  6. 用户名中,输入所选目标服务器上的 Oracle 软件所有者。

  7. 对于“通道数量”,请指定 RMAN 通道数量,以便为数据库恢复配置并行处理。

  8. 点击提交

  9. 系统随即会显示一个警告对话框。阅读并输入 DATA LOSS 进行确认。

  10. 作业将排队等待下一个可用作业槽位。您可以通过 Job Monitor 查看进度。

使用管理控制台将数据库恢复到任何目标

按照以下说明,使用管理控制台中的 RMAN 将 Oracle 数据库恢复到新目标。

  1. App Manager(应用管理器)> Applications(应用)列表中,右键点击数据库,然后选择 Access(访问)。
  2. 选择要恢复的备用映像,然后选择恢复
  3. 在“恢复”页面上,选择传统

    • 目标位置:对于所有配置,您都可以从下拉菜单中选择所有符合条件的 Oracle 数据库服务器。从下拉菜单中选择恢复的目标服务器。
    • 替换原始应用 ID:仅当恢复到备份最初生成的同一设备上的新服务器时,此选项才可用。
    • :这会替换原始应用,并且与原始应用具有相同的应用 ID、作业历史记录、备份映像和备份方案。
    • :这不会取代原始应用。在恢复作业中,系统会将新数据库发现为新应用。
    • 滚动时间:为使用日志保护的数据库选择日期和时间,以恢复到所需的时间点。
    • 应用选项

      • DATABASESID:此字段会预先填充受保护的数据库 SID 名称,且不可更改。
      • USERNAME:此字段会预先填充源数据库 Oracle 软件所有者。如果所选目标服务器上的 Oracle 软件所有者不同,请更新 USERNAME
      • ORAHOME:此字段会预先填充源数据库 Oracle 主路径。如果所选目标服务器上的 Oracle 主目录不同,请更新 Oracle 主目录。
      • 高级选项:系统会预先填充此选项,并在备份时显示源中所有数据库参数设置(来自 pfile)。确保参数值适用于要恢复的目标数据库服务器(源数据库或新目标数据库)。
  4. 映射选项

    • 目标数据库类型:从下拉列表中为数据库选择数据库目标类型(ASM 磁盘组或文件系统)。ASM 格式的备份映像不支持文件系统目标类型。

      源数据库 备用图片格式 恢复目标
      ASM ASM ASM
      ASM 文件系统 ASM
      文件系统 文件系统 文件系统
    • 从下拉列表中为数据库的三种文件类型(数据文件、控制文件和重做文件)选择目标 ASM 磁盘组和文件系统映射。

  5. 点击预发布检查。如果预检检查失败,请解决问题,然后再次运行预检检查。

  6. 点击提交以提交恢复作业。

使用 RMAN 手动恢复 Oracle 数据库

如需手动恢复 Oracle 数据库,请参阅以下步骤。

非 RAC、非 ASM、文件系统

恢复数据文件位于文件系统中且受基于文件的暂存磁盘格式保护的 Oracle 数据库

  1. 从受保护的源数据库挂载映像。

    挂载窗口的映射选项中,为映像提供挂载位置,例如:/acttestdb。如需了解如何挂载数据库映像,请参阅挂载在文件系统下受保护的 Oracle 数据库映像以进行数据访问

    数据库备份映像挂载在:/acttestdb

    受保护的归档日志挂载在:/acttestdb_Log

  2. 设置 Oracle 环境,然后使用 sqlplus 关闭数据库:

    sqlplus / as sysdba
    sql> shutdown immediate;
    

    验证数据库是否已关闭。结束数据库的所有剩余进程。

    ps -ef | grep <var>database sid</var>
    
  3. 使用已装载卷中的备份参数文件,在未挂载状态下启动数据库。备份参数文件位于顶部挂载的文件夹下,例如 /acttestdb

  4. 设置 Oracle 环境,并使用 sqlplus 启动数据库:

    sqlplus / as sysdba
    sql> startup nomount pfile='/acttestdb/<var>database_sid</var>___backup.ora';
    
  5. 从现有 pfile 创建新的 spfile,然后重启数据库。

    从 pfile 创建 spfile:

    sql> create spfile='$ORACLE_HOME/dbs/spfile_<var>database sid</var>.ora' from pfile='/acttestdb/<var>database sid</var>___backup.ora';
    

    将 spfile 重启为 nomount 状态,然后重启数据库:

    sql> shutdown immediate;
    sql> startup nomount;
    
  6. 使用 RMAN 从备份和灾难恢复已装载的归档日志映像恢复控制文件。使用已挂载日志映像中的最新控制文件,例如:

       /acttestdb_Log/cf D_<var>sid</var>-id_<var>id</var>.ctl
    

    或者,如果有多个日志图片:

       /acttestdb_Log_1/cf-D_<var>sid</var>-id_<var>id</var>.ctl
    
        rman target /
        rman> restore controlfile from '/acttestdb_Log_1/cf-D_<var>sid</var>-id_<var>id</var>.ctl' ;
    
  7. 挂载数据库:

        rman> alter database mount;
        ```
    
    1. Catalog the datafile and archivelog folder from Backup and DR mounted
     database image and archive log image to RMAN
    
       ```rman
        rman> run { catalog start with '/acttestdb/datafile' noprompt;
        catalog start with '/acttestdb/archivelog' noprompt;
        catalog start with '/acttestdb_Log' noprompt;}
      ```
    
    1. Restore and recover the database:
    
       ```rman
        rman> run { restore database ; recover database; }
    

    如需恢复到特定时间点,请使用 yyyymmddhh24mi 格式:

        rman> run
        {
        restore database;
        recover database until time "to_date('<var>required timestamp</var>>','yyyymmddhh24mi')";
        }
    
    1. 使用“重置日志”选项打开数据库。

      • 对于主数据库恢复:
           rman> alter database open resetlogs;
      
      • 对于 Data Guard 备用数据库恢复,请启动 Data Guard 管理的恢复流程:
           rman> alter database recover managed standby database nodelay disconnect;
      

    数据库可读写。

RAC 或独立 ASM、文件系统

恢复在 ASM 磁盘组上具有数据文件且受基于文件的暂存磁盘格式保护的 Oracle 数据库

  1. 从受保护的源数据库挂载映像。

    在“挂载”窗口的“映射选项”下,为映像提供挂载位置,例如:/acttestdb。如需了解如何挂载数据库映像,请参阅挂载在文件系统下受保护的 Oracle 数据库映像以进行数据访问

    数据库备份映像已挂载到挂载位置:/acttestdb

    受保护的归档日志挂载在:/acttestdb_Log

  2. 关闭 Oracle 数据库。在节点 1 上,su 到 Oracle OS 用户:

    su - oracle

    设置 Oracle 环境,然后使用 srvctl 停止所有节点上的数据库:

    srvctl stop database -d <var>database_name</var>

    验证数据库是否已关闭(所有节点)。结束数据库的所有剩余进程。

    ps -ef | grep <var>database_name</var>

  3. 使用已装载卷中的备份参数文件,在未挂载状态下启动数据库。备份参数文件位于顶部挂载的文件夹下,例如 /acttestdb

  4. 设置 Oracle 环境,并使用 sqlplus 启动数据库:

    sqlplus / as sysdba
    
    sql> startup nomount pfile='/acttestdb/<var>database_name</var>___backup.ora';
    
  5. 创建新的 spfile 并重启数据库。

    如需获取磁盘组下原始 spfile 的路径,请执行以下操作:

    cat $ORACLE_HOME/dbs/init{database sid}.ora

    例如:spfile=+{preferred disk group}/db_name/spfiledb_name.ora`

      sql> create spfile='+{preferred disk group}/{db
      name}/spfile<var>db_name</var>.ora' from pfile='/acttestdb/<var>db_name</var>___backup.ora';
    

    将 spfile 重启为 nomount 状态,然后重启数据库:

      sql> shutdown immediate;
    
      sql> startup nomount;
    
  6. 使用 RMAN 从备份和灾难恢复挂载的归档日志映像恢复控制文件。使用以下位置中的最新控制文件

    Log mounted image, for example:<br> /acttestdb_Log/cf-D_<var>db_name</var>-id_<var>db_id</var>.ctl
    

    或存在多个日志 image:<br> /acttestdb_Log_1/cf-D_<var>db_name</var>-id_<var>db_id</var>.ctl

     rman target /
    
     rman> restore controlfile from '/acttestdb_Log_1/cf-D_<var>db_name</var>-id_<var>db_id</var>.ctl' ;
     ```
    
  1. 挂载数据库:

    rman> alter database mount;

  2. 将备份和灾难恢复挂载的数据库映像和归档日志映像中的数据文件和归档日志文件夹目录到 RMAN:

     rman> run { catalog start with '/acttestdb/datafile' noprompt;
     catalog start with '/acttestdb/archivelog' noprompt;
     catalog start with '/acttestdb_Log' noprompt;}
    
  3. 恢复和恢复数据库:

    rman> run { restore database ; recover database; }

    如需恢复到特定时间点,请使用 yyyymmddhh24mi 格式:

     rman> run
     {
     restore database;
     recover database until time "to_date('<var>timestamp</var>','yyyymmddhh24mi')";
     }
    
  4. 使用“重置日志”选项打开数据库。

    • 对于主数据库恢复:

    rman> alter database open resetlogs;

    RAC 配置在重置日志后需要执行另一个步骤:关闭节点 1 上的数据库,然后在所有节点上启动数据库。

    使用 sqlplus 关闭数据库:

     sqlplus / as sysdba
    
     SQL> shutdown immediate;
    

    使用 srvctl 在所有节点上启动数据库:

     srvctl start database -d <var>database_name</var> 
    
    • 对于 Data Guard 备用数据库恢复:

      • 对于非 RAC 配置:启动 Data Guard 管理的恢复流程

        RMAN> alter database recover managed standby database nodelay disconnect;

      • 对于 RAC 配置:关闭节点 1 上的数据库,并在所有节点上以已装载状态启动数据库。

        1. 使用 sqlplus 关闭数据库:

          sqlplus / as sysdba
          SQL> shutdown immediate;
          
        2. 使用 srvctl 在所有节点上以挂载状态启动数据库:

          srvctl start database -d <var>database_name</var> -o mount
          
        3. 启动 Data Guard 管理的恢复流程:

          rman> alter database recover managed standby database nodelay disconnect;
          

数据库可读写。

RAC 或独立 ASM、ASM 磁盘组

恢复在 ASM 磁盘组上具有数据文件且受 ASM 磁盘组暂存磁盘格式保护的 Oracle 数据库

  1. 从受保护的源数据库挂载映像。在“Mount”窗口中,为 RAC 节点 1 上的 ASM 下的映像挂载提供首选磁盘组。如需详细了解如何挂载数据库映像,请参阅挂载受 ASM 磁盘组保护的 Oracle 数据库映像以进行数据访问

    例如,在挂载屏幕上:

    • 选择主机:RAC 节点 1 数据库服务器

    • 首选磁盘组:acttestdg

    • RAC 节点列表:RAC 节点 1 的 IP 地址

      备份参数文件会复制到 /act/touch/<var>preferred_disk_group</var>/ 下,例如:

      /act/touch/acttestdg/<var>database_name</var>___backup.ora

  2. 关闭 Oracle 数据库。

    在节点 1 上,su 到 Oracle OS 用户:

     su - oracle
    

    设置 Oracle 环境。使用 srvctl 停止所有节点的数据库:

     srvctl stop database -d <var>database_name</var>
    

    验证数据库是否已关闭(在所有节点上)。结束数据库的所有剩余进程。

    ps -ef | grep <var>db_name</var>
    
  3. 使用复制到 /act/touch/acttestdg 下的备份参数文件,在未挂载状态下启动数据库。

  4. 设置 Oracle 环境。使用 sqlplus 启动数据库:

    ```
    sqlplus / as sysdba
    
    sql> startup nomount pfile='/act/touch/acttestdg/<var>db_name</var>___backup.ora';
    ```
    
  5. 创建新的 spfile 并重启数据库。

    如需获取磁盘组下原始 spfile 的路径,请执行以下操作:

     `cat $ORACLE_HOME/dbs/init(database sid).ora`
    

    例如:spfile=+preferred disk group/db_name/spfiledb_name.ora

         sql> create spfile='+<var>preferred disk group</var>/<var>db_name</var>/spfile<var>db_name</var>.ora' from pfile='/act/touch/acttestdg/<var>db_name</var>___backup.ora';
    

    将 spfile 重启为 nomount 状态,然后重启数据库:

     ```
     sql> shutdown immediate;
     sql> startup nomount;
     ```
    
  6. 使用 RMAN 从备份和灾难恢复挂载的归档日志映像恢复控制文件。 使用已挂载日志映像中的最新控制文件,例如:
    /acttestdb_Log/cf-D_<var>db_name</var>-id_<var>db_id</var>.ctl 或者如果存在多个日志映像:
    /acttestdb_Log_1/cf-D_<var>db_name</var>-id_<var>db_id</var>.ctl

     ```
     rman target /
     rman> restore controlfile from '/acttestdg_Log_1/cf-D_<var>db_name</var>-id_<var>db_id</var>.ctl' ;
     ```
    
  7. 挂载数据库:

     rman> alter database mount;
    
  8. 将备份和灾难恢复挂载的数据库映像和归档日志映像中的数据文件和归档日志文件夹目录到 RMAN:

     ```
     rman> run { catalog start with '+acttestdg/<var>db_name</var>/datafile' noprompt;
     catalog start with '+acttestdg/<var>db_name</var>/archivelog' noprompt;
     catalog start with '/acttestdg_Log' noprompt;}
     ```
    
  9. 恢复和恢复数据库:

     rman> run { restore database ; recover database ; }
    

    如需进行特定时间点恢复,请按如下所示运行 recover 命令:

     ```
     rman> run
     {
     restore database;
     recover database until time "to_date('<var>timestamp</var>','yyyymmddhh24mi')";
     }
     ```
    
  10. 使用“重置日志”选项打开数据库。

    • 对于主数据库恢复:

      rman> alter database open resetlogs;

      RAC 配置需要执行另一个步骤:重置日志后,关闭节点 1 上的数据库,并在所有节点上启动数据库。 使用 sqlplus 关闭数据库:

       sqlplus / as sysdba
      
       SQL> shutdown immediate;
      

      使用 srvctl 在所有节点上启动数据库:

       srvctl start database -d <var>database_name</var> 
      
    • 对于 Data Guard 备用数据库恢复:

      • 对于非 RAC 配置:启动 Data Guard 管理的恢复流程:

        rman> alter database recover managed standby database nodelay disconnect;
        
      • 对于 RAC 配置:关闭节点 1 上的数据库,并在所有节点上以已装载状态启动数据库。

        1. 使用 sqlplus 关闭数据库:

          sqlplus / as sysdba
          SQL> shutdown immediate;
          
        2. 使用 srvctl 在所有节点上以挂载状态启动数据库:

          srvctl start database -d <var>database_name</var> -o mount
          
        3. 启动 Data Guard 管理的恢复流程:

          rman> alter database recover managed standby database nodelay disconnect;
          

    数据库可读写。

恢复 Oracle 表空间和数据文件

如需恢复单个表空间数据文件(例如,由于数据损坏),请执行以下操作:

  1. 将备份/恢复设备中的最新数据库快照重新挂载到 Oracle 服务器。

  2. 将数据库备份快照编入 RMAN 目录。

  3. 使用备份快照恢复和恢复表空间,详情请参阅此处。

在 ASM 磁盘组上恢复生产数据库的单个表空间

如需将生产数据库的单个表空间恢复到主节点,请执行以下操作:

  1. 将 Oracle 数据库作为标准挂载点挂载中所详述,挂载数据库时间点快照。

  2. 在“挂载”窗口的“映射选项”下,为映像提供挂载位置。例如,对于 ASM 磁盘组下的映像,请在“首选磁盘组”下提供磁盘组名称;对于文件系统下的映像,请提供挂载位置,例如 /acttestdb

  3. 在主节点上,以 Oracle OS 用户身份登录数据库服务器。

  4. 设置数据库环境并登录 RMAN:

    rman target /
    
  5. 在 RMAN 提示符中,为备份数据文件和归档日志文件夹编制目录:

    示例:在 ASM 磁盘组下保护的数据库映像:(已挂载的 ASM 磁盘组名称“+ acttestdg”):

    ```rman
    rman> catalog start with '+acttestdg/<var>db_name</var>/datafile' noprompt;
    rman> catalog start with '+acttestdg/<var>db_name</var>/archivelog' noprompt;
    rman>catalog start with &#8216;/<var>mountpoint_log</var>'; noprompt;
    (If archivelogs are protected by Backup and DR)
    ```
    

    示例:在文件系统(已挂载的文件系统名称为“/acttestdb”)下保护的数据库映像:

    ```rman
    rman> catalog start with '/acttestdb/datafile' noprompt;
    rman> catalog start with '/acttestdb/archivelog'
    noprompt;
    rman> catalog start with '/acttestdb_log/archivelog' noprompt;
    ```
    
    (If archivelogs are protected by Backup and DR)
    

    现在,您可以运行所有 RMAN 恢复命令,例如:

  6. 完成后,卸载并删除映像。

恢复表空间

如需恢复表空间,请执行以下操作:

    ```rman
    rman> restore tablespace <var>tablespace name</var>;
    rman> recover tablespace <var>tablespace name</var>;
    ```

恢复数据文件

如需恢复数据文件,请执行以下操作:

    ```rman
    rman> restore datafile <var>file#</var>;
    rman> recover datafile <var>file#</var>;
    ```

恢复损坏的数据库块

如需恢复损坏的数据库块,请执行以下操作:

  1. 将 Oracle 数据库作为标准挂载点挂载中所述,挂载数据库时间点快照。

  2. 挂载窗口的映射选项中,为映像提供挂载位置。例如,对于 ASM 磁盘组中的映像,请在“首选磁盘组”下提供磁盘组名称;对于文件系统中的映像,请提供挂载位置,例如 /acttestdb。

  3. 在主节点上,以 Oracle OS 用户身份登录数据库服务器。

  4. 设置数据库环境并登录 sqlplus,然后查询 v$database_block_corruption 以检查损坏的块:

    ```sh
    sqlplus / as sysdba
    sql> SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
    ```
    
  5. 登录 RMAN 以恢复所有损坏的块:

    ```rman
    rman target /
    rman> RECOVER CORRUPTION LIST;
    ```
    

    恢复这些块后,数据库会将其从 V$DATABASE_BLOCK_CORRUPTION 中移除。

  6. 如需恢复单个损坏的块(例如数据文件 8 和块 13),请执行以下操作:

    通过 RMAN 提示

    ```rman
    RMAN> recover datafile 8 block 13;
    ```
    

恢复丢失的控制文件

如需恢复丢失的控制文件,请执行以下操作:

  1. 将 Oracle 数据库作为标准挂载点挂载中所述,挂载数据库时间点快照。

  2. 挂载窗口的映射选项中,为映像提供挂载位置。例如,对于 ASM 磁盘组下的映像,请在“首选磁盘组”下提供磁盘组名称;对于文件系统下的映像,请提供装载位置(例如 /acttestdb)。

  3. 在主节点上,以 Oracle OS 用户身份登录数据库服务器。

  4. 设置数据库环境并登录 sqlplus,然后关闭数据库并在 nomount 状态下启动:

    对于独立数据库:

    ```sql
    sqlplus / as sysdba
    sql> shutdown immediate;
    sql> startup nomount;
    ```
    

    对于 RAC 数据库,从已挂载的映像节点关闭所有节点中的数据库:

    ```sh
    srvctl stop database -d <var>db_name</var>
    sql> startup nomount;
    ```
    
  5. 从备份和灾难恢复挂载的映像恢复控制文件。

    例如:/acttestdb(文件系统)和 +acttestdg(适用于 ASM)

    ```rman
    rman target /
    rman> restore controlfile
    from '/acttestdb/cf-D_<var>db_name</var>-id_<var>db_id</var>.ctl' ; (Filesystem
    mount)
    rman> restore controlfile
    from '+acttestdb/cf-D_<var>db_name</var>-id_<var>db_id</var>.ctl' ; (ASM
    mount)
    ```
    
  6. 通过 sqlplus 挂载并打开数据库:

    ```sql
    sqlplus / as sysdba
    sql> alter database mount;
    sql> recover database until cancel;
    sql> alter database open resetlogs;
    ```
    

恢复 Oracle 可插拔数据库

如需恢复 Oracle 12c 或更高版本的可插入数据库 (PDB),请执行以下操作:

  1. 从源数据库服务器挂载映像以进行恢复。在 Mount 窗口中,为 RAC 节点 1 上的 ASM 下映像挂载提供首选磁盘组。如需详细了解如何挂载数据库映像,请参阅挂载受 ASM 磁盘组保护的 Oracle 数据库映像以进行数据访问

  2. 关闭可插拔数据库:

    1. 从节点 1 的 su 到 Oracle 用户

      su - oracle

    2. 设置 Oracle 环境。以“sysdba”用户身份连接到 Oracle 数据库:

         sqlplus / as sysdba
         SQL> alter pluggable database <var>pluggable_db_name</var> close;
      
  3. 将备份和灾难恢复挂载的数据库映像和归档日志映像中的数据文件和归档日志文件夹目录到 RMAN:

        rman> run { catalog start with '+acttestdg/<var>db_name</var>/datafile' noprompt;
        catalog start with '+acttestdg/<var>db_name</var>/archivelog' noprompt;
        catalog start with '/acttestdg_Log' noprompt;
        }
    
  4. 恢复和恢复可插拔数据库

        rman> run
        {
        restore pluggable database <var>pluggable_db_name</var>;
        recover pluggable database <var>pluggable_db_name</var> until time "to_date('<var>required time stamp</var>>';,';yyyymmddhh24mi')";
        }
    
  5. 打开可插拔数据库:

        rman> alter pluggable database <var>pluggable_db_name</var> open;
    

可插拔数据库处于可读写状态。

Oracle DBA 指南