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

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中的三个核心容器

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. 参考资料
- Oracle Database 19c:Introduction to the Multitenant Architecture
- Oracle Database 19c:Overview of PDB Creation
- Oracle Database 19c:Administering PDBs
- Oracle Database 19c:Plugging In an Unplugged PDB
- Oracle Database 19c:Relocating a PDB
- Oracle Database 19c:Backing Up the Database
- Oracle 19c 多租户数据库管理OCP课件
许可说明:Oracle Multitenant 的功能可用范围和 PDB 数量限制可能与 Edition、授权及部署方式有关。正式上线前应核对当前有效的 Oracle Database Licensing Information User Manual 和采购合同。
MyBologs:
https://www.xiaofeihuangfu.com
CSDN:https://blog.csdn.net/xfhuangfu
ITPUB:https://blog.itpub.net/28373936/
微信公众号:xfhuangfu