1.什么是CDB
CDB(container database,容器库)。从12c版本开始,Oracle数据库只能有两种形式:non-CDB or CDB。12c之前创建的数据库都是Non-cdb的。一个CDB可以包含0个、1个或多个PDB(Pluggable database,插拔库)
CDB包含以下内容:
一个ROOT容器(CDB$ROOT)包含system、sysaux、undo、temp表空间,控制文件、redologs
一个种子容器(PDB的模板,PDB$SEED)包含system、sysaux、temp、example表空间,并且创建新的PDB都是以种子容器作为模板。
2.什么是PDB
PDB(pluggable database,插拔库),PDB是用户创建的容器,用于分配特定的业务。
PDB包括以下内容:
system、sysaux、temp、undo表空间
用户创建的业务表空间
PDB的RMAN备份
首先,使用RMAN的用户必须拥有sysdba权限或sysbackup权限。RMAN可以运行在ROOT容器:
$ rman target sys/password@CDB
$ rman target /
或者运行在PDB
$ rman target sys/password@PDB1
当连接到PDB,所有的命令都只会包含在该PDB内;当连接到ROOT,命令会包含CDB中的任何文件,除非设定PDB名字限定。
rman命令report schema可以用于确认CDB中的所有文件,示例如下:
$ rman target /
RMAN> report schema;
using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name SBDB
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 930 SYSTEM YES /u01/app/oracle/oradata/SBDB/system01.dbf
3 1040 SYSAUX NO /u01/app/oracle/oradata/SBDB/sysaux01.dbf
4 330 UNDOTBS1 YES /u01/app/oracle/oradata/SBDB/undotbs01.dbf
5 270 PDB$SEED:SYSTEM NO /u01/app/oracle/oradata/SBDB/pdbseed/system01.dbf
6 330 PDB$SEED:SYSAUX NO /u01/app/oracle/oradata/SBDB/pdbseed/sysaux01.dbf
7 5 USERS NO /u01/app/oracle/oradata/SBDB/users01.dbf
8 100 PDB$SEED:UNDOTBS1 NO /u01/app/oracle/oradata/SBDB/pdbseed/undotbs01.dbf
9 290 PDB1:SYSTEM YES /u01/app/oracle/oradata/SBDB/pdb1/system01.dbf
10 370 PDB1:SYSAUX NO /u01/app/oracle/oradata/SBDB/pdb1/sysaux01.dbf
11 100 PDB1:UNDOTBS1 YES /u01/app/oracle/oradata/SBDB/pdb1/undotbs01.dbf
12 5 PDB1:USERS NO /u01/app/oracle/oradata/SBDB/pdb1/users01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 32 TEMP 32767 /u01/app/oracle/oradata/SBDB/temp01.dbf
2 36 PDB$SEED:TEMP 32767 /u01/app/oracle/oradata/SBDB/pdbseed/temp012.dbf
3 128 PDB1:TEMP 32767 /u01/app/oracle/oradata/SBDB/pdb1/temp01.dbf
report schema命令是唯一可以轻松确认文件所属PDB名称的命令。连接到PDB,可以仅查看PDB的数据文件列表:
$ rman target sys/password@PDB1
RMAN> report schema;
using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name SBDB
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
9 290 SYSTEM NO /u01/app/oracle/oradata/SBDB/pdb1/system01.dbf
10 370 SYSAUX NO /u01/app/oracle/oradata/SBDB/pdb1/sysaux01.dbf
11 100 UNDOTBS1 NO /u01/app/oracle/oradata/SBDB/pdb1/undotbs01.dbf
12 5 USERS NO /u01/app/oracle/oradata/SBDB/pdb1/users01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
3 128 TEMP 32767 /u01/app/oracle/oradata/SBDB/pdb1/temp01.dbf
1.完整的CDB备份
执行以下命令进行CDB备份:
$ rman target sys/password@CDB
RMAN> BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT;
RMAN> LIST BACKUP OF DATABASE;
执行上述命令查看当前的备份集,会发现对CDB的备份会备份CDBROOT、PDBSEED、ALL PDBS。
2.单独的CDB备份
$ rman target sys/oracle@CDB
RMAN> BACKUP PLUGGABLE DATABASE PDB1 TAG'PDB1';
RMAN> LIST BACKUP;
我们在备份的时候可以不需要设置tag,这里是为了更加显著的展示PDB的备份。
RMAN LIST BACKUP命令显示RMAN备份属于哪个数据库或PDB。
如果备份路径是FRA(Fast Recovery Area),那么备份的路径名字将会是GUID。所以在有必要的情况下,我们可以通过以下方式确定备份集属于哪一个PDB;
SQL> SET LINESIZE 150
SQL> COL NAME FOR A10
SQL> SELECT CON_ID, DBID, GUID, NAME FROM v$pdbs;
CON_ID DBID GUID NAME
---------- ---------- ------------------------------ ------------
2 943290432 B5A0DD07BB5F6DFBE0536D1410AC6EEB PDB$SEED
3 1666453508 B5A10FCFB4980964E0536D1410AC7D46 PDB1
在上面的例子中,该PDB的GUID为“B5A10FCFB4980964E0536D1410AC7D46”
3.单独的PDB备份
备份PDB的system/sysaux
$ rman target sys/password@CDB
RMAN> backup tablespace PDB1:system,PDB1:sysaux;
由于file id是唯一的,所以可以指定file id进行备份
– 先查出需要备份的文件
SQL> select file_id,file_name from dba_data_files;
– 针对file_id进行rman备份
RMAN> backup datafile 9,10;
PDB的RMAN恢复
1.PDB丢失system数据文件的恢复
在这种情况,理论上CDB和其他的PDB不会受影响,只有该PDB不可用,必须从ROOT容器开始恢复。然而,PDB的system数据文件丢失与CDB的system数据文件丢失一样严重,可能会导致不可预测的结果,大多数情况下会使整个CDB崩溃,即所有的PDB都不可用。
在这种情况下,需要将CDB进入Mount状态,然后恢复system数据文件。Oracle说会在以后的版本对这个功能进行增强,意味着丢失PDB的system数据文件不会再对CDB或其他PDB造成影响。
$ sqlplus / as sysdba
SQL> startup mount;
$ rman target /
RMAN> RESTORE DATAFILE 8;
RMAN> RECOVER DATAFILE 8;
RMAN> ALTER PLUGGABLE DATABASE PDB1 OPEN;
2.PDB丢失非系统表空间数据文件,例如user表空间数据文件
需要根据当前的情况,文件可能是offline或没有offline
$ rman sys/password@PDB1
RMAN> ALTER DATABASE DATAFILE 10 OFFLINE;
RMAN> RESTORE DATAFILE 10;
RMAN> RECOVER DATAFILE 10;
RMAN> ALTER DATABASE DATAFILE 10 ONLINE;
3.丢失PDB的完整表空间
$ rman target sys/password@PDB1
RMAN> ALTER TABLESPACE USERS OFFLINE;
RMAN> RESTORE TABLESPACE USERS;
RMAN> RECOVER TABLESPACE USERS;
RMAN> ALTER TABLESPACE USERS ONLINE;
4.丢失整个PDB
$ rman target sys/password@CDB
RMAN> RESTORE PLUGGABLE DATABASE PDB1;
RMAN> RECOVER PLUGGABLE DATABASE PDB1;
RMAN> ALTER PLUGGABLE DATABASE PDB1 open;
注:PDB的意外丢失和主动删除是不一样的。例如,如果PDB或数据文件被意外删除、损坏等,但是元数据都是仍然存在的,在这种情况下是可以恢复的;但是如果主动的对PDB或PDB数据文件删除,意味着将元数据信息删除,这种情况是不能恢复的。就会报以下错误:
RMAN-06813: could not translate pluggable database PDB1
|