Oracle 19c CDB多租户架构常用命令与实战操作手册

2026年10月26日 关 作者 XiaofeiHuangfu

Oracle 19c CDB多租户架构常用命令与实战操作手册

image.png

1. 适用范围

  • 数据库版本:Oracle Database 19c
  • 架构:CDB/PDB 多租户架构
  • 场景:单实例、Oracle Restart、RAC
  • 工具:SQL*Plus、SQLcl、RMAN、SRVCTL、Data Pump

本文示例采用以下命名:

  • 单个 CDB:xfcdb
  • 单个 PDB:xfpdb
  • 多个 CDB:xfcdb1、xfcdb2、xfcdb3
  • 多个 PDB:xfpdb1、xfpdb2、xfpdb3

示例中的数据文件目录、口令、服务名和 RAC 实例名必须根据实际环境修改。涉及删除、插拔、移动、恢复的命令应先在测试环境验证,并纳入生产变更流程。


2. 先理解CDB中的三个核心容器

image.png

Oracle 19c 的 CDB 至少包含以下容器:

容器作用运维注意事项
CDB$ROOT保存 Oracle 提供的元数据、公共用户和公共权限不要在根容器中创建业务表和业务用户
PDB$SEED创建普通 PDB 的只读模板不应作为业务库使用
xfpdb用户创建的 PDB,承载业务数据应用必须通过 PDB 服务连接

PDB 对应用看起来像一套独立数据库,但多个 PDB 共享 CDB 实例、SGA、后台进程、控制文件和联机日志。数据字典、用户数据和部分参数则按容器隔离。

生产操作中最常见的错误不是 SQL 语法问题,而是在错误的容器(没有确认和选择准确的目标容器)中执行了正确命令。因此,登录后的第一步应当是确认当前容器。


3. 识别数据库和当前容器

3.1 判断数据库是否为CDB

执行位置:任意容器。

SQL@xfcdb >SELECT name, cdb, con_id, open_mode
FROM   v$database;

当 CDB 列为 YES 时,当前数据库采用 CDB 架构。

3.2 查看当前容器

SQL@xfcdb >SHOW CON_NAME;

SQL@xfcdb >SELECT sys_context('USERENV', 'DB_NAME')  AS db_name,
       sys_context('USERENV', 'CON_NAME') AS con_name,
       sys_context('USERENV', 'CON_ID')   AS con_id
FROM   dual;

3.3 查看所有PDB及状态

执行位置:CDB$ROOT。

SHOW PDBS;

SQL@xfcdb >SELECT con_id,
       name,
       open_mode,
       restricted,
       open_time,
       recovery_status
FROM   v$pdbs
ORDER  BY con_id;

常见的 OPEN_MODE:

  • MOUNTED:PDB 已挂载但未打开;
  • READ WRITE:可读写;
  • READ ONLY:只读;
  • MIGRATE:升级或迁移脚本使用的特殊模式。

3.4 切换容器

公共用户具备 SET CONTAINER 权限后,可以在同一会话中切换容器。

--切换到PBD  xfpdb中
SQL@xfcdb >ALTER SESSION SET CONTAINER = xfpdb;
SHOW CON_NAME;
--切换到根容器 CDB$ROOT
SQL@xfcdb >ALTER SESSION SET CONTAINER = CDB$ROOT;
SHOW CON_NAME;

本地用户只能连接其所属 PDB,不能通过 ALTER SESSION 切换到其他容器。


4. CDB与PDB启停

4.1 启动CDB

sqlplus / as sysdba

STARTUP;

CDB 启动后,CDB$ROOT 会打开,PDB$SEED 通常以只读方式打开。用户 PDB 默认可能仍处于 MOUNTED 状态。

4.2 打开单个PDB

执行位置:CDB$ROOT。

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb OPEN READ WRITE;

打开后检查:

SQL@xfcdb >SELECT name, open_mode, restricted
FROM   v$pdbs
WHERE  name = 'XFPDB';

4.3 以只读或受限方式打开

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb CLOSE IMMEDIATE;
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb OPEN READ ONLY;

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb CLOSE IMMEDIATE;
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb OPEN READ WRITE RESTRICTED;

4.4 关闭PDB

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb CLOSE IMMEDIATE;

如果当前会话已经连接到 xfpdb,也可以执行:

SQL@xfcdb >ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE;

4.5 批量打开或关闭PDB

SQL@xfcdb >ALTER PLUGGABLE DATABASE ALL OPEN;

SQL@xfcdb >ALTER PLUGGABLE DATABASE ALL
  EXCEPT xfpdb1, xfpdb2
  OPEN;

ALTER PLUGGABLE DATABASE ALL CLOSE IMMEDIATE;

4.6 保存PDB启动状态

PDB 打开后,如果没有保存状态,CDB 重启后它通常会回到 MOUNTED。

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb SAVE STATE;

检查保存状态:

SQL@xfcdb >SELECT con_name, instance_name, state
FROM   dba_pdb_saved_states
ORDER  BY con_name, instance_name;

取消保存:

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb DISCARD STATE;

RAC 环境中 PDB 打开状态与实例有关。使用 SAVE STATE 前应明确 PDB 计划在哪些实例打开,服务也应由 SRVCTL 统一管理。


5. 创建PDB

5.1 创建前检查

执行位置:CDB$ROOT。

SQL@xfcdb >SHOW CON_NAME;

SQL@xfcdb >SELECT name, value
FROM   v$parameter
WHERE  name IN ('db_create_file_dest', 'pdb_file_name_convert');

SQL@xfcdb >SELECT con_id, file_name
FROM   cdb_data_files
WHERE  con_id = 2
ORDER  BY file_id;

如果配置了 DB_CREATE_FILE_DEST,优先使用 Oracle Managed Files。没有使用 OMF 时,应确认 PDB$SEED 的实际目录,再设置 FILE_NAME_CONVERT。

5.2 使用OMF创建PDB

SQL@xfcdb >CREATE PLUGGABLE DATABASE xfpdb
  ADMIN USER xfpdb_admin IDENTIFIED BY <password>
  ROLES = (DBA);

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb OPEN READ WRITE;
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb SAVE STATE;

示例为便于演示给 PDB 管理员授予 DBA 角色。生产环境应根据职责收敛权限,并使用符合单位口令策略的密码。

5.3 非OMF环境创建PDB

SQL@xfcdb >CREATE PLUGGABLE DATABASE xfpdb
  ADMIN USER xfpdb_admin IDENTIFIED BY  <password>
  ROLES = (DBA)
  FILE_NAME_CONVERT =
    ('/u01/oradata/xfcdb/pdbseed/',
     '/u01/oradata/xfcdb/xfpdb/');

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb OPEN READ WRITE;
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb SAVE STATE;

不要直接照抄示例路径。先查询 PDB$SEED 文件位置,并确认目标目录、文件系统空间和属主权限,password密码按照要求自行设置。

5.4 创建后检查

SQL@xfcdb >SELECT pdb_id, pdb_name, status, creation_time
FROM   cdb_pdbs
WHERE  pdb_name = 'XFPDB';

SQL@xfcdb >SELECT con_id, tablespace_name, file_name,
       bytes / 1024 / 1024 AS size_mb
FROM   cdb_data_files
WHERE  con_id = (
         SELECT con_id FROM v$pdbs WHERE name = 'XFPDB'
       )
ORDER  BY tablespace_name, file_name;

新建 PDB 必须至少打开一次 READ WRITE,Oracle 才能完成与 CDB 的集成。


6. 删除PDB

6.1 保留数据文件

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb CLOSE IMMEDIATE;
SQL@xfcdb >DROP PLUGGABLE DATABASE xfpdb KEEP DATAFILES;

KEEP DATAFILES 只从 CDB 中移除 PDB 元数据,数据文件仍保留,可用于后续重新插入。

6.2 同时删除数据文件

--关闭PDB xfpdb
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb CLOSE IMMEDIATE;
--drop pdb
SQL@xfcdb >DROP PLUGGABLE DATABASE xfpdb INCLUDING DATAFILES;

INCLUDING DATAFILES 会删除 PDB 数据文件,属于高风险操作。 执行前应确认备份、PDB 名称、容器、文件位置和审批单,不能只凭命令历史直接执行。

说明:生产环境drop pdb前一定要做好备份。


7. 检查Local Undo模式

热克隆、在线迁移以及部分 PDB 级恢复能力依赖 Local Undo。

执行位置:CDB$ROOT。

SQL@xfcdb >SELECT property_name, property_value
FROM   database_properties
WHERE  property_name = 'LOCAL_UNDO_ENABLED';

PROPERTY_VALUE 为 TRUE 表示启用了 Local Undo。

切换 Local Undo 模式需要维护窗口:

SQL@xfcdb >SHUTDOWN IMMEDIATE;
SQL@xfcdb >STARTUP UPGRADE;

SQL@xfcdb >ALTER DATABASE LOCAL UNDO ON;

SQL@xfcdb >SHUTDOWN IMMEDIATE;
SQL@xfcdb >STARTUP;

执行前应检查补丁级别、备份、PDB 状态和回退方案。RAC 环境还要按照集群停启流程操作。


8. 公共用户与本地用户

8.1 创建公共管理用户

执行位置:CDB$ROOT。

--创建公共用户 c##xf_admin
SQL@xfcdb >CREATE USER c##xf_admin
  IDENTIFIED BY <password>
  CONTAINER = ALL;

--向公共用户c##xf_admin授权
SQL@xfcdb >GRANT CREATE SESSION, SET CONTAINER
  TO c##xf_admin
  CONTAINER = ALL;

公共用户默认以 C## 开头。CONTAINER=ALL 表示公共授权适用于当前及后续容器。

8.2 创建PDB本地用户

执行位置:xfpdb。

--切换到PDB  xfpdb
SQL@xfcdb >ALTER SESSION SET CONTAINER = xfpdb;

--创建本地用户  xf_app
SQL@xfcdb >CREATE USER xf_app
  IDENTIFIED BY  <password>
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA 10G ON users;

--向本地用户xf_app授权
SQL@xfcdb >GRANT CREATE SESSION,
      CREATE TABLE,
      CREATE VIEW,
      CREATE PROCEDURE,
      CREATE SEQUENCE
TO xf_app;

业务用户应建在 PDB 中。不要为了方便在 CDB$ROOT 创建业务 Schema,也不要默认给业务用户授予 DBA 或 UNLIMITED TABLESPACE。

8.3 查看用户属于哪个容器

执行位置:CDB$ROOT。

SQL@xfcdb >SELECT con_id, username, common, oracle_maintained, account_status
FROM   cdb_users
WHERE  username IN ('C##XF_ADMIN', 'XF_APP')
ORDER  BY con_id, username;

9. 表空间、数据文件和参数

9.1 在PDB中创建表空间

SQL@xfcdb >ALTER SESSION SET CONTAINER = xfpdb;

SQL@xfcdb >CREATE TABLESPACE xf_data
  DATAFILE '/u01/oradata/xfcdb/xfpdb/xf_data01.dbf'
  SIZE 30G
  AUTOEXTEND OFF;

ASM 或 OMF 环境可省略具体文件名:

SQL@xfcdb >CREATE TABLESPACE xf_data
  DATAFILE SIZE 30G
  AUTOEXTEND OFF;

9.2 查看各PDB表空间使用情况

执行位置:CDB$ROOT。

SQL@xfcdb >SELECT c.name AS pdb_name,
       d.tablespace_name,
       ROUND(SUM(d.bytes) / 1024 / 1024 / 1024, 2) AS allocated_gb
FROM   cdb_data_files d
JOIN   v$containers c
       ON c.con_id = d.con_id
GROUP  BY c.name, d.tablespace_name
ORDER  BY c.name, d.tablespace_name;

9.3 查看PDB可修改参数

SQL@xfcdb >SELECT name, value, ispdb_modifiable
FROM   v$system_parameter
WHERE  ispdb_modifiable = 'TRUE'
ORDER  BY name;

9.4 设置PDB级参数

SQL@xfcdb >ALTER SESSION SET CONTAINER = xfpdb;

SQL@xfcdb >ALTER SYSTEM SET ddl_lock_timeout = 30 SCOPE = BOTH;

检查:

SQL@xfcdb >SHOW PARAMETER ddl_lock_timeout;

只有 ISPDB_MODIFIABLE=TRUE 的参数才能在 PDB 级覆盖。PDB 关闭时,某些场景会继承 CDB 级参数;Data Guard 环境还要检查主备两侧的 PDB 参数和 ASM 磁盘组名称是否一致。

9.5 设置PDB存储上限

执行位置:CDB$ROOT。

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb
  STORAGE (MAXSIZE 100G);

10. PDB服务管理

应用应连接 PDB 服务,不应把 CDB 根服务当作业务连接入口。

10.1 查询服务

SQL@xfcdb >SELECT con_id, name, network_name, pdb
FROM   cdb_services
ORDER  BY con_id, name;

10.2 Oracle Restart或RAC创建服务

Oracle 19c 已不建议客户通过 SERVICE_NAMES 参数管理服务。Oracle Restart 或 RAC 环境优先使用 SRVCTL。

--添加service xfpdb_svc   
srvctl add service -db xfcdb -service xfpdb_svc -pdb xfpdb
--启动service xfpdb_svc
srvctl start service -db xfcdb -service xfpdb_svc
--检查service xfpdb_svc状态
srvctl status service -db xfcdb -service xfpdb_svc
-检查service xfpdb_svc配置
srvctl config service -db xfcdb -service xfpdb_svc

RAC 环境还应根据部署方式设置 preferred、available、role、policy 等属性。

10.3 测试PDB连接

sqlplus system@//dbhost.example.com:1521/xfpdb_svc

连接后必须核对:

SQL@xfcdb >SHOW CON_NAME;

11. 本地克隆PDB

下面示例在 xfcdb 中把 xfpdb1 克隆为 xfpdb2。

11.1 冷克隆

执行位置:CDB$ROOT。

--关闭PDB xfpdb1
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb1 CLOSE IMMEDIATE;
--将PDB xfpdb1启动到read only状态
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb1 OPEN READ ONLY;

--通过冷克隆方式创建PDB xfpdb2
SQL@xfcdb >CREATE PLUGGABLE DATABASE xfpdb2
  FROM xfpdb1
  FILE_NAME_CONVERT =
    ('/u01/oradata/xfcdb/xfpdb1/',
     '/u01/oradata/xfcdb/xfpdb2/');

--关闭PDB xfpdb1
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb1 CLOSE IMMEDIATE;
--将PDB xfpdb1 启动到read write状态
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb1 OPEN READ WRITE;

--将PDB xfpdb2 启动到read write状态
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb2 OPEN READ WRITE;
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb2 SAVE STATE;

11.2 热克隆

如果 CDB 已启用归档模式和 Local Undo,Oracle 19c 可在源 PDB 保持 READ WRITE 时克隆:

SQL@xfcdb >CREATE PLUGGABLE DATABASE xfpdb2
  FROM xfpdb1
  FILE_NAME_CONVERT =
    ('/u01/oradata/xfcdb/xfpdb1/',
     '/u01/oradata/xfcdb/xfpdb2/');

ALTER PLUGGABLE DATABASE xfpdb2 OPEN READ WRITE;

执行前检查:

SQL@xfcdb >SELECT log_mode FROM v$database;

SQL@xfcdb >SELECT property_value
FROM   database_properties
WHERE  property_name = 'LOCAL_UNDO_ENABLED';

克隆期间要监控数据文件复制进度、归档空间、I/O 和源库业务负载。


12. 远程克隆PDB

场景:从 xfcdb1 的 xfpdb1 克隆到 xfcdb2,目标 PDB 名为 xfpdb2。

12.1 源CDB创建克隆用户

执行位置:xfcdb1 的 CDB$ROOT。

SQL@xfcdb >CREATE USER c##xf_clone
  IDENTIFIED BY  <password>
  CONTAINER = ALL;

SQL@xfcdb >GRANT CREATE SESSION,
      CREATE PLUGGABLE DATABASE
TO c##xf_clone
CONTAINER = ALL;

12.2 目标CDB创建数据库链路

执行位置:xfcdb2 的 CDB$ROOT。

SQL@xfcdb >CREATE DATABASE LINK xfcdb1_clone_link
  CONNECT TO c##xf_clone
  IDENTIFIED BY  <password>
  USING 'xfcdb1_root_service';

验证链路:

SQL@xfcdb >SQL@xfcdb >SELECT name, cdb
FROM   v$database@xfcdb1_clone_link;

12.3 执行远程克隆

SQL@xfcdb >CREATE PLUGGABLE DATABASE xfpdb2
  FROM xfpdb1@xfcdb1_clone_link
  FILE_NAME_CONVERT =
    ('/u01/oradata/xfcdb1/xfpdb1/',
     '/u01/oradata/xfcdb2/xfpdb2/');

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb2 OPEN READ WRITE;
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb2 SAVE STATE;

如果源库不满足热克隆条件,需要将源 PDB 切换为 READ ONLY。生产执行前还应检查字符集、数据库版本、补丁、字节序、组件状态和网络吞吐量。


13. 拔出与插入PDB

13.1 从xfcdb1拔出xfpdb1

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb1 CLOSE IMMEDIATE;

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb1
  UNPLUG INTO '/u01/backup/xfpdb1.xml';

SQL@xfcdb >DROP PLUGGABLE DATABASE xfpdb1 KEEP DATAFILES;

XML 文件只保存 PDB 元数据,不包含实际业务数据。必须同时保护好数据文件。

–生产环境DROP PDB一定要做好备份

13.2 在xfcdb2检查兼容性

执行位置:xfcdb2 的 CDB$ROOT。

SET SERVEROUTPUT ON

DECLARE
  l_compatible BOOLEAN;
BEGIN
  l_compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
                    pdb_descr_file => '/u01/backup/xfpdb1.xml',
                    pdb_name       => 'XFPDB2');

  IF l_compatible THEN
    DBMS_OUTPUT.PUT_LINE('COMPATIBLE=YES');
  ELSE
    DBMS_OUTPUT.PUT_LINE('COMPATIBLE=NO');
  END IF;
END;
/

查询未解决问题:

SQL@xfcdb >SELECT time,
       name,
       cause,
       type,
       message,
       status,
       action
FROM   pdb_plug_in_violations
WHERE  name = 'XFPDB2'
AND    status <> 'RESOLVED'
ORDER  BY time;

13.3 插入PDB

共享存储且文件位置不变时,可使用 NOCOPY:

SQL@xfcdb >CREATE PLUGGABLE DATABASE xfpdb2
  USING '/u01/backup/xfpdb1.xml'
  NOCOPY
  TEMPFILE REUSE;

需要复制到新目录时:

SQL@xfcdb >CREATE PLUGGABLE DATABASE xfpdb2
  USING '/u01/backup/xfpdb1.xml'
  COPY
  FILE_NAME_CONVERT =
    ('/u01/oradata/xfcdb1/xfpdb1/',
     '/u01/oradata/xfcdb2/xfpdb2/');

打开并检查:

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb2 OPEN READ WRITE;
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb2 SAVE STATE;

SQL@xfcdb >SELECT name, cause, type, message, status
FROM   pdb_plug_in_violations
WHERE  name = 'XFPDB2'
AND    status <> 'RESOLVED'
ORDER  BY time;

出现 WARNING 不代表可以直接忽略。需要结合 MESSAGE 和 ACTION 判断是否影响组件、补丁、安全或业务功能。


14. 在线迁移PDB

场景:将 xfcdb1 中的 xfpdb1 在线迁移到 xfcdb2。

主要前提包括:

  • 源 CDB 和目标 CDB 的版本、补丁及组件兼容;
  • 源 PDB 使用 Local Undo;
  • 网络和数据库链路稳定;
  • 目标端空间充足;
  • 提前迁移或创建 PDB 服务;
  • 已准备回退方案。

在 xfcdb2 的 CDB$ROOT 建立指向 xfcdb1 的数据库链路后执行:

SQL@xfcdb >CREATE PLUGGABLE DATABASE xfpdb1
  FROM xfpdb1@xfcdb1_reloc_link
  RELOCATE AVAILABILITY MAX;

在目标端打开 PDB 完成切换:

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb1 OPEN READ WRITE;

随后检查:

SQL@xfcdb >SELECT name, open_mode
FROM   v$pdbs
WHERE  name = 'XFPDB1';

SQL@xfcdb >SELECT name, cause, type, message, status
FROM   pdb_plug_in_violations
WHERE  name = 'XFPDB1'
AND    status <> 'RESOLVED'
ORDER  BY time;

在线迁移不等于没有停顿。最终打开目标 PDB 时仍会发生会话切换。生产方案必须包含服务切换、连接池重连、长事务处理、应用验证以及源端 tombstone PDB 的后续清理。


15. 日常查询与监控

15.1 查询所有容器

SQL@xfcdb >SELECT con_id, name, open_mode
FROM   v$containers
ORDER  BY con_id;

15.2 查询各PDB数据文件

SQL@xfcdb >SELECT c.name AS pdb_name,
       d.tablespace_name,
       d.file_name,
       ROUND(d.bytes / 1024 / 1024 / 1024, 2) AS size_gb,
       d.autoextensible
FROM   cdb_data_files d
JOIN   v$containers c
       ON c.con_id = d.con_id
ORDER  BY c.name, d.tablespace_name, d.file_name;

15.3 查询各PDB会话数

SQL@xfcdb >SELECT con_id, COUNT(*) AS session_count
FROM   v$session
WHERE  type = 'USER'
GROUP  BY con_id
ORDER  BY con_id;

与容器名称关联:

SQL@xfcdb >SELECT c.name AS pdb_name,
       COUNT(s.sid) AS session_count
FROM   v$containers c
LEFT JOIN v$session s
       ON s.con_id = c.con_id
      AND s.type = 'USER'
GROUP  BY c.name
ORDER  BY c.name;

15.4 查询各PDB无效对象

SQL@xfcdb >SELECT con_id, owner, object_type, COUNT(*) AS invalid_count
FROM   cdb_objects
WHERE  status = 'INVALID'
GROUP  BY con_id, owner, object_type
ORDER  BY con_id, owner, object_type;

15.5 查询PDB参数差异

SQL@xfcdb >SELECT con_id, name, value
FROM   v$system_parameter
WHERE  con_id > 0
AND    name IN ('open_cursors',
                'processes',
                'ddl_lock_timeout',
                'db_create_file_dest')
ORDER  BY name, con_id;

15.6 定位PDB中的阻塞会话

SQL@xfcdb >SELECT con_id,
       sid,
       serial#,
       username,
       event,
       blocking_session,
       sql_id,
       status
FROM   v$session
WHERE  blocking_session IS NOT NULL
ORDER  BY con_id, sid;

终止会话前必须核对 CON_ID、用户名、事务和业务影响:

SQL@xfcdb >ALTER SYSTEM KILL SESSION '123,4567' IMMEDIATE;

15.7 CDB视图的使用提醒

CDB_* 视图包含 CON_ID,可从根容器查看多个容器的数据。但查询结果受权限、CONTAINER_DATA 属性、PDB 打开状态和 RAC 实例影响。受限模式或未打开的 PDB 可能不会返回完整信息。


16. RMAN备份与恢复

16.1 备份整个CDB

RMAN> CONNECT TARGET /;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

16.2 备份单个PDB

从 CDB$ROOT 连接 RMAN:

RMAN> BACKUP PLUGGABLE DATABASE xfpdb PLUS ARCHIVELOG;

也可以直接连接到 PDB 服务,再执行:

RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

无论使用哪种方式,都要确保备份策略包含恢复所需归档日志,并实际做过恢复演练。

16.3 恢复单个PDB

RMAN> SQL 'ALTER PLUGGABLE DATABASE xfpdb CLOSE IMMEDIATE';
RMAN> RESTORE PLUGGABLE DATABASE xfpdb;
RMAN> RECOVER PLUGGABLE DATABASE xfpdb;
RMAN> SQL 'ALTER PLUGGABLE DATABASE xfpdb OPEN';

16.4 PDB时间点恢复

RMAN> SQL 'ALTER PLUGGABLE DATABASE xfpdb CLOSE IMMEDIATE';

RMAN> RECOVER PLUGGABLE DATABASE xfpdb
      UNTIL TIME "TO_DATE('2026-10-26 10:00:00',
                          'YYYY-MM-DD HH24:MI:SS')"
      AUXILIARY DESTINATION '/u02/rman_aux';

RMAN> SQL 'ALTER PLUGGABLE DATABASE xfpdb OPEN RESETLOGS';

恢复前应核对目标时间、归档完整性、辅助目录空间以及恢复对其他 PDB 的影响。


17. Data Pump必须连接PDB服务

导出或导入业务 Schema 时,应连接 xfpdb 的服务。

expdp C##BACKUPUSER@//dbhost.example.com:1521/xfpdb_svc \
  schemas=XF_APP \
  directory=DATA_PUMP_DIR \
  dumpfile=xf_app_%U.dmp \
  logfile=xf_app_exp.log \
  parallel=4 logtime=all

impdp C##BACKUPUSER@//dbhost.example.com:1521/xfpdb_svc \
  directory=DATA_PUMP_DIR \
  dumpfile=xf_app_%U.dmp \
  logfile=xf_app_imp.log \
  parallel=4 logtime=all
  • expdp和impdp操作统一使用公共用户C##BACKUPUSER
  • 执行前先用同一个连接串登录并检查 SHOW CON_NAME。连接到 CDB 根服务后再导入,容易造成对象建错位置或出现权限错误。

18. 常见故障与处理思路

18.1 CDB重启后PDB没有自动打开

检查:

SQL@xfcdb >SELECT con_name, instance_name, state
FROM   dba_pdb_saved_states;

处理:

SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb OPEN;
SQL@xfcdb >ALTER PLUGGABLE DATABASE xfpdb SAVE STATE;

如果使用 Oracle Restart 或 RAC,还要检查 PDB 服务和集群资源配置。

18.2 ORA-65011:PDB不存在

常见原因:

  • 连接到了错误的 CDB;
  • PDB 名称拼写错误;
  • PDB 已经拔出或删除;
  • 查询和执行命令不在 CDB$ROOT。

先执行:

SQL@xfcdb >SELECT name, cdb FROM v$database;
SQL@xfcdb >SHOW CON_NAME;
SQL@xfcdb >SHOW PDBS;

18.3 ORA-65040:当前容器不允许执行该操作

命令执行位置不正确。需要判断该操作属于:

  • CDB 级操作:切换到 CDB$ROOT;
  • PDB 级操作:连接或切换到 xfpdb;
  • 公共用户操作:在根容器使用 CONTAINER=ALL;
  • 本地用户操作:在目标 PDB 使用 CONTAINER=CURRENT。

18.4 PDB打开时出现告警

SQL@xfcdb >SELECT time, name, cause, type, message, status, action
FROM   pdb_plug_in_violations
WHERE  name = 'XFPDB'
AND    status <> 'RESOLVED'
ORDER  BY time;

重点检查版本、组件、补丁、字符集和参数差异。必要时运行 datapatch,并再次检查违规项。

18.5 服务存在但连接不到PDB

依次检查:

srvctl status database -db xfcdb
srvctl status service -db xfcdb
lsnrctl status
SQL@xfcdb >SELECT name, open_mode
FROM   v$pdbs
WHERE  name = 'XFPDB';

SQL@xfcdb >SELECT name, network_name, pdb
FROM   cdb_services
WHERE  pdb = 'XFPDB';

同时检查客户端连接串是否使用了 SERVICE_NAME,而不是把 PDB 名误写成 SID。


19. 生产操作检查单

操作前

  • 确认当前 CDB 名称和容器;
  • 记录 PDB 状态、服务、会话和数据文件;
  • 检查 Local Undo、归档模式和补丁;
  • 检查磁盘、ASM 和 FRA 空间;
  • 确认备份可用并具备回退方案;
  • 通知应用侧处理连接池和长事务;
  • 对删除、插拔、迁移和恢复操作完成审批。

操作中

  • 持续查看 alert 日志;
  • 监控归档、I/O、网络和复制进度;
  • 避免在同一时间进行大批量备份、统计信息收集或数据装载;
  • 每一步执行后立即验证结果,不连续粘贴整段高风险命令。

操作后

  • 检查 V$PDBS 和 PDB_PLUG_IN_VIOLATIONS;
  • 检查服务注册和应用连接;
  • 检查无效对象、组件状态及关键业务对象;
  • 保存 PDB 状态;
  • 补做备份并更新配置台账;
  • 对迁移场景确认源端残留 PDB、服务和文件是否按计划处理。

20. 常用命令速查

-- 当前容器
SHOW CON_NAME;

-- 所有PDB
SHOW PDBS;

-- 切换到PDB
ALTER SESSION SET CONTAINER = xfpdb;

-- 返回根容器
ALTER SESSION SET CONTAINER = CDB$ROOT;

-- 打开PDB
ALTER PLUGGABLE DATABASE xfpdb OPEN;

-- 关闭PDB
ALTER PLUGGABLE DATABASE xfpdb CLOSE IMMEDIATE;

-- 保存启动状态
ALTER PLUGGABLE DATABASE xfpdb SAVE STATE;

-- 查看Local Undo
SELECT property_value
FROM   database_properties
WHERE  property_name = 'LOCAL_UNDO_ENABLED';

-- 查看未解决的插入兼容性问题
SELECT name, cause, type, message, status
FROM   pdb_plug_in_violations
WHERE  status <> 'RESOLVED'
ORDER  BY time;

21. 参考资料

  1. Oracle Database 19c:Introduction to the Multitenant Architecture
  2. Oracle Database 19c:Overview of PDB Creation
  3. Oracle Database 19c:Administering PDBs
  4. Oracle Database 19c:Plugging In an Unplugged PDB
  5. Oracle Database 19c:Relocating a PDB
  6. Oracle Database 19c:Backing Up the Database
  7. Oracle 19c 多租户数据库管理OCP课件

许可说明:Oracle Multitenant 的功能可用范围和 PDB 数量限制可能与 Edition、授权及部署方式有关。正式上线前应核对当前有效的 Oracle Database Licensing Information User Manual 和采购合同。


MyBologs:

https://www.myhfxf.com

https://www.xiaofeihuangfu.com

CSDN:https://blog.csdn.net/xfhuangfu

ITPUB:https://blog.itpub.net/28373936/

微信公众号:xfhuangfu