在初次安装好的RAC环境中,CDB是默认打开的状态 READ ONLY,但是PDB是关闭状态 MOUNTED,那么,如何在CDB打开的同时,自动让PDB的状态是 READ WRITE 呢?
我们需要用到下面的语句来实现:
##前提是,执行以下语句前,自动启动的PDB必须是OPEN状态,才会生效。
alter pluggable database all save state;
alter pluggable database pdb1 save state;
alter pluggable database pdb1 save state instances=('b19c01','b19c02');
all save state直译就是所有保存状态,但是它只针对于当前实例。在rac环境中,如果只在rac1执行了此语句,则只是对rac1中所有pdb起作用,即在下次重启数据库时,自动启动rac1下的所有pdb。而rac2中的所有pdb不受其影响。且,只有在pdb是open状态时,此操作才能生效。
设置pdb自动启动
[oracle@b19c01:/home/oracle]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Aug 22 11:54:35 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
sys@b19c01>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
##在PDB是MOUNTED状态操作即使执行成功,也不生效
sys@b19c01>alter pluggable database all save state;
Pluggable database altered.
##查询结果记录不存在,说明设置失败
sys@b19c01>select con_name, instance_name, state from dba_pdb_saved_states;
no rows selected
##启动所有PDB到READ WRITE状态,即OPEN
sys@b19c01>alter pluggable database all open;
Pluggable database altered.
sys@b19c01>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
##在PDB是READ WRITE状态操作,即OPEN状态
sys@b19c01>alter pluggable database all save state;
Pluggable database altered.
##查询结果记录存在,说明设置生效
sys@b19c01>set linesize 200;
sys@b19c01>col con_name for a20;
sys@b19c01>col instance_name for a30;
sys@b19c01>select con_name, instance_name, state from dba_pdb_saved_states;
CON_NAME INSTANCE_NAME STATE
-------------------- ------------------------------ --------------
PDB1 b19c01 OPEN
PDB2 b19c01 OPEN
sys@b19c01>exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
##关闭数据库
[oracle@b19c01:/home/oracle]$ srvctl stop database -d b19c0
##启动数据库
[oracle@b19c01:/home/oracle]$ srvctl start database -d b19c0
##登录数据库
[oracle@b19c01:/home/oracle]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Aug 22 12:13:50 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
##pdb1 pdb2都READ WRITE状态,OPEN成功
sys@b19c01>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
sys@b19c01>
##在rac2登录数据库查看pdb状态
[oracle@b19c02:/home/oracle]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Aug 22 12:16:16 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
##pdb1 pdb2的状态仍然是MOUNTED
sys@b19c02>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
sys@b19c02>
pdb_name save state是对于某个pdb而言。即你想让哪个pdb跟随cdb启动,就设置哪个,比如pdb1。
alter pluggable database pdb1 save state;
同时开启两个实例下的pdb1
alter pluggable database pdb1 save state instances=('b19c01','b19c02');
查看pdb自动启动设置
select con_name, instance_name, state from dba_pdb_saved_states;
取消pdb自动启动设置
alter pluggable database all discard state;