19c CDB架构下的数据库启动和停止

2026年7月10日 作者 XiaofeiHuangfu

适用范围
适用于Oracle 19c CDB
方案概述
本方案用于生产环境中19c CDB多租户架构下的CDB和PDB启动停止。生产环境中定期计划内的CDB和PDB重启,以及数据库应用补丁和升级等场景需要对CDB或PDB进行启停,是数据库日常运维的工作。
实施步骤

1、CDB的启动

生产环境中在用户能够连接到Oracle数据库实例之前,数据库管理员必须先启动该数据库实例。数据库操作正常意味着实例已启动、数据库已装载且已打开。在数据库操作正常时,任何有效用户都可连接到数据库,而且可执行典型数据访问操作。 数据库实例和数据库在数据库向用户开放访问的过程中会经历多个阶段:首先启动数据库实例,然后挂载数据库,最后打开数据库。
NOMOUNT:在此阶段,Oracle软件会读取初始化参数文件,启动后台进程,为SGA分配内存,并打开告警日志和跟踪文件。通常在创建数据库、重新创建控制文件或某些备份和恢复场景中,实例仅在NOMOUNT模式下启动。
MOUNT:在这一阶段Oracle软件将数据库(CDB)与先前启动的数据库实例关联,打开并读取初始化参数文件中指定的控制文件,并获取数据文件和在线重做日志文件的名称及状态。
OPEN:Oracle 软件根据控制文件中注册的列表打开重做日志文件和数据文件。以 OPEN 模式启动,以便用户能够连接到数据库实例。默认情况下,打开数据库时不会启动 PDB。

--启动CDB
SYS@cdb19c(CDB$ROOT)> startup
ORACLE instance started.

Total System Global Area  838856872 bytes
Fixed Size                  9183400 bytes
Variable Size             687865856 bytes
Database Buffers          138412032 bytes
Redo Buffers                3395584 bytes
Database mounted.
Database opened.
--检查CDB状态
SYS@cdb19c(CDB$ROOT)> select name,cdb,open_mode from v$database;

NAME      CDB OPEN_MODE
--------- --- --------------------
CDB19C    YES READ WRITE

SYS@cdb19c(CDB$ROOT)>
SYS@cdb19c(CDB$ROOT)> select INSTANCE_NAME,CON_ID,STATUS from v$instance;

INSTANCE_NAME        CON_ID STATUS
---------------- ---------- ------------
cdb19c                    0 OPEN

SYS@cdb19c(CDB$ROOT)> select name,open_mode from v$database
  2  union
  3  select INSTANCE_NAME,STATUS from v$instance;

NAME             OPEN_MODE
---------------- --------------------
CDB19C           READ WRITE
cdb19c           OPEN

SYS@cdb19c(CDB$ROOT)>
SYS@cdb19c(CDB$ROOT)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 HRPDB                          MOUNTED
         6 RCATPDB                        MOUNTED

在SQL*Plus工具中使用startup命令,启动后CDB的是READ WRITE模式状态是OPEN,2个PDB HRPDB和RCATPDB是MOUNTED即关闭状态。

Oracle RAC环境也可以使用srvctl start database命令来启动CDB

srvctl start database -db db_unique_name [-startoption start_options]
 [-verbose]

2、关闭CDB

关闭模式对当前活动的适用性按以下顺序逐渐增强:
ABORT:在关闭之前执行的任务最少。由于此模式需要在启动之前进行恢复,因此只在需要时才使用此模式。当启动实例时出现了问题,或者因紧急情况(如,通知在数秒内断电)而需要立即关闭时,如果其它关闭方式都不起作用,通常选择使用此模式。
IMMEDIATE:这是最常用选项。选择此模式会回退未提交的事务处理。
TRANSACTIONAL:允许事务处理完成
NORMAL:等待会话断开
如果考虑执行关闭所花费的时间,则会发现 ABORT 的关闭速度最快,而 NORMAL 的关闭速度最慢。NORMAL 和 TRANSACTIONAL 花费的时间较长,具体取决于会话和事务处理的数目。

SYS@cdb19c(CDB$ROOT)> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@cdb19c(CDB$ROOT)>


Oracle RAC环境也可以使用srvctl stop database 命令来关闭CDB
srvctl stop database -db db_unique_name 

3、启动PDB

启动 PDB 和打开 PDB 意义相同,当你打开一个 PDB 时,数据库服务器会打开该 PDB 对应的数据文件。与 CDB 类似,PDB 也有四个开启状态,这些状态被称为开启模式。开启模式包括:READWRITE(PDB 完全启动/已打开)、READONLY、MIGRATE 和 MOUNTED(PDB 已关闭/已关闭)。
我们可以使用 ALTER PLUGGABLE DATABASE 命令从根容器或 PDB 本身中打开和关闭 PDB。也可以使用 STARTUP 和 SHUTDOWN 命令。这个
ALTER PLUGGABLE DATABASE 命令可以将 PDB 的任何打开模式更改为其他模式。要使用 STARTUP 命令,PDB 必须首先处于 MOUNTED 模式。这两个命令均要求您已连接到根容器或具有以下系统权限之一的 PDB:AS SYSBACKUP、AS SYSDBA、AS SYSDG 或 AS SYSOPER。

--all open是启动当前CDB中的所有PDB
SYS@cdb19c(CDB$ROOT)> alter pluggable database all open;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)>
--启动单个PDB
SYS@cdb19c(CDB$ROOT)> alter pluggable database hrpdb open;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 HRPDB                          READ WRITE NO
         6 RCATPDB                        MOUNTED


--切换到PDB中使用startup命令启动单个PDB
SYS@cdb19c(CDB$ROOT)> alter session set container=rcatpdb;

Session altered.

SYS@cdb19c(CDB$ROOT)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         6 RCATPDB                        MOUNTED
SYS@cdb19c(CDB$ROOT)> startup
Pluggable Database opened.
SYS@cdb19c(CDB$ROOT)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         6 RCATPDB                        READ WRITE NO
--配置PDB随CDB的启动自动启动



SYS@cdb19c(CDB$ROOT)> col name for a10
SYS@cdb19c(CDB$ROOT)> col open_mode for a15
SYS@cdb19c(CDB$ROOT)> SELECT name, open_mode FROM v$pdbs;

NAME       OPEN_MODE
---------- ---------------
PDB$SEED   READ ONLY
HRPDB      READ WRITE
RCATPDB    READ WRITE
当前该CDB中所有PDB是READ WRITE状态,把这个状态保存下来,下次重启CDB时PDB就会随着自动启动。
SYS@cdb19c(CDB$ROOT)> column con_name format a20
SYS@cdb19c(CDB$ROOT)> column instance_name format a20
SYS@cdb19c(CDB$ROOT)> select con_name, instance_name, state from dba_pdb_saved_states;

no rows selected

dba_pdb_saved_states现在没有记录。
--对HRPDB进行 save state
SYS@cdb19c(CDB$ROOT)> alter pluggable database hrpdb save state;

Pluggable database altered.
--对RCATPDB进行 save state
SYS@cdb19c(CDB$ROOT)> alter pluggable database rcatpdb save state;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)> select con_name, instance_name, state from dba_pdb_saved_states;

CON_NAME             INSTANCE_NAME        STATE
-------------------- -------------------- --------------
HRPDB                cdb19c               OPEN
RCATPDB              cdb19c               OPEN

2个PDB当前的状态已经保存了。
--重启CDB
SYS@cdb19c(CDB$ROOT)> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@cdb19c(CDB$ROOT)> startup
ORACLE instance started.

Total System Global Area  838856872 bytes
Fixed Size                  9183400 bytes
Variable Size             687865856 bytes
Database Buffers          138412032 bytes
Redo Buffers                3395584 bytes
Database mounted.
Database opened.
SYS@cdb19c(CDB$ROOT)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 HRPDB                          READ WRITE NO
         6 RCATPDB                        READ WRITE NO
SYS@cdb19c(CDB$ROOT)>
重启CDB后PDB随着自动启动了。
--取消保存的PDB状态

SYS@cdb19c(CDB$ROOT)> alter pluggable database hrpdb discard state;

Pluggable database altered.


SYS@cdb19c(CDB$ROOT)>  alter pluggable database all  discard state;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)> column con_name format a20
SYS@cdb19c(CDB$ROOT)> column instance_name format a20
SYS@cdb19c(CDB$ROOT)> select con_name, instance_name, state from dba_pdb_saved_states;

no rows selected

SYS@cdb19c(CDB$ROOT)>
此时dba_pdb_saved_states中没有记录了。

4、关闭PDB
–关闭所有PDB

SYS@cdb19c(CDB$ROOT)> alter pluggable database all close;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 HRPDB                          MOUNTED
         6 RCATPDB                        MOUNTED
SYS@cdb19c(CDB$ROOT)>
--关闭单个PDB
SYS@cdb19c(CDB$ROOT)> alter pluggable database HRPDB close;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)> alter pluggable database all open ;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)> alter pluggable database HRPDB close immediate;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)>
--RAC环境中可以选择实例关闭PDB
可以使用instances参数按需关闭PDB,也可以使用EXCEPT选择性排除
INSTANCES = { ( 'instance_name' [, 'instance_name' ]... )
            | ALL [ EXCEPT ( 'instance_name' [, 'instance_name' ]... ) ] }

SYS@cdb19c(CDB$ROOT)> alter pluggable database HRPDB close instances=all;

Pluggable database altered.

SYS@cdb19c(CDB$ROOT)>

--使用shutdown immediate 关闭单个PDB
SYS@cdb19c(CDB$ROOT)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 HRPDB                          READ WRITE NO
         6 RCATPDB                        READ WRITE NO
SYS@cdb19c(CDB$ROOT)> alter session set container=hrpdb;

Session altered.

SYS@cdb19c(CDB$ROOT)> shutdown immediate
Pluggable Database closed.
SYS@cdb19c(CDB$ROOT)> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 HRPDB                          MOUNTED
SYS@cdb19c(CDB$ROOT)>

-thd end-

笔者文章集合详见:
https://www.myhfxf.com
https://www.xiaofeihuangfu.com
CSDN:https://blog.csdn.net/xfhuangfu
ITPUB:https://blog.itpub.net/28373936/
微信公众号:xfhuangfu