注:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于云环境的那些值。
使用同一 DBCS 服务器上的辅助实例还原删除的多租户 PDB
简介
在多租户容器数据库 (container database,CDB) 中,数据字典表和视图定义的元数据仅存储在根中。但是,对于 PDB 中包含的数据库对象,每个可插入数据库 (PDB) 都有自己的一组数据字典表和视图。
因此,无法将可插入数据库 (Pluggable database,PDB) 恢复为数据库。必须使用辅助实例将其还原为数据库对象。如果意外删除、损坏的可插入数据库 (PDB)/数据文件等,PDB 的资料档案库/元数据仍存在,可以恢复和恢复
如果使用 DROP PLUGGABLE DATABASE <PDBNAME> 命令意外/故意删除 PDB,这将删除 PDB 并从资料档案库中删除元数据。因此,恢复 PDB(包括 PDB PITR)将失败,并显示 RMAN-06813: could not translate pluggable database PDBxx 等错误。


目标
恢复和恢复已删除的 PDB(包括数据文件)。由于无法在同一 CDB 中还原,因此我们将创建辅助实例并在同一实例和源上的辅助 CDB 中还原 PDB。
先决条件
-
完成 Oracle Database Cloud Service (DBCS) 数据库配置
-
对 CDB 执行完整备份
任务 1:创建新的可插入数据库
-
运行以下命令以创建可插入数据库。
SQL> create pluggable database <PDBNAME3> admin user <USERNAME> identified by <PASSWORD>; COLUMN PDB_NAME FORMAT A15 SQL> SELECT PDB_ID, PDB_NAME, STATUS FROM DBA_PDBS ORDER BY PDB_ID; PDB_ID PDB_NAME STATUS ---------- --------------- --------- 2 <PDBNAME$SEED> NORMAL 3 <PDBNAME1> NORMAL 4 <PDBNAME2> NORMAL 5 <PDBNAME3> NORMAL
任务 2:备份容器数据库 (Container Database,CDB)
-
使用 sysdba 或 sysbackup 用户连接到 RMAN,并备份包含可插入数据库
的 CDB 数据库。 RMAN>BACKUP DATABASE PLUS ARCHIVELOG ALL;
任务 3:删除在任务 1 中创建的可插入数据库
-
为了模拟此情况,我们删除了可插入数据库
。 SQL> drop pluggable database <PDBNAME3> INCLUDING DATAFILES ;
任务 4:在同一源数据库中恢复已删除的可插入数据库
-
尝试将 PDB 作为数据库还原到同一容器中时失败,出现 RMAN-06813 错误。
RMAN> restore pluggable database <PDBNAME3>; Starting restore at <MM/DD/YYYY> using channel ORA_DISK_1 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of restore command at <MM/DD/YYYY HH:MI:SS> RMAN-06813: could not translate pluggable database <PDBNAME3>
任务 5:创建临时辅助实例
-
在同一源(生产服务器)或其他服务器(辅助服务器)中创建临时辅助实例,以恢复容器数据库 (CDB) 和所需的可插入数据库 (PDB)。
-
在此示例中,在同一源服务器上创建辅助实例。
-
为辅助实例创建 init 文件。
-- create init<DBNAME AUX>.ora -- verify compatible parameter matches the version of your source db (init<DBCDBNAME>.ora) *.sga_target=10G *.control_files=+DATA/CDBAUX02/CONTROLFILE/control.ctl *.compatible=19.0.0.0.0 *.db_files=65534 *.db_create_file_dest=+DATA *.db_create_online_log_dest_1=+RECO *.undo_tablespace= UNDOTBS1 *.remote_login_passwordfile=EXCLUSIVE *.global_names=FALSE *.instance_name=CDBAUX02 *.audit_trail=DB *.db_name=CDB01 *.db_unique_name=CDBAUX02 *.enable_pluggable_database= TRUE *.db_recovery_file_dest=+RECO *.db_recovery_file_dest_size=40G *.wallet_root=/opt/oracle/dcs/commonstore/wallets/CDBAUX02 *.one_step_plugin_for_pdb_with_tde=FALSE *.tde_configuration='keystore_configuration=FILE' *.DB_FILE_NAME_CONVERT='CDB01_IAD1ZD','CDBAUX02' *.log_file_name_convert='+RECO/CDB01_IAD1ZD/ONLINELOG/','+RECO/CDBAUX02/ONLINELOG/'
任务 6:启动处于指定状态的辅助实例
-
使用以下命令启动处于命名状态的辅助实例。
[oracle@sud ~]$ mkdir -p /home/oracle/CDBAUX02[oracle@sud ~]$ cd /home/oracle/CDBAUX02[oracle@sud CDBAUX02]$ export ORACLE_SID=CDBAUX02
任务 7:从 IdP 实例中的备份恢复控制文件并挂载数据库
-
从辅助实例中的备份还原控制文件并使用以下命令挂载数据库。
run { set dbid=1672349321; set until time "to_date('2023-05-02 17:03:27','YYYY-MM-DD HH24:MI:SS')"; allocate channel ch1 device type sbt parms 'SBT_LIBRARY=/opt/oracle/dcs/commonstore/oss/CDB01_iad1zd/libopc.so ENV=(OPC_PFILE=/opt/oracle/dcs/commonstore/oss/CDB01_iad1zd/97164268-b09e-4c4d-8295-e3d3337b07e0/opc_CDB01_iad1zd.ora)'; restore controlfile from 'c-1672349321-20230502-13' ; alter database mount; }
任务 8:恢复和恢复辅助实例中删除的 PDB 数据库
-
使用以下命令还原和恢复辅助实例中删除的 PDB 数据库。
select status from V$BLOCK_CHANGE_TRACKING; alter database disable block change tracking; select status from V$BLOCK_CHANGE_TRACKING; ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE; alter database flashback off; Changing the State of (DISABLE RECOVERY) other PDB: set lines 300 pages 300 select 'alter session set container='||name||'; '|| CHR(13) || CHR(10) ||'alter pluggable database disable recovery; ' from v$pdbs where name not in ('PDB03'); -
如果源数据库具有多个 PDB,并且我们希望还原具有 ONLY ONE PDB 的 CDB,则禁用 Aux 数据库中所有其他 PDB 的恢复,如上所述仅恢复已删除的 PDB 以及根容器数据库。
run { set until time "to_date('2023-05-02 17:03:27','YYYY-MM-DD HH24:MI:SS')"; allocate channel ch1 device type sbt parms 'SBT_LIBRARY=/opt/oracle/dcs/commonstore/oss/CDB01_iad1zd/libopc.so ENV=(OPC_PFILE=/opt/oracle/dcs/commonstore/oss/CDB01_iad1zd/97164268-b09e-4c4d-8295-e3d3337b07e0/opc_CDB01_iad1zd.ora)'; set newname for database to '+DATA/'; restore pluggable database PDB03,root; switch datafile all; recover pluggable database PDB03,root; } -
当 RMAN 在备份中应用了上次归档重做日志且找不到任何其他日志时,将显示类似如下的消息:无法找到归档日志。
-
使用以下命令恢复数据库。
SQL> recover database using backup controlfile until cancel;
任务 9:在源数据库中添加和删除联机重做日志文件
-
在源服务器中添加 (4,5,6) 和删除 (1,2,3) 的联机重做日志组。

-
查看当前日志的大小。
select GROUP#,THREAD#,MEMBERS,STATUS,BYTES/1024/1024 from v$log; -
我们来创建 3 个新的日志组,并将其命名为 4、5 和 6 组,每个大小为 2048MB。
alter database add logfile group 6 size 2048malter system switch logfile -
切换到日志组 4,以便可以删除日志组 1、2 和 3。
alter database drop logfile group 3 -
检索组的所有日志成员名称。
select member from v$logfile;
任务 10:在辅助实例的重置日志中打开数据库
-
使用以下命令在辅助实例的 resetlogs 中打开数据库。
SQL> alter database open resetlogs;
任务 11:更改辅助实例中的可插入数据库
-
更改可插入数据库以在辅助实例中读取写入模式。
SQL> alter pluggable database <PDBNAME3> open read write;
任务 12:创建用户并授予 dblink 权限
-
在辅助实例和源中创建用户并授予对 dblink 的权限。
CREATE USER C##PDBCLONEDBA IDENTIFIED BY "XXXXXXX"; GRANT CREATE SESSION TO C##PDBCLONEDBA CONTAINER=ALL; GRANT CREATE PLUGGABLE DATABASE TO C##PDBCLONEDBA CONTAINER=ALL; GRANT CREATE DATABASE LINK TO C##PDBCLONEDBA CONTAINER=ALL; GRANT SELECT ANY DICTIONARY TO C##PDBCLONEDBA CONTAINER=ALL; GRANT CREATE JOB TO C##PDBCLONEDBA CONTAINER=ALL; GRANT EXECUTE ON DBMS_SCHEDULER TO C##PDBCLONEDBA CONTAINER=ALL; -
在“Source(源)”中创建数据库链接。
CREATE DATABASE LINK "CDBAUX02" CONNECT TO C##PDBCLONEDBA IDENTIFIED BY "XXXXXXX" USING '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.174)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = CDBAUX02)))'; 2 SQL> alter session set global_names=FALSE; Session altered. SQL> select * from dual@CDBAUX02; D -- x
任务 13:在源中克隆可插入数据库 PDB03
-
在源中克隆可插入数据库 PDB03。
CREATE PLUGGABLE DATABASE PDB03 FROM PDB03@CDBAUX02 NO REKEY KEYSTORE IDENTIFIED BY "XXXXXXX"; -
更改 CDB 中 PDB 的状态:示例:假设当前容器为根。以下语句将在打开模式为 READ WRITE 的 CDB 中打开 PDB。
alter pluggable database PDB03 open read write;
确认
- 作者 - Aditya Srivastawa(主要云架构师)
更多学习资源
探索 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 频道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Restore a dropped multitenant PDB using auxiliary instance on the same DBCS server
F81982-01
May 2023
Copyright © 2023, Oracle and/or its affiliates.