从 OCI 经典对象存储恢复数据库

本文介绍了如何使用由 Oracle Database Backup Module 创建并存储在 Oracle Cloud Infrastructure Object Storage Classic 中的备份来恢复数据库。

本主题中使用了以下术语:

  • 源数据库:经典对象存储中的数据库备份。
  • 目标数据库:Oracle Cloud Infrastructure 中数据库系统上的新数据库。

Prerequisites

您需要以下各项:

  • Oracle Cloud Infrastructure Object Storage Classic 的服务名、身份名称、容器、用户名和密码。
  • 备份到经典对象存储时使用基于密码的加密时的备份密码。
  • 源数据库 ID、数据库名称、数据库唯一名称(设置存储时必需)。
  • 如果源数据库配置有透明数据加密 (Transparent Data Encryption,TDE),则需要 Wallet 和 Wallet 口令的备份。
  • 要为任何数据库链接设置的 Tnsnames。
  • 源数据库 Oracle_home 的 Opatch lsinventory 输出供参考。
  • 源数据库主目录中的 sqlpatch 目录的副本。如果目标数据库不包括这些补丁程序,则回退需要执行此操作。

在数据库系统上设置存储

  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. 使用Dbstorage Commands 设置 DATA、RECO 和 REDO 存储的目录。以下示例为 tdetest 数据库创建 10GB ACFS 存储。
    dbcli create-dbstorage --dbname tdetest --dataSize 10 --dbstorage ACFS 

    注意:

    迁移 11.2 版数据库时,必须指定 ACFS 存储。
  4. 使用Dbstorage Commands 列出存储 ID。您将需要下一个步骤的 ID。
    dbcli list-dbstorages
    输出:
    ID                                       Type   DBUnique Name        Status
    ---------------------------------------- ------ -------------------- ----------
    9dcdfb8e-e589-4d5f-861a-e5ba981616ed     Acfs   tdetest              Configured
  5. 使用 Dbstorage Commands 和上一步中的存储 ID 列出 DATA、RECO 和 REDO 位置。
    dbcli describe-dbstorage --id 9dcdfb8e-e589-4d5f-861a-e5ba981616ed
    输出:
    DBStorage details
    ----------------------------------------------------------------
                         ID: 9dcdfb8e-e589-4d5f-861a-e5ba981616ed
                    DB Name: tdetest
              DBUnique Name: tdetest
             DB Resource ID:
               Storage Type: Acfs
              DATA Location: /u02/app/oracle/oradata/tdetest
              RECO Location: /u03/app/oracle/fast_recovery_area/
              REDO Location: /u03/app/oracle/redo/
                      State: ResourceState(status=Configured)
                    Created: August 24, 2016 5:25:38 PM UTC
                UpdatedTime: August 24, 2016 5:25:53 PM UTC 
  6. 记下 DATA、RECO 和 REDO 位置。您以后需要这些参数来设置数据库的 db_create_file_destdb_create_online_log_destdb_recovery_file_dest 参数。

选择 ORACLE_HOME

确定要用于数据库恢复的 ORACLE_HOME,然后使用正确的 ORACLE_BASE、ORACLE_HOME 和 PATH 设置切换到该主目录。ORACLE_HOME 必须尚未与数据库关联。

要获取现有 ORACLE_HOMEs 的列表并确保 ORACLE_HOME 为空,请分别使用 Dbhome CommandsDatabase Commands 。要创建新的 ORACLE_HOME,请使用 Dbhome Commands

复制源数据库 Wallet

如果源数据库配置有 TDE,请跳过此部分。

  1. 在数据库系统上,成为 oracle 用户:
    sudo su - oracle
  2. 创建以下目录(如果尚不存在):
    mkdir /opt/oracle/dcs/commonstore/wallets/tde/<db_unique_name>
  3. 将 ewallet.p12 文件从源数据库复制到上一步中创建的目录。
  4. 在目标主机上,确保 $ORACLE_HOME/network/admin/sqlnet.ora 包含以下行:
    ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME)))

    如果该行在文件中不存在,请添加该行。(如果这是新主目录且尚未在此主机上创建数据库,则该行可能不存在。)

  5. 从基于密码的 wallet 创建自动登录 wallet,以允许在还原和恢复操作期间自动打开 wallet。

    对于版本 12.1 或更高版本的数据库,请使用 ADMINISTER KEY MANAGEMENT 命令:

    $cat create_autologin_12.sh
    
    #!/bin/sh
    if [ $# -lt 2 ]; then
            echo "Usage: $0 <dbuniquename><remotewalletlocation>"
            exit 1;
    fi
    
    mkdir /opt/oracle/dcs/commonstore/wallets/tde/$1
    cp $2/ewallet.p12* /opt/oracle/dcs/commonstore/wallets/tde/$1
    rm -f autokey.ora
    echo "db_name=$1"  > autokey.ora
    autokeystoreLog="autologinKeystore_`date +%Y%m%d_%H%M%S_%N`.log"
    echo "Enter Keystore Password:"
    read -s keystorePassword
    echo "Creating AutoLoginKeystore -> "
    sqlplus "/as sysdba"  <<EOF
    spool $autokeystoreLog
    set echo on
    startup nomount pfile=autokey.ora
    ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE
    FROM KEYSTORE '/opt/oracle/dcs/commonstore/wallets/tde/$1' -- Keystore location
    IDENTIFIED BY "$keystorePassword";
    shutdown immediate;
    EOF

    cwallet.sso 权限从 oracle:asmadmin 调整为 oracle:oinstall

    ls -ltr /opt/oracle/dcs/commonstore/wallets/tde/<db_unique_name>
    输出:
    total 20
    -rw-r--r-- 1 oracle oinstall 5680 Jul  6 11:39 ewallet.p12
    -rw-r--r-- 1 oracle asmadmin 5725 Jul  6 11:39 cwallet.sso

    对于 11.2 版数据库,请使用 orapki 命令:

    orapki wallet create -wallet wallet_location -auto_login [-pwd password]

安装 Oracle Database 备份模块

数据库系统中包括备份模块 JAR 文件,但您需要安装它。

  1. 通过 SSH 连接到数据库系统,以 opc 身份登录,然后成为 oracle 用户。
    ssh -i <path to SSH key used when launching the DB System> opc@<DB System IP address or hostname>
    sudo su - oracle
  2. 转到包含备份模块 opc_install.jar 文件的目录。
    cd /opt/oracle/oak/pkgrepos/orapkgs/oss/<version>/
  3. 要安装备份模块,请参见 Using Oracle Database Backup Cloud Service 中的 Installing the Oracle Database Cloud Backup Module for OCI Classic 中所述的命令语法。

设置环境变量

为数据库的 RMAN 和 SQL*Plus 会话设置以下环境变量:

ORACLE_HOME=<path of Oracle Home where the database is to be restored>
ORACLE_SID=<database instance name>
ORACLE_UNQNAME=<db_unique_name in lower case>
NLS_DATE_FORMAT="mm/dd/yyyy hh24:mi:ss"

分配 RMAN SBT 通道

对于每个恢复操作,分配一个 SBT 通道并将 SBT_LIBRARY 参数设置为 libopc.so 文件的位置,将 OPC_FILE 参数设置为 opc_sbt.ora 文件的位置,例如:

ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/<ORACLE_HOME>/dbs/opc_sbt.ora)';

有关这些文件的更多信息,请参阅使用 Oracle Database Backup Cloud Service 中的安装适用于经典 OCI 的 Oracle Database Cloud 备份模块时创建的文件

确保打开解密

确保为所有 RMAN 还原会话打开解密。

set decryption wallet open identified by <keystore password>;

有关更多信息,请参见 Providing the Password Required to Decrypted Backups

恢复 Spfile

以下样例 shell 脚本将恢复 spfile。将 $dbID 变量设置为要还原的数据库的 dbid。默认情况下,spfile 恢复为 $ORACLE_HOME/dbs/spfile<sid>.ora

rman target / <<EOF

spool log to "`date +%Y%m%d_%H%M%S_%N`_dbid_${dbID}_restore_spfile.log"
startup nomount
set echo on
run {
ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
SET DBID=$dbID;
RESTORE SPFILE FROM AUTOBACKUP;
shutdown immediate;
EOF

设置数据库参数

  1. 以不装载模式启动数据库。
    startup nomount
  2. 更新 spfile 并修改以下参数。
    • 如果数据库存储类型为 ACFS,请使用从 dbcli describe-dbstorage 命令输出中获取的 DATA、RECO 和 REDO 位置,如 Set Up Storage on the DB System 中所述:

      alter system set db_create_file_dest='/u02/app/oracle/oradata/' scope = spfile;
      alter system set db_create_online_log_dest_1='/u03/app/oracle/redo' scope = spfile;
      alter system set db_recovery_file_dest='/u03/app/oracle/fast_recovery_area' scope = spfile;
    • 如果数据库存储类型为 ASM:

      alter system set db_create_file_dest='+DATA' scope = spfile;
      alter system set db_create_online_log_dest_1='+RECO' scope = spfile;
      alter system set db_recovery_file_dest='+RECO' scope = spfile;
    • 设置 db_recovery_file_dest_size 未设置或设置不正确:

      alter system set db_recovery_file_dest_size=<sizeG> scope=spfile;
    • audit_file_dest 设置为正确的值:

      alter system set audit_file_dest=/u01/app/oracle/admin/<db_unique_name in lower case>/adump
  3. 删除 control_files 参数。Oracle Managed Files (OMF) 参数将用于创建控制文件。
    alter system reset control_files scope=spfile;
  4. 使用新添加的参数以命名模式重新启动数据库。
    shutdown immediate
    startup nomount

恢复控制文件

为您的环境修改以下 shell 脚本样例以恢复控制文件。将 $dbID 变量设置为要还原的数据库的 dbid。安装备份模块时,将 SBT_LIBRARY 设置为 -libDir 参数中指定的位置。将 OPC-PFILE 设置为 -configFile 参数中指定的位置,该参数默认为 ORACLE_HOME/dbs/opcSID.ora

rman target / <<EOF

spool log to "`date +%Y%m%d_%H%M%S_%N`_dbid_${dbID}_restore_controlfile.log"
set echo on
run {
ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/<Backup Module libDir>/libopc.so ENV=(OPC_PFILE=/<Backup Module configFile>/opcSID.ora)';
SET DBID=$dbID;
RESTORE CONTROLFILE FROM AUTOBACKUP;
alter database mount;
}

exit;
EOF

还原数据库

  1. 预览并验证备份。数据库现在已挂载,RMAN 应能够从恢复的控制文件找到备份。此步骤有助于确保归档日志列表存在并且可以恢复备份组件。

    在以下示例中,根据需要修改环境中的 SBT_LIBRARY 和 OPC_PFILE。

    rman target / <<EOF
    
    spool log to "`date +%Y%m%d_%H%M%S_%N`_restore_database_preview.log"
    set echo on
    run {
        ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        ALLOCATE CHANNEL c2 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        ALLOCATE CHANNEL c3 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        restore database validate header preview;
    }

    检查输出,如果有错误消息,请调查问题的原因。

  2. 使用 set newname 重定向还原以 OMF 格式还原数据文件,并使用 switch datafile all 允许控制文件使用新的数据文件副本进行更新。
    rman target / <<EOF
    
    spool log to "`date +%Y%m%d_%H%M%S_%N`_restore_database_preview.log"
    set echo on
    run {
        ALLOCATE CHANNEL c1 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        ALLOCATE CHANNEL c2 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        ALLOCATE CHANNEL c3 DEVICE TYPE sbt MAXPIECESIZE 2 G FORMAT '%d_%I_%U' PARMS 'SBT_LIBRARY=/tmp/oss/libopc.so ENV=(OPC_PFILE=/tmp/oss/opc_sbt.ora)';
        set newname for database to new;
        restore database;
        switch datafile all;
        switch tempfile all;
        recover database;
    }

    此恢复将尝试使用上次可用的归档日志备份,然后失败并显示错误,例如:

    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of recover command at 07/20/2016 12:09:02
    RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 22 and starting SCN of 878327
  3. 要完成不完整的恢复,请使用 RMAN-06054 消息中显示的序列号和线程编号运行恢复,例如:
    recover database until sequence 22 thread 1;

重置日志

重置日志。

alter database open resetlogs;

准备注册数据库

在注册数据库之前:

  1. 确保数据库 COMPATIBLE 参数值是可接受的。如果值小于最小值,则在升级数据库兼容性之前无法注册数据库。
  2. 验证数据库是否已注册到监听程序和服务名称。
    lsnrctl services
  3. 确保已还原或已为新数据库创建密码文件。
    ls -ltr $ORACLE_HOME/dbs/orapw<oracle sid>

    如果该文件不存在,请使用 orapwd 实用程序创建该文件。

    orapwd file=<$ORACLE_HOME/dbs/orapw<$ORACLE_SID>> password=<sys password>
  4. 确保以读写模式打开还原的数据库。
    select open_mode from v$database;

    命令输出应指示读写模式。dbcli register-database 命令将尝试运行 datapatch,这需要读写模式。如果有 PDB,则它们还应处于读写模式,以确保在其上运行数据补丁程序。

  5. 从还原数据库上的 oracle 主目录中,使用以下命令验证与 SYS 的连接:
    conn sys/<password>@//<hostname>:1521/<database service name>

    此连接是以后注册数据库所必需的。请先修复任何连接问题,然后再继续。

  6. 使用 SQL*Plus 命令确保数据库在 spfile 上运行。
    SHOW PARAMETERS SPFILE
  7. (可选)如果要使用 dbcli 命令行界面管理数据库备份,可以在注册时或注册后将新的或现有的备份配置与迁移的数据库关联。备份配置定义数据库的备份目标和恢复窗口。使用 Backupconfig Commands 创建、列出和显示备份配置。
  8. 将文件夹 $ORACLE_HOME/sqlpatch 从源数据库复制到目标数据库。这将允许 dbcli register-database 命令回退任何冲突的修补程序。

    注意:

    如果要迁移 11.2 版数据库,则需要在注册数据库后执行其他步骤。有关更多信息,请参见 Roll Back Patches on a Version 11.2 Database

在数据库系统上注册数据库

数据库命令将还原的数据库注册到 dcs-agent,以便它可由 dcs-agent 堆栈进行管理。

注意:

dbcli register-database 命令在双节点 RAC 数据库系统上不可用。

以 root 用户身份,使用 dbcli register-database 命令在数据库系统上注册数据库,例如:

dbcli register-database --dbclass OLTP --dbshape odb1 --servicename tdetest --syspassword

输出:

Password for SYS:
{
  "jobId" : "317b430f-ad5f-42ae-bb07-13f053d266e2",
  "status" : "Created",
  "message" : null,
  "reports" : [ ],
  "createTimestamp" : "August 08, 2016 05:55:49 AM EDT",
  "description" : "Database service registration with db service name: tdetest",
  "updatedTime" : "August 08, 2016 05:55:49 AM EDT"
}

更新 tnsnames.ora

检查备份位置中的 tnsnames.ora,检查克隆数据库中使用的数据库链接,然后将任何相关的连接字符串添加到位于 $ORACLE_HOME/network/admin/tnsnames.ora 的克隆数据库文件。

回滚版本 11.2 数据库上的补丁程序

对于 11.2 版数据库,sqlpatch 应用程序不是自动的,因此应用于源数据库的任何临时补丁程序(以前称为“一次性”补丁程序)必须在目标数据库中手动回滚。注册数据库后,执行 catbundle.sql 脚本,然后使用相应的 PSU 修补程序(或 PSU 修补程序之上的叠加修补程序)执行 postinstall.sql 脚本,如下所述。

提示:

某些临时修补程序可能包括写入 $ORACLE_HOME/rdbms/admin 目录的文件以及 $ORACLE_HOME/sqlpatch 目录。Oracle 建议您在将数据库迁移到 OCI 环境之前,使用补丁程序自述文件中的说明在源数据库中回退这些补丁程序。如果您需要回退这些补丁程序的帮助,请与 Oracle 技术支持联系。
  1. 在数据库系统上,使用 dbcli list-dbhomes 命令查找版本 11.2 数据库主目录的 PSU 补丁程序编号。在以下命令输出样例中,PSU 修补程序编号是“DB Version(数据库版本)”列中的第二个编号:
    dbcli  list-dbhomes
    输出:
    ID                                   Name               DB Version                             Home Location                             Status 
    ------------------------------------ -----------------  -------------------------------------  ----------------------------------------- ----------
    59d9bc6f-3880-4d4f-b5a6-c140f16f8c64 OraDB11204_home1	11.2.0.4.160719 (23054319, 23054359)   /u01/app/oracle/product/11.2.0.4/dbhome_1 Configured

    (上面的示例中的第一个修补程序编号 23054319 用于数据库主目录中的 OCW 组件。)

  2. 使用 lsinventory 命令查找覆盖修补程序(如果有)。在以下示例中,修补程序编号 24460960 是 23054359 PSU 修补程序之上的覆盖修补程序。
    $ORACLE_HOME/OPatch/opatch lsinventory
    输出:
    ...
    Installed Top-level Products (1): 
    
    Oracle Database 11g                                                  11.2.0.4.0
    There are 1 products installed in this Oracle Home.
    
    
    Interim patches (5) :
    
    Patch  24460960     : applied on Fri Sep 02 15:28:17 UTC 2016
    Unique Patch ID:  20539912
       Created on 31 Aug 2016, 02:46:31 hrs PST8PDT
       Bugs fixed:
         23513711, 23065323, 21281607, 24006821, 23315889, 22551446, 21174504
       This patch overlays patches:
         23054359
       This patch needs patches:
         23054359
       as prerequisites
  3. 启动 SQL*Plus 并执行 catbundle.sql 脚本,例如:
    startup 
    connect / as sysdba
    @$ORACLE_HOME/rdbms/admin/catbundle.sql psu apply
    exit
  4. 使用上一步中的覆盖修补程序编号应用 sqlpatch,例如:
    connect / as sysdba
    @$ORACLE_HOME/sqlpatch/24460960/postinstall.sql 
    exit

注意:

如果源数据库安装了一次性修补程序,并且这些修补程序是云环境中已安装的 PSU 的一部分,则需要回退与这些一次性修补程序相对应的 SQL 更改。要回退 SQL 更改,请将 $ORACLE_HOME/sqlpatch/<patch#>/postdeinstall.sql 脚本从源环境复制到云环境并执行 postdeinstall.sql 脚本。

恢复后核对清单

在数据库系统上还原并注册数据库后,使用以下核对清单验证结果并执行任何还原后定制。

  1. 确保数据库文件已以 OMF 格式还原。
  2. 确保数据库在数据库命令输出中列出。
  3. 检查数据库中的以下外部引用,并在必要时进行更新:
    • 外部表:如果源数据库使用外部表,请备份该数据并将其迁移到目标主机。
    • 目录:根据需要为恢复的数据库定制默认目录。
    • 数据库链接:确保在 ORACLE_HOME 的 tnsnames.ora 文件中更新了所有必需的 TNS 条目。
    • 电子邮件和 URL:确保数据库系统中使用的任何电子邮件地址和 URL 仍可从数据库系统访问。
    • 调度的作业:查看源数据库中调度的作业,并根据需要调度还原的数据库中的类似作业。
  4. 如果在注册数据库时关联了备份配置,请使用备份命令运行测试备份。
  5. 如果还原的数据库包含 CDB 和 PDB,请验证是否已向所有 PDB 应用补丁程序。