今天看了下ORACLE培训资料,里面有个命令很有意思。
讲的是数据库在启动或者重启时候,总要去启动PDB,很麻烦,这个小命令就很有意思了。就是能够在数据库CDB启动后,能够让PDB保持你想要他保持的状态。比如关闭状态,比如开启状态等等。省去了自己再用命令调整的步骤。
我们来复现下这个小实验。
第一步,在实验环境中,打开一个数据库。
这时候查看PDB的状态,出了种子PDB是read only的,其他的数据库就是规规矩矩的mounted状态的。这时候,我们把所有的PDB都打开:alter pluggable database all open,并使用 alter pluggable database all save state;命令(此处我想让所有的PDB都能够在CDB打开后能够自己开启,因此用的all,如果你想要让单个数据库是开启状态, 把all改成单独的PDB名字即可。比如,我想MYC01在CDB开启后,他也是read write的状态,那就alter pluggable database MYC01 save state;)
先看看我们在启动数据库,并保持开启状态的数据库当前状态是否是read write.下图可见,没啥毛病。的确是正确的开启状态——read write
好了,我们现在把数据库整个都关闭(关闭之后我还用show pdbs命令,来更好的展示他这的确时数据库关闭的状态了)。如果命令生效,则CDB启动时,pdb所有的状态应该都为READ WRITE。下图可见,的确在CDB启动后,所有的PDB都是启动的状态。说明这个命令有效!
接着我们再来看看,他是否能够让其中一个PDB保持mount状态呢?于是我把其中一个PDB:MYC01手动给他关闭 alter pluggable database myc01 close;然后用命令让他保持这个mount状态。alter pluggable database myc01 save state;
为了能够验证他是否保持的是数据库关闭前的状态,还是save state命令键入前的状态。我们这是哈,把关闭的myc01的状态从mounted 状态,给他手动启动起来,alter pluggable database myc01 open;
如果这个save state命令保存的是键入此命令前的pdb的状态,那么等CDB重启后,应该唯独MYC01这个pdb是mount状态,而其他的则是之前设置的READ WRITE状态。我们来验证下
果然,通过上图,我们发现,CDB重启后,其他的PDB依旧维持我们之前设置的保存read write状态,而MYC01保存了我们之前设置的mounted状态。说明save state命令保存的是我们键入此命令前对应PDB的状态!
我们再来验证下那个教学PPT中的移除保存状态设置的命令
我们尝试把所有刚刚PDB的状态设置都清除。键入alter pluggable database all discard state;按照道理,此命令敲入后,所有的PDB的状态都会回归默认的状态。比如CDB重启后,除了种子pdb,其他的都是mounted状态。我们来看看是不是如此的。
不难发现,除了种子PDB,其他的PDB的状态的确都恢复了原来的默认状态。也就是在CDB重启后,保持mounted状态了。
这两个命令可以帮助数据库环境多的朋友们,在大批量重启后,不需要再一台台去重启数据库。并且可以自己设置具体哪个PDB要mounted,哪个要read write状态。也避免了大批量启动时候,把不该启动的pdb给启动了。
当然,我这儿抛砖引玉:这儿命令是否可以使用instances=all 来使得所有节点上的PDB状态都设置成一致呢?是否对种子pdb有效呢?是否可以保持其他的状态呢?大家可以稍微做一些额外的拓展。很多数据库的设置都很细碎,但是却很有用。希望大家能帮助到各位。