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
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. PDB Snapshot Carousel
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';
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. 最佳实践
- CDB 架构:12c+
- Common/Local 区分:清晰
- 资源隔离:PDB 级
- Application Container:多租户应用
- Snapshot Carousel:快速克隆
- Relocate:最小停机
- SAVE STATE:自动启动
- PDB 级备份:精细
- 监控:资源
- 文档化:架构
16. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Multitenant” https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/