使用 RMAN 备份从对象存储恢复数据库
本文介绍了如何恢复存储在对象存储中的 Recovery Manager (RMAN) 备份。
Prerequisites
您需要以下各项:
- 用于将数据库还原到的新数据库系统(请参见下面的假设)。有关更多信息,请参见创建数据库系统概览。
- 必须在数据库系统上安装 Oracle Database Cloud 备份模块。有关更多信息,请参见在数据库系统上安装备份模块使用 RMAN 将数据库备份到对象存储。
假设
以下过程假定如下:
- 已创建新的数据库系统来托管还原的数据库,并且新数据库系统上不存在其他数据库。可以还原到具有现有数据库的数据库系统,但该数据库系统超出了本主题的范围。
-
原始数据库丢失,所有保留的都是最新的 RMAN 备份。该过程假定数据库系统(包括数据库)不再存在。
注意:
不包括在最近备份中的数据将丢失。 - 原始数据库在上次备份时使用的 Oracle Wallet 和/或加密密钥可用。
- RMAN 备份包含截至最新备份的控制文件和 spfile 的副本,以及执行完整数据库恢复所需的所有数据文件和归档日志备份。
- 恢复期间不会使用 RMAN 目录。
在数据库系统上设置存储
- 通过 SSH 连接到数据库系统。
ssh -i <private_key_path> opc@<db_system_ip_address>
- 以 opc 身份登录,然后 sudo 到 root 用户。使用带有连字符的
sudo su -
调用 root 用户的配置文件,该配置文件会将 PATH 设置为 dbcli 目录 (/opt/oracle/dcs/bin
)。login as: opc sudo su -
- 您可以使用现有的空数据库主目录或创建新数据库主目录进行还原。使用适用的命令可帮助您完成此步骤。
如果将使用现有数据库主目录:
-
使用 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 创建用于恢复的数据库主目录。
-
- 使用Dbstorage Commands 设置 DATA、RECO 和 REDO 存储的目录。以下示例为 rectest 数据库创建 10GB ACFS 存储。
dbcli create-dbstorage --dbname rectest --dataSize 10 --dbstorage ACFS
注意:
恢复 11.2 版数据库时,必须指定 ACFS 存储。
执行数据库还原和恢复
- 通过 SSH 连接到数据库系统,以 opc 身份登录,然后成为 oracle 用户。
sudo su - oracle
- 在
/etc/oratab
中为数据库创建条目。使用与原始数据库相同的 SID。db1:/u01/app/oracle/product/12.1.0.2/dbhome_1:N
- 使用 oraenv 实用程序设置
ORACLE_HOME
和ORACLE_SID
环境变量。. oraenv
- 获取原始数据库的 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" }
- 运行 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)
- 使用上面获取的值设置 DBID。
set dbid 1508405000;
- 运行以下命令。如果服务器参数文件不可用,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
- 从自动备份恢复服务器参数文件。
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; }
- 为 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
- 如果在原始数据库上启用了块更改跟踪,请为块更改跟踪文件创建目录。这将是
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
- 使用恢复的服务器参数文件重新启动实例。
STARTUP FORCE NOMOUNT;
- 从 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; }
- 还原和恢复数据库。
RESTORE DATABASE; RECOVER DATABASE;
- 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
- 使用重置日志打开数据库。
ALTER DATABASE OPEN RESETLOGS;
恢复已完成。自上次备份的归档重做日志以来,数据库将具有所有已提交的事务处理。