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

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

先决条件

您将需要以下信息:

假设

以下过程假定如下:

在数据库系统上设置存储

  1. 通过 SSH 连接到数据库系统。

    ssh -i <private_key_path> opc@<db_system_ip_address>
  2. 以 opc 身份登录,然后向 root 用户执行 sudo。使用带有连字符的 sudo su - 调用 root 用户的配置文件,该配置文件将 PATH 设置为 dbcli 目录 (/opt/oracle/dcs/bin)。

    login as: opc
    sudo su -
  3. 可以使用现有的空数据库主目录或为还原创建新的主目录。使用适用的命令可帮助您完成此步骤。

    如果要使用现有数据库主目录,请执行以下操作:

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

      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_HOME 和 ORACLE_SID 环境变量。

    . oraenv
  4. 获取原始数据库的 DBID。这可以从备份介质上的 controlfile 自动备份的文件名中获取。文件名将包括包含 DBID 的字符串。字符串的典型格式为 c-DDDDDDDDDDDD-YYYYMMDD-NN,其中 DDDDDDDDDDDD 是 DBID,YYYYMMDD 是创建备份的日期,NN 是使文件名唯一的序列号。以下示例中的 DBID 为 1508405000。您的 DBID 将有所不同。

    使用以下 curl 语法对对象存储执行一般性查询。红色参数与安装备份模块时指定的参数相同,如 Back Up a Database to Object Storage Using RMAN 中的 Installing the Backup Module on the DB System 中所述。

    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 并连接到目标数据库。无需创建 pfile 或 spfile 或使用备份 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。您可以通过搜索字符串的 spfile audit_file_dest 来查看原始数据库使用的设置。

    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. 用 resetlogs 打开数据库。

    ALTER DATABASE OPEN RESETLOGS;

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