一、简介
Oracle 12c引入了多租户架构,允许一个容器数据库(Container Database, CDB)托管多个独立的可插拔数据库(Pluggable Database, PDB)。本文档旨在详细描述如何启动和关闭CDB及PDB。
二、容器数据库 (CDB)
2.1 启动和关闭CDB
启动和关闭容器数据库的操作与传统的实例相同。通过SQL*Plus中的STARTUP和SHUTDOWN命令来完成这些操作,当以特权用户身份连接到CDB时可以使用以下命令:
STARTUP [NOMOUNT | MOUNT | RESTRICT | UPGRADE | FORCE | READ ONLY]
SHUTDOWN [IMMEDIATE | TRANSACTIONAL | NORMAL | ABORT]
例如:
STARTUP NOMOUNT;
STARTUP MOUNT;
STARTUP RESTRICT;
STARTUP UPGRADE;
STARTUP FORCE;
STARTUP READ ONLY;
SHUTDOWN IMMEDIATE;
SHUTDOWN TRANSACTIONAL;
SHUTDOWN NORMAL;
SHUTDOWN ABORT;
二、 可插拔数据库 (PDB)
2.1 使用SQL*Plus命令启动和停止PDB
当以特权用户身份连接到特定的PDB时,可以使用以下SQL*Plus命令来启动或停止该PDB:
STARTUP FORCE;
STARTUP OPEN READ WRITE [RESTRICT];
STARTUP OPEN READ ONLY [RESTRICT];
STARTUP UPGRADE;
SHUTDOWN [IMMEDIATE | TRANSACTIONAL | NORMAL | ABORT];
示例:
STARTUP FORCE;
SHUTDOWN IMMEDIATE;
STARTUP OPEN READ WRITE RESTRICT;
SHUTDOWN;
STARTUP;
SHUTDOWN IMMEDIATE;
2.2 使用ALTER PLUGGABLE DATABASE命令启动和停止PDB
-
在PDB中执行
当以特权用户身份连接到PDB时,可以使用以下命令来打开或关闭当前PDB:
ALTER PLUGGABLE DATABASE OPEN READ WRITE [RESTRICTED] [FORCE];
ALTER PLUGGABLE DATABASE OPEN READ ONLY [RESTRICTED] [FORCE];
ALTER PLUGGABLE DATABASE OPEN UPGRADE [RESTRICTED];
ALTER PLUGGABLE DATABASE CLOSE [IMMEDIATE];
示例:
ALTER PLUGGABLE DATABASE OPEN READ ONLY FORCE;
ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE OPEN READ WRITE;
ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE;
-
在CDB中执行
当以特权用户身份连接到CDB时,可以使用以下命令来打开或关闭一个或多个PDB:
ALTER PLUGGABLE DATABASE <pdb-name-clause> OPEN READ WRITE [RESTRICTED] [FORCE];
ALTER PLUGGABLE DATABASE <pdb-name-clause> OPEN READ ONLY [RESTRICTED] [FORCE];
ALTER PLUGGABLE DATABASE <pdb-name-clause> OPEN UPGRADE [RESTRICTED];
ALTER PLUGGABLE DATABASE <pdb-name-clause> CLOSE [IMMEDIATE];
<pdb-name-clause>可以是:
- 一个或多个PDB名称,以逗号分隔的列表。
- ALL关键字表示所有PDB。
- ALL EXCEPT关键字后跟一个或多个PDB名称,以逗号分隔的列表,表示一组PDB的子集。
示例:
ALTER PLUGGABLE DATABASE pdb1, pdb2 OPEN READ ONLY FORCE;
ALTER PLUGGABLE DATABASE pdb1, pdb2 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE ALL CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE ALL EXCEPT pdb1 OPEN;
ALTER PLUGGABLE DATABASE ALL EXCEPT pdb1 CLOSE IMMEDIATE;
2.3 PDB 自动启动
在Oracle 12.1.0.2补丁集之后,引入了保存PDB启动状态的能力,因此不再需要为自动启动PDB而实现触发器。
在12.1.0.2之前的版本中,当CDB启动时,所有的PDB会保持挂载状态。默认情况下没有机制可以在CDB启动时自动启动它们。要实现这一点,可以创建一个系统触发器,在CDB启动后打开一些或全部PDB。
CREATE OR REPLACE TRIGGER open_pdbs
AFTER STARTUP ON DATABASE
BEGIN
EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN';
END open_pdbs;
/
您可以根据需求自定义此触发器,以便不是所有的PDB都会启动。
2.4 保存和丢弃PDB启动状态(12.1.0.2 及以后)
从12.1.0.2补丁集开始,可以通过ALTER PLUGGABLE DATABASE命令保存PDB的启动状态,使其在CDB重启后仍然有效。我们先来看一下正常CDB重启后的结果。
注意在重启前PDB处于READ WRITE模式,但在重启后变为MOUNTED模式。
SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 READ WRITE
然后我们重启CDB:
SHUTDOWN IMMEDIATE;
STARTUP;
SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---- ----------
PDB$SEED READ ONLY
PDB1 MOUNTED
PDB2 MOUNTED
接下来,我们打开两个可插拔数据库,但只保存其中一个的状态:
ALTER PLUGGABLE DATABASE pdb1 OPEN;
ALTER PLUGGABLE DATABASE pdb2 OPEN;
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;
DBA_PDB_SAVED_STATES视图显示有关容器保存状态的信息:
COLUMN con_name FORMAT A20
COLUMN instance_name FORMAT A20
SELECT con_name, instance_name, state FROM dba_pdb_saved_states;
CON_NAME INSTANCE_NAME STATE
-------- -------------- -----
PDB1 cdb1 OPEN
现在重启CDB将给出不同的结果:
SHUTDOWN IMMEDIATE;
STARTUP;
SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 MOUNTED
请注意,状态仅在容器处于READ ONLY或READ WRITE模式时被保存并在DBA_PDB_SAVED_STATES视图中可见。对于处于MOUNTED模式的容器,ALTER PLUGGABLE DATABASE ... SAVE STATE命令不会报错,但也不会记录任何内容,因为这是CDB重启后的默认状态。
此外,像其他ALTER PLUGGABLE DATABASE命令一样,PDB可以通过单独指定、逗号分隔列表、ALL或ALL EXCEPT关键词来标识。在RAC环境中还可以添加INSTANCES子句来指定实例,但是无论INSTANCES子句如何,SAVE/DISCARD STATE命令仅影响当前实例。
三、结论
通过遵循上述指导,您可以安全高效地管理Oracle 12c环境中的CDB和PDB的启动和关闭过程,从而更好地利用多租户架构的优势。随着技术的进步,预计未来版本中这项功能将会更加完善,为用户提供更佳的操作体验。