从备份中恢复

将数据从源数据库的数据库备份还原到目标数据库。

在目标数据库上安装 Oracle Database 备份

oci_install.jar 文件复制到目标数据库主机,然后运行命令在目标上安装 Oracle Database Backup。

在源数据库上安装 Oracle Database Backup Cloud Service
  1. 通过堡垒主机将 oci_install.jar 文件复制到目标数据库主机并解压缩。
    BASTION_IP=BASTION_IP # public IP
    DB_HOST=DB_HOST # private IP
    
    scp -o ProxyCommand="ssh -W %h:%p
    opc@${BASTION_IP}" oci_install.jar 
    opc@${DB_HOST}:~/
    
    ssh -J opc@${BASTION_IP} opc@${DB_HOST} 'sudo chown oracle:oinstall oci_install.jar; sudo mv oci_install.jar
    /home/oracle/'
  2. SSH 通过堡垒主机连接到 OCI 目标数据库,然后切换到 oracle 用户。
    ssh -J opc@${BASTION_IP} opc@${DB_HOST}
    sudo su - oracle
  3. 备份当前 wallet,然后在目标数据库中安装 wallet。
    mv $ORACLE_HOME/data/wallet $ORACLE_HOME/data/wallet_bck
    mkdir -p $ORACLE_HOME/data/wallet
    unzip wallet.zip -d $ORACLE_HOME/data/wallet/
  4. 运行 Database Cloud Backup Module 命令以安装库并创建 config 文件。
    这与运行在源数据库上安装 Oracle Database Backup Cloud Service 的命令相同,尽管 ORACLE_HOME 变量可能不同。
    java -jar oci_install.jar \
    -host https://objectstorage.region.oraclecloud.com \
    -pubFingerPrint wallet_public_key_fingerprint \
    -tOCID tenancy_OCID \
    -uOCID user_OCID \
    -cOCID compartment_OCID \
    -libDir $ORACLE_HOME/lib \
    -walletDir $ORACLE_HOME/data/wallet \
    -pvtKeyFile $ORACLE_HOME/data/wallet/oci_pvt \
    -bucket bucket_name \
    -configFile ~/config
    
    config 文件将显示在 oracle 用户的主文件夹中。
  5. 使用 SID_NAME 备份原始目标数据库 SPF 文件。
    如果不备份原始目标数据库 SPF 文件,RMAN 将尝试使用该文件还原备份并失败。
    mv $ORACLE_HOME/dbs/spfileSID_NAME.ora $ORACLE_HOME/dbs/spfileSID_NAME.ora.bck

在目标数据库上配置备份存储

在目标数据库上配置备份 SBT_TAPE 存储设备。

  1. 运行 RMAN 目标命令。
    rman target /
  2. 在目标数据库上配置备份 SBT_TAPE 存储设备。
    使用 ORACLE_HOME 环境变量定义 SBT 库。
    RMAN> CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=ORACLE_HOME/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
    

设置 DBID 并从备份恢复 SPF 文件

运行 RMAN 命令以设置 DBID 和解密密码,以便从备份还原 SPF 文件。设置 DBID 时,将使用 RMAN 将目标 DBID 替换为源 DBID。

  1. 设置数据库 ID (DBID)。
    RMAN> run {
    shutdown immediate;
    set dbid DBID number;
    STARTUP FORCE NOMOUNT;
    }
  2. 设置解密密码(用于加密的密码)并从备份恢复 SPF 文件。
    RMAN> SET DECRYPTION IDENTIFIED BY password;
    RMAN> set controlfile autobackup format for device type sbt to '%F';
    RMAN> run {
      allocate channel c1 device type sbt PARMS 'SBT_LIBRARY=ORACLE_HOME/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
      restore spfile from autobackup;
    }
  3. 退出 RMAN。

为审核文件创建目录

为审计文件创建目标目录。

默认位置为 /u01/app/oracle/admin/$ORACLE_SID/adump。通过在恢复的 spfile 中搜索字符串 audit_file_dest,可以查看原始数据库使用的设置。

spfile 是一个二进制文件,需要正确解析字符串。但是,可能会存在行中断,以防止简单的 grep 提供完整路径。字符串上的 -s "" 选项会删除换行符,sed 命令会在 audit_file_dest 之后解析文本。由于 sed 命令不处理非贪婪正则表达式,因此需要使用 awk 命令来修剪文件的末尾。

  • 使用添加的 xargs 命令创建文件夹:
    strings -s "" ${ORACLE_HOME}/dbs/spfile*.ora | sed -E "s|.*audit_file_dest='(.*)'.*|\1|" | awk -F"'" '{print $1}' | xargs mkdir -p 

还原和恢复数据库

使用 RMAN 从备份还原控制文件,然后还原和恢复数据库。RMAN 使用归档重做日志恢复数据库。

  1. 打开 RMAN 并从备份中还原控制文件。使用先前设置的 DBID 编号和说明密码。
    Rman target /
    RMAN> set dbid DBID number;
    RMAN> STARTUP FORCE NOMOUNT;
    RMAN> SET DECRYPTION IDENTIFIED BY password;
    RMAN> set controlfile autobackup format for device type sbt to '%F';
    RMAN> run {
    allocate channel c1 device type sbt PARMS 'SBT_LIBRARY=ORACLE_HOME/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
      restore controlfile from autobackup;
      alter database mount;
    }
  2. 使用 RMAN 对数据库进行还原和恢复。
    RMAN> run {
    CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=ORACLE_HOME/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/home/oracle/config)';
    RESTORE DATABASE;
    RECOVER DATABASE;
    }
    当 RMAN 应用了备份中的最后一个归档重做日志并且无法再找到任何日志时,将显示类似于以下内容的消息:unable to find archived log
  3. 使用 resetlogs 打开数据库。
    RMAN> ALTER DATABASE OPEN RESETLOGS;
  4. 准备目标数据库以接收连接。
  5. 通过编辑监听程序配置来创建静态监听程序来恢复 TNS 监听程序。
    nano $ORACLE_HOME/network/admin/listener.ora
  6. 将以下部分添加到 TNS 监听程序,以定义 ORACLE_HOME 和源数据库的 CDB 名称。

    ORACLE_HOME 替换为路径值 ORACLE_HOME,将 SID_NAME 替换为源数据库的服务名(CDB 名称)。

    SID_LIST_LISTENER=
      (SID_LIST=
        (SID_DESC=
          (ORACLE_HOME=ORACLE_HOME)
          (SID_NAME=SID_NAME))
      )
    
  7. 编辑 tnsname 文件。
    nano $ORACLE_HOME/network/admin/tnsnames.ora
  8. 编辑 SERVICE_NAME 以匹配源数据库的 SID 名称(不包含域名)。
    (SERVICE_NAME = SID_NAME)
  9. 重新启动监听程序。
    $ORACLE_HOME/bin/lsnrctl stop
    $ORACLE_HOME/bin/lsnrctl start
    $ORACLE_HOME/bin/lsnrctl status
    
该数据库应可访问。