使用 RMAN 备份从对象存储恢复数据库

本文介绍了如何恢复存储在对象存储中的 Recovery Manager (RMAN) 备份。

Prerequisites

您需要以下各项:

假设

以下过程假定如下:

  • 已创建新的数据库系统来托管还原的数据库,并且新数据库系统上不存在其他数据库。可以还原到具有现有数据库的数据库系统,但该数据库系统超出了本主题的范围。
  • 原始数据库丢失,所有保留的都是最新的 RMAN 备份。该过程假定数据库系统(包括数据库)不再存在。

    注意:

    不包括在最近备份中的数据将丢失。
  • 原始数据库在上次备份时使用的 Oracle Wallet 和/或加密密钥可用。
  • RMAN 备份包含截至最新备份的控制文件和 spfile 的副本,以及执行完整数据库恢复所需的所有数据文件和归档日志备份。
  • 恢复期间不会使用 RMAN 目录。

在数据库系统上设置存储

  1. 通过 SSH 连接到数据库系统。
    ssh -i <private_key_path> opc@<db_system_ip_address>
  2. 以 opc 身份登录,然后 sudo 到 root 用户。使用带有连字符的 sudo su - 调用 root 用户的配置文件,该配置文件会将 PATH 设置为 dbcli 目录 (/opt/oracle/dcs/bin)。
    login as: opc
    sudo su -
  3. 您可以使用现有的空数据库主目录或创建新数据库主目录进行还原。使用适用的命令可帮助您完成此步骤。

    如果将使用现有数据库主目录:

    • 使用 Dbhome Commands 列出数据库主目录。

      dbcli list-dbhomes
      输出:
      ID                                       Name                 DB Version Home Location
      ---------------------------------------- -------------------- ---------- ---------------------------------------------
      2e743050-b41d-4283-988f-f33d7b082bda     OraDB12102_home1     12.1.0.2   /u01/app/oracle/product/12.1.0.2/dbhome_1
    • 使用数据库命令可确保数据库主目录不与任何数据库关联。

    如有必要,请使用 Dbhome Commands 创建用于恢复的数据库主目录。

  4. 使用Dbstorage Commands 设置 DATA、RECO 和 REDO 存储的目录。以下示例为 rectest 数据库创建 10GB ACFS 存储。
    dbcli create-dbstorage --dbname rectest --dataSize 10 --dbstorage ACFS 

    注意:

    恢复 11.2 版数据库时,必须指定 ACFS 存储。

执行数据库还原和恢复

  1. 通过 SSH 连接到数据库系统,以 opc 身份登录,然后成为 oracle 用户。
    sudo su - oracle
  2. /etc/oratab 中为数据库创建条目。使用与原始数据库相同的 SID。
    db1:/u01/app/oracle/product/12.1.0.2/dbhome_1:N
  3. 使用 oraenv 实用程序设置 ORACLE_HOMEORACLE_SID 环境变量。
    . oraenv
  4. 获取原始数据库的 DBID。可以从备份介质上的 controlfile 自动备份的文件名中获取此信息。文件名将包含一个包含 DBID 的字符串。字符串的典型格式为 c-DDDDDDDDDDDD-YYYYMMDD-NN,其中 DDDDDDDDDDDD 是 DBID,YYYYMMDD 是创建备份的日期,NN 是使文件名唯一的一个序列号。以下示例中的 DBID 为 1508405000。您的 DBID 会有所不同。

    使用以下 curl 语法对对象存储执行常规查询。红色参数与您在安装备份模块时指定的参数相同,如在数据库系统上安装备份模块使用 RMAN 将数据库备份到对象存储中所述。

    curl -u '<user_ID>.com:<auth_token>' -v https://swiftobjectstorage.<region_name>.oraclecloud.com/v1/<object_storage_namespace>

    要查找区域名称,请参阅区域和可用性域

    例如:

    curl -u 'djones@mycompany.com:1cnk!d0++ptETd&C;tHR' -v https://swiftobjectstorage.<region_name>.oraclecloud.com/v1/myobjectstoragenamespace

    要从控制文件名中获取 DBID,请使用以下语法:

    curl -u '<user_id>.com:<auth_token>' -v https://swiftobjectstorage.<region_name>.oraclecloud.com/v1/<object_storage_namespace>/<bucket_name>?prefix=sbt_catalog/c-

    例如:

    curl -u 'djones@mycompany.com:1cnk!d0++ptETd&C;tHR' -v https://swiftobjectstorage.<region_name>.oraclecloud.com/v1/myobjectstoragenamespace/dbbackups/?prefix=sbt_catalog/c-

    在下面的示例输出中,1508405000 是 DBID。

    {
        "bytes": 1732,
        "content_type": "binary/octet-stream",
        "hash": "f1b61f08892734ed7af4f1ddaabae317",
        "last_modified": "2016-08-11T20:28:34.438000",
        "name": "sbt_catalog/c-1508405000-20160811-00/metadata.xml"
    }
  5. 运行 RMAN 并连接到目标数据库。无需创建 pfilespfile 或使用备份 controlfile。将在以下步骤中恢复它们。请注意,目标数据库为 (not started)。这在这一点上是正常的。
    rman target /
    输出:
    Recovery Manager: Release 12.1.0.2.0 - Production on Wed Jun 22 18:36:40 2016
    Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.
    connected to target database (not started)
  6. 使用上面获取的值设置 DBID。
    set dbid 1508405000;
  7. 运行以下命令。如果服务器参数文件不可用,RMAN 将尝试使用虚拟服务器参数文件启动实例。ORA-01078 和 LRM-00109 错误是正常的,可以忽略。
    STARTUP NOMOUNT
    startup failed: ORA-01078: failure in processing system parameters
    LRM-00109: could not open parameter file '/u01/app/oracle/product/12.1.0.2/dbhome_1/dbs/initdb1.ora'
     
    starting Oracle instance without parameter file for retrieval of spfile
    Oracle instance started
     
    Total System Global Area    2147483648 bytes
     
    Fixed Size                     2944952 bytes
    Variable Size                847249480 bytes
    Database Buffers            1254096896 bytes
    Redo Buffers                  43192320 bytes
  8. 从自动备份恢复服务器参数文件。

    SBT_LIBRARY 是安装备份模块时使用 -libDir 参数指定的同一库,例如 /home/oracle/lib/

    OPC_PFILE 是安装备份模块时使用 -configfile 参数指定的同一文件,例如 /home/oracle/config

    set controlfile autobackup format for device type sbt to '%F';
    run {
      allocate channel c1 device type sbt PARMS  'SBT_LIBRARY=/home/oracle/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
      restore spfile from autobackup;
    }
  9. 为 audit_file_dest 创建目录。默认值为 /u01/app/oracle/admin/$ORACLE_SID/adump。可以通过搜索字符串 audit_file_dest 的 spfile 来查看原始数据库使用的设置。
    strings ${ORACLE_HOME}/dbs/spfile${ORACLE_SID}.ora | grep audit_file_dest
    *.audit_file_dest='/u01/app/oracle/admin/db1/adump'
     
    mkdir -p /u01/app/oracle/admin/db1/adump
  10. 如果在原始数据库上启用了块更改跟踪,请为块更改跟踪文件创建目录。这将是 db_create_file_dest 下的目录。在 spfile 中搜索目录的名称。
    strings ${ORACLE_HOME}/dbs/spfile${ORACLE_SID}.ora | grep db_create_file_dest
    *.db_create_file_dest='/u02/app/oracle/oradata/db1'
     
    mkdir -p /u02/app/oracle/oradata/db1/<$ORA_UNQNAME if available or database name>/changetracking
  11. 使用恢复的服务器参数文件重新启动实例。
    STARTUP FORCE NOMOUNT;
  12. 从 RMAN 自动备份恢复控制文件并挂载数据库。
    set controlfile autobackup format for device type sbt to '%F';
    run {
      allocate channel c1 device type sbt PARMS 'SBT_LIBRARY=/home/oracle/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
      restore controlfile from autobackup;
      alter database mount;
    }
  13. 还原和恢复数据库。
    RESTORE DATABASE;
    RECOVER DATABASE;
  14. RMAN 将使用归档重做日志进行恢复,直到找不到更多日志。当 RMAN 在备份中应用了最后一个归档重做日志并且找不到任何其他日志时,通常会出现类似于下面的错误。
    unable to find archived log
    archived log thread=1 sequence=29
    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of recover command at 06/28/2016 00:57:35
    RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 29 and starting SCN of 2349563
  15. 使用重置日志打开数据库。
    ALTER DATABASE OPEN RESETLOGS;

恢复已完成。自上次备份的归档重做日志以来,数据库将具有所有已提交的事务处理。