oracle容器pdb$seed损坏后的修复方法

pdb$seed,即可插拔数据库模板,或者也可称为种子数据库。

Oracle 12c为Oracle数据库引入了多租户架构,其中一个容器数据库(CDB$ROOT)可以有多个可插拔数据库(PDB)。引入这种新的体系结构是为了简化Oracle数据库的管理,这样我们可以将多个Oracle数据库整合到一个容器数据库(CDB)中。在多租户架构中,理想情况下,我们可以使用种子数据库(PDB$SEED)在容器数据库(CDB$ROOT)中创建任何新的可插拔数据库。PDB$SEED作为创建新的可插拔数据库的模板,不允许我们修改它的配置(默认情况下以只读模式打开)。

由于文件系统问题或任何其他不可预见的原因,种子数据库(PDB$SEED)可能会损坏或不可用。而前段时间,笔者就刚好遇到了这种事情。起因是我在一台测试机上做磁盘数据清理时,意外地将pdb$seed所对应的数据文件全部删掉了,导致在后续使用种子模板创建数据库时报错,无法通过这种方式正常创建新的可插拔数据库。

在这种情况下,我们不能使用PDB$SEED在各自的容器中创建新的可插拔数据库,所以在本文中,我将讨论在seed处于不可用状态(损坏)的情况下,我们可以用来恢复或重新创建可插拔数据库模板(PDB$SEED)的不同方法。

方法一:使用备份恢复

备份是恢复或还原数据库的第一道防线。通过rman备份来恢复种子数据库是最简单最方便的一种方法。

以下是具体实验过程:
先备份数据库


人为删除pdb$seed的数据文件:

重新启动种子库,提示文件丢失:

如果此时通过pdb$seed创建新的可插拔数据库,则会报错:

现在,我们通过rman备份来恢复种子库pdb$seed:

RMAN> restore pluggable database "pdb$seed"; Starting restore at 2023-11-13 01:48:13 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=14 device type=DISK channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring datafile 00005 to /oradata/orcl/pdbseed/system01.dbf channel ORA_DISK_1: restoring datafile 00006 to /oradata/orcl/pdbseed/sysaux01.dbf channel ORA_DISK_1: restoring datafile 00008 to /oradata/orcl/pdbseed/undotbs01.dbf channel ORA_DISK_1: reading from backup piece /backup/db_042bb839_1_1.bak channel ORA_DISK_1: piece handle=/backup/db_042bb839_1_1.bak tag=TAG20231113T012208 channel ORA_DISK_1: restored backup piece 1 channel ORA_DISK_1: restore complete, elapsed time: 00:00:15 Finished restore at 2023-11-13 01:48:30 RMAN> recover pluggable database "pdb$seed"; Starting recover at 2023-11-13 01:48:49 using channel ORA_DISK_1 starting media recovery media recovery complete, elapsed time: 00:00:00 Finished recover at 2023-11-13 01:48:50 RMAN> alter pluggable database "pdb$seed" open; Statement processed RMAN>