本周在X9M上ADG环境主库上做PDB迁移的时候,出现了一个问题,备库在想要启动PDB的时候出现了无法打开的问题,在与SR深入交流之后发现了问题的原因。
创建PDB的standbys子句,指定创建PDB时是否在备库创建同一PDB的数据文件,使用方式如下:
create pluggable database xxx ... standbys= ('cdb_name1','cdb_name2',...)|none|all|all except;
standbys子句包含:
在使用none和all except子句中,不在对应备库创建PDB文件不会影响DG整体同步状况,这种配置是控制部分PDB(比如测试PDB)无需灾备同步,备库中PDB不同步数据,仅有元数据展示,因此备库中PDB时无法被open read only的,在switchover后,这个PDB将无法新的主库(原备库)中使用,failover后有丢失对应数据的风险。
就官方文档来看,一般情况下DG环境中创建PDB是无需关注该子句,因为默认为all。但是,在本周割接后发现备库对应PDB无法打开,出现了以下问题:
SQL> alter pluggable database open read only;
alter pluggable database open read only
*
ERROR at line 1:
ORA-01147: SYSTEM tablespace file xxxx is offline
SQL> select file#,status,name from v$datafile where file#=1716;
FILE# STATUS NAME
---------- ------- --------------------------------------------------------------
XXXX SYSOFF /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/UNNAMED01716
SQL> alter database datafile xxxx online;
alter database datafile xxxx online
*
ERROR at line 1:
ORA-01156: recovery or flashback in progress may need access to files
检查备库数据库日志,发现了以下问题:
Recovery created pluggable database PDB_XXXX <<<<<<<<
PDB_XXXX(16):Tablespace-SYSTEM during PDB create skipped since source is in r/w mode or this is a refresh clone
PDB_XXXX(16):File \#1716 added to control file as 'UNNAMED01716'. Originally created as:
PDB_XXXX(16):'+DATAC1/XXDBAAS/0485588F0AB77E31E06302096F0A5738/DATAFILE/system.1938.1146701297'
PDB_XXXX(16):because the pluggable database was created with nostandby
PDB_XXXX(16):or the tablespace belonging to the pluggable database is
PDB_XXXX(16):offline.
该PDB所有数据文件均仅有元数据过来了,日志中“the pluggable database was created with nostandby”也表示主库创建PDB似乎是使用的standbys=none方式创建的。
其实这个问题处理也并不是太复杂,只不过备库需要重启可能会影响到读写分离:
RMAN> run{
set newname for pluggable database PDB_XXXX to new;
restore pluggable database PDB_XXXX from service wgdbaas;
}
......
RMAN> switch pluggable database PDB_XXXX to copy;
DGMGRL> edit database xxdbdg set state='APPLY-OFF'
srvctl stop database -db xxdbdg
startup mount
alter pluggable database enable recovery;
alter database datafile 1716 online;
alter database datafile 1717 online;
......
srvctl start database -db xxdbdg
#这里需要等待一段时间,做恢复
DGMGRL> edit database xxdbdg set state='APPLY-ON'
略
至此这个出现问题的PDB恢复完成,根据于SR沟通得知,在本次远程克隆PDB的过程中,standbys被自动指定成了none,但是这个参数默认值是all,为什么会出现这个问题呢?
Data Guard Impact on Oracle Multitenant Environments (Doc ID 2049127.1)
从 18c 开始,在主库创建 PDB,默认使用STANDBYS=NONE的方式创建。数据库的告警日志会出现第二节中相同的输出。
具体也会有以下一些情况:
primary daabase: prodcdb
standby database: proddg
source pluggable database: testpdb1 in devcdb
Active Data Guard is enable.
prodcdb:
create database link devcdb connect to system identified by oracle using 'devcdb';
proddg:
alter system set standby_pdb_source_file_dblink='DEVCDB';
devcdb:
alter pluggable database testpdb1 close;
alter pluggable database testpdb1 open read only;
prodcdb:
create pluggable database testpdb1 from testpdb1@devcdb standbys=all;
alter pluggable database testpdb1 open;
proddg:
alter pluggable database testpdb1 open;
从本期的讲解中也能知道,在DG环境中创建PDB是有一些坑的,一些操作规则和官方文档中的描述也是有一些出入的。
老规矩,知道写了些啥。