Oracle 多租户深度解析

Oracle 多租户深度解析

适用版本:Oracle Database 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

多租户架构(CDB/PDB)是 12c+ 重要特性[1]:

结构

  • CDB$ROOT:根容器
  • PDB$SEED:种子 PDB
  • Application Root
  • Application PDB
  • User PDB

详细见:Oracle 多租户 CDB/PDB 管理


2. CDB 架构

2.1 组件

CDB
├── CDB$ROOT (Root Container)
│   ├── SYSTEM
│   ├── SYSAUX
│   ├── UNDO
│   └── REDO
├── PDB$SEED (Seed PDB)
│   └── 只读模板
├── Application Root
│   └── Application PDBs
└── User PDBs
    ├── HR PDB
    ├── FIN PDB
    └── SALES PDB

2.2 通用

  • 控制文件
  • Redo 日志
  • UNDO 表空间(19c 共享)
  • 归档日志
  • 监听器

3. PDB 创建

3.1 默认

CREATE PLUGGABLE DATABASE hrpdb 
  ADMIN USER pdbadmin IDENTIFIED BY ******
  FILE_NAME_CONVERT=('/u01/oradata/pdbseed/', '/u01/oradata/hrpdb/')
  DEFAULT TABLESPACE users
  STORAGE (MAXSIZE 50G);

3.2 克隆

-- 本地
CREATE PLUGGABLE DATABASE hrpdb_clone FROM hrpdb
  FILE_NAME_CONVERT=('/u01/oradata/hrpdb/', '/u01/oradata/hrpdb_clone/');

-- 远程
CREATE DATABASE LINK source_link ...;
CREATE PLUGGABLE DATABASE hrpdb FROM hrpdb@source_link
  FILE_NAME_CONVERT=('/u01/oradata/source/hrpdb/', '/u01/oradata/hrpdb/');

3.3 插入

-- 1. 拔出
ALTER PLUGGABLE DATABASE hrpdb CLOSE;
ALTER PLUGGABLE DATABASE hrpdb UNPLUG INTO '/u01/hrpdb.xml';

-- 2. 插入
CREATE PLUGGABLE DATABASE hrpdb USING '/u01/hrpdb.xml'
  SOURCE_FILE_NAME_CONVERT=('/u01/oradata/source/', '/u01/oradata/hrpdb/')
  FILE_NAME_CONVERT=('/u01/oradata/source/', '/u01/oradata/hrpdb/')
  NOCOPY;

4. PDB 操作

4.1 切换

ALTER SESSION SET CONTAINER = hrpdb;
-- 或
ALTER SESSION SET CONTAINER = CDB$ROOT;

4.2 启动/停止

-- 启动
ALTER PLUGGABLE DATABASE hrpdb OPEN;
ALTER PLUGGABLE DATABASE ALL OPEN;

-- 停止
ALTER PLUGGABLE DATABASE hrpdb CLOSE;
ALTER PLUGGABLE DATABASE ALL CLOSE;

-- 保存状态
ALTER PLUGGABLE DATABASE hrpdb SAVE STATE;

4.3 修改

ALTER PLUGGABLE DATABASE hrpdb 
  DEFAULT TABLESPACE users
  STORAGE (MAXSIZE 100G);

4.4 删除

DROP PLUGGABLE DATABASE hrpdb INCLUDING DATAFILES;

5. Common User vs Local User

5.1 Common User

-- CDB 级
CREATE USER c##admin IDENTIFIED BY ****** CONTAINER=ALL;
GRANT DBA TO c##admin CONTAINER=ALL;

5.2 Local User

ALTER SESSION SET CONTAINER = hrpdb;
CREATE USER alice IDENTIFIED BY ****** CONTAINER=CURRENT;
GRANT CONNECT, RESOURCE TO alice;

6. 权限管理

6.1 Common

-- Common 权限(所有容器)
GRANT CREATE SESSION TO c##admin CONTAINER=ALL;

-- Common 角色
CREATE ROLE c##app_role CONTAINER=ALL;
GRANT c##app_role TO c##admin CONTAINER=ALL;

6.2 Local

ALTER SESSION SET CONTAINER = hrpdb;
GRANT SELECT ON employees TO alice;

7. 资源管理

7.1 PDB 资源

ALTER PLUGGABLE DATABASE hrpdb 
  STORAGE (MAXSIZE 50G MAX_SHARED_TEMP_SIZE 5G)
  MEMORY_LIMIT 10G
  CPU_COUNT 4;

7.2 Resource Manager

BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
  
  DBMS_RESOURCE_MANAGER.CREATE_PLAN(
    plan => 'hrpdb_plan',
    comment => 'HR PDB plan'
  );
  
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'hrpdb_high',
    comment => 'High priority'
  );
  
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'hrpdb_plan',
    group_or_subplan => 'hrpdb_high',
    mgmt_p1 => 80
  );
  
  DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
  DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;
END;
/

ALTER PLUGGABLE DATABASE hrpdb SET DB_PERFORMANCE_PROFILE = 'hrpdb_plan';

8. Application Container

8.1 创建

-- Application Root
CREATE PLUGGABLE DATABASE approot AS APPLICATION 
  ADMIN USER appadmin IDENTIFIED BY ******
  FILE_NAME_CONVERT=('/u01/oradata/pdbseed/', '/u01/oradata/approot/');

ALTER SESSION SET CONTAINER = approot;

-- 安装应用
ALTER PLUGGABLE DATABASE APPLICATION app BEGIN INSTALL '1.0';
-- DDL
CREATE TABLE app_data (...);
ALTER PLUGGABLE DATABASE APPLICATION app END INSTALL;

8.2 Application PDB

CREATE PLUGGABLE DATABASE apppdb 
  ADMIN USER pdbadmin IDENTIFIED BY ******
  AS APPLICATION
  FILE_NAME_CONVERT=('/u01/oradata/pdbseed/', '/u01/oradata/apppdb/');

ALTER SESSION SET CONTAINER = apppdb;
ALTER PLUGGABLE DATABASE APPLICATION app SYNC;

8.3 升级

ALTER SESSION SET CONTAINER = approot;
ALTER PLUGGABLE DATABASE APPLICATION app BEGIN UPGRADE '1.0' TO '1.1';
-- DDL
ALTER PLUGGABLE DATABASE APPLICATION app END UPGRADE;

-- Application PDB 同步
ALTER SESSION SET CONTAINER = apppdb;
ALTER PLUGGABLE APPLICATION app SYNC;

9.1 启用

ALTER PLUGGABLE DATABASE hrpdb SNAPSHOT MODE EVERY 24 HOURS;

9.2 查看

SELECT con_id, snapshot_name, snapshot_time 
FROM dba_pdb_snapshots;

9.3 创建快照 PDB

CREATE PLUGGABLE DATABASE hrpdb_snap FROM hrpdb
  SNAPSHOT COPY;

详细见:Oracle PDB 管理最佳实践


10. PDB Relocate

10.1 概述

  • 最小停机迁移
  • 在线

10.2 执行

CREATE DATABASE LINK source_link ...;
CREATE PLUGGABLE DATABASE hrpdb FROM hrpdb@source_link RELOCATE
  AVAILABILITY MAX;

11. PDB 监控

11.1 状态

SELECT 
  con_id, name, open_mode, restricted, 
  status, application_root, application_pdb
FROM v$pdbs;

11.2 资源

SELECT 
  con_id, name, 
  cpu_count, memory_limit, storage_limit
FROM v$pdbs;

11.3 性能

SELECT 
  con_id, 
  ROUND(cpu_consumed_time / 1000, 2) AS cpu_seconds,
  avg_active_sessions
FROM v$rsrc_pdb;

12. 23ai 强制 CDB

12.1 概述

  • 23ai 仅 CDB
  • 非 CDB 废弃

12.2 影响

- 必须使用 CDB
- PDB 是单元
- 资源隔离

13. 备份恢复

13.1 RMAN

-- 备份 PDB
RMAN> BACKUP PLUGGABLE DATABASE hrpdb;

-- 备份 CDB
RMAN> BACKUP DATABASE;

-- 恢复 PDB
RMAN> RESTORE PLUGGABLE DATABASE hrpdb;
RMAN> RECOVER PLUGGABLE DATABASE hrpdb;

13.2 PITR

RMAN> RECOVER PLUGGABLE DATABASE hrpdb 
  UNTIL TIME "..." AUXILIARY DESTINATION '/u01/aux';

详细见:Oracle 数据库 PITR 时间点恢复


14. 常见坑与排错

14.1 ORA-65096

- Common User 必须 c## 前缀

14.2 ORA-65049

- 23ai 强制 CDB
- 必须创建 CDB

14.3 ORA-65122

- PDB 不存在
- 检查名字
- 切换容器

14.4 PDB 不自动启动

ALTER PLUGGABLE DATABASE hrpdb SAVE STATE;

15. 最佳实践

  1. CDB 架构:12c+
  2. Common/Local 区分:清晰
  3. 资源隔离:PDB 级
  4. Application Container:多租户应用
  5. Snapshot Carousel:快速克隆
  6. Relocate:最小停机
  7. SAVE STATE:自动启动
  8. PDB 级备份:精细
  9. 监控:资源
  10. 文档化:架构

16. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Multitenant” https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/