在 Windows 环境中保护和恢复 Oracle 数据库

准备工作

在 Windows 环境中发现、保护和挂载 Oracle 数据库之前,请务必检查以下事项:

  1. 请检查数据库服务器上的以下设置:

    1. Oracle 数据库和 Oracle Listener 已启动并正常运行(请检查 Windows 服务)。

    2. 确认是否存在名称为 SID 的 tns 条目。tnsnames.ora 文件位于

      %ORACLE_HOME%\network\admin
      
    3. 运行以下命令,验证 tns 条目是否有效:

      %ORACLE_HOME%\bin\tnsping <SID>
      
  2. 检查日志模式是否设置为归档日志模式:

    sql> archive log list
    

    如果数据库处于非归档日志模式,请将其恢复为归档日志模式:

    sql> shutdown immediate;
    sql> startup mount;
    sql> alter database archivelog;
    sql> alter database open;
    
  3. 启用数据库更改块跟踪。停用数据库 BCT 后,增量备份时间会受到影响。更改块跟踪功能在 Oracle 企业版中提供。运行 SQL 查询,检查是否已启用更改块跟踪。运行以下查询:

    sqlplus / as sysdba
    sql> select * from v$block_change_tracking;
    

如需启用更改块跟踪,请执行以下操作:

    sql> alter database enable block change tracking
    using file '<Oracle home directory>\orcl.bct';

在 Windows 环境中备份 Oracle 数据库

如需在 Windows 环境中备份 Oracle 数据库,请按以下步骤操作:

  1. 设置 Oracle 数据库的应用详细信息和设置

  2. 应用备份方案以保护数据库。

已知问题

在 Windows 上,Oracle 19c SQLPlus (sqlplus.exe) 在执行退出命令时偶尔会挂起(文档 ID 2820655.1)。 此 bug 仅适用于 Windows。Oracle 已确认 SQLPlus 版本 19.10、19.11 和 19.12 会出现此问题。Oracle 提供了以下解决方案:

  • 使用 SQL*Plus 21.1 或更高版本(或)
  • 应用补丁:31466370。此补丁适用于 19.11 和 19.13。

如果归档日志未通过备份和灾难恢复功能进行保护,则在 Windows 环境中使用 RMAN 手动将 Oracle 数据库恢复到定期备份点

如需在 Windows 环境中恢复整个 Oracle 数据库,请执行以下操作:

  1. 将数据库备份快照从备份和灾难恢复服务重新装载到 Oracle 服务器,如将 Oracle 数据库作为标准挂载点进行挂载中所详述。

  2. 使用 Backup and DR 已装载卷中的参数文件设置数据库环境,并在未装载状态下启动数据库(例如,将已装载的数据库卷挂载到 E:):

    sqlplus / as sysdba
    sql> startup nomount pfile='E:\<sid>___backup.ora';
    
  3. 通过 pfile 创建 spfile:

    sql> create spfile='%ORACLE_HOME%\database\spfile<sid>.ora'
    from pfile='E:\<sid>___backup.ora';
    
  4. 使用处于 nomount 状态的 spfile 启动数据库:

    sql> shutdown immediate;
    sql> startup nomount;
    
  5. 使用 RMAN 从已装载的备份和灾难恢复卷恢复控制文件:

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

    rman> alter database mount;
    
  7. 将数据文件和归档文件夹从已装载的备份和灾难恢复卷目录到 RMAN:

    rman> run
    {
    catalog start with 'E:\datafile' noprompt;
    catalog start with 'E:\archivelog' noprompt;
    }
    
  8. 恢复和恢复数据库:

    rman> run
    {
    restore database;
    recover database;
    }
    
  9. 使用“重置日志”选项打开数据库:

    rman> alter database open resetlogs;
    

使用 RMAN 在 Windows 环境中手动将 Oracle 数据库恢复到安排的备份时间点,并滚动前进受备份和灾难恢复保护的归档日志

  1. 从源数据库服务器挂载映像以进行恢复。将备份快照从备份和灾难恢复服务重新挂载到 Oracle 服务器,如将 Oracle 数据库作为标准挂载点挂载中所详述。

  2. 使用挂载的备份和灾难恢复卷中的参数文件设置数据库环境,并在未挂载状态下启动数据库。在此示例中,数据库备份映像挂载在 E:\ 下,受保护的归档日志挂载在 Z: 下。

       sqlplus / as sysdba
    
       startup nomount pfile='E:\<sid>___backup.ora';
    
  3. 通过 pfile 创建 spfile:

    sql> create spfile='%ORACLE_HOME%\database\spfile<sid>.ora' from
    pfile='E:\<sid>___backup.ora';
    
  4. 将 spfile 设为 nomount 状态,然后启动数据库:

    ```sql
    shutdown immediate;
    startup nomount;
    ```
    
  5. 使用 RMAN 从备份和灾难恢复挂载的归档日志映像恢复控制文件:

    ```rman
    rman target /
    rman> restore controlfile from 'Z:\cf-D_<sid>-id_<id>.ctl';
    ```
    
  6. 挂载数据库:

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

    ```rman
    rman> run
    {
    catalog start with 'E:\datafile' noprompt;
    catalog start with 'E:\archivelog' noprompt;
    catalog start with 'Z:\archivelog' noprompt;
    }
    ```
    
  8. 恢复和恢复数据库:

    ```rman
    rman> run
    {
    restore database;
    recover database;
    }
    ```
    

    如需恢复到特定时间点,请按如下方式运行 recover 命令:

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

    ```rman
    rman> alter database open resetlogs;
    ```
    

    数据库可读写。

监控脚本,用于监控数据库卷的挂载

如果您创建了应用感知型挂载,则可以使用监控脚本显示从备份和灾难恢复功能挂载的卷以及正在运行的 Oracle 进程。如需了解应用感知型挂载,请参阅将 Oracle 数据库作为虚拟应用挂载

执行应用感知型挂载时,您可以使用此监控脚本。脚本位置必须为:C:\Program Files\Backup and DR\scripts。在 Windows 主机上运行的脚本必须是 .bat 或 .vbs 文件。

    ```Windows
    @echo off
    :loop
    echo. > watchtemp
    echo ------------------ >> watchtemp
    echo  Oracle Processes >> watchtemp
    echo ------------------ >> watchtemp
    tasklist /svc | findstr oracle >> watchtemp
    echo. >> watchtemp
    echo ------------------ >> watchtemp
    echo   Backup and DR Mounts >> watchtemp
    echo ------------------ >> watchtemp
    wmic volume get label, name | findstr Backup and DR >> watchtemp
    echo. >> watchtemp
    cls
    type watchtemp
    timeout 2 > null
    goto loop
    ```

这会生成如下所示的输出:

    Oracle Processes
    ------------------
    oracle.exe                    1492 OracleServiceORCL
    oracle.exe                    3768 OracleServiceTestDB
    oracle.exe                     872 OracleServiceTestDB2
    ------------------
      Backup and DR Mounts
    ------------------
    Backup and DR-Backup-ORCL    D:\mount_1