19c CDB架构下的数据库启动和停止
适用范围
适用于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