数据库教程FGMT19‑Oracle多租户容器架构与新特性总结

前言

Oracle从12c版本正式推出多租户Multitenant容器数据库架构,改变了传统独立数据库实例的部署模式。一套CDB容器数据库内部可以托管多个PDB可插拔数据库,实现数据库资源整合、快速克隆、插拔迁移、统一补丁升级,为私有云、数据库整合场景提供底层架构支撑。同时Oracle历经9i、10g、11g、12c、18c、19c、21c、26ai多个版本迭代,每个版本均带来大量性能、高可用、安全、开发相关新特性。风哥教程本文围绕Oracle各版本演进、多租户CDB/PDB底层架构、核心概念、版本之间多租户功能差异、多租户典型业务场景、全套运维实操命令、non‑CDB向PDB迁移改造完整流程展开讲解。风哥 itpux‑com

本套风哥教程面向DBA、数据库架构师、运维工程师,全部实验标准化环境配置:主机名称fgedu‑net‑cn ,硬件规格64G物理内存、8颗CPU;CDB容器数据库实例名fgedudb,数据库名fgedudb,测试业务用户名fgedu,文件根目录统一为/fgedudb,整套实验基于Oracle19c企业版多租户架构完成。风哥教程本文分为前言大纲介绍、核心理论知识、实战操作演练、总结四大模块;实战章节包含大量可直接复制运行操作系统Shell、PL/SQL脚本,读者可以在测试环境复现多租户全套操作,掌握CDB/PDB日常运维、PDB克隆插拔、传统单机库迁移PDB整套技术。网上搜索风哥教程可以学习全套数据库教程

内容大纲

  1. Oracle数据库版本演进路线,9i/10g/11g/12c/18c/19c/21c/26ai版本定位与核心新特性概览
  2. Oracle多租户CDB/PDB容器架构基础概念,CDBROOT、PDBROOT、PDBROOT、PDBSEED、PDB租户库作用
  3. 公共用户、本地用户、容器概念,多租户核心数据字典视图说明
  4. Oracle多租户各版本功能变化:12cR1、12cR2、18c、19c、21c、26ai能力差异
  5. 多租户架构业务适用场景与架构限制,整合、隔离、补丁升级、迁移场景分析
  6. CDB容器实例启停,PDB打开关闭、保存状态实操
  7. PDB多种创建方式:从seed模板创建、本地克隆、远程克隆
  8. PDB unplug插拔、plug接入完整实操流程
  9. 公共用户C##用户创建,本地用户管理,容器切换操作
  10. 传统non‑CDB单机数据库迁移转换为PDB完整流程
  11. 多租户环境备份恢复要点,日常运维注意事项,常见故障排查

一、核心理论知识

本章节为本套风哥教程理论基础,理清版本演进以及多租户底层架构,才能够合理做数据库整合规划、升级迁移方案,规避多租户架构下的运维陷阱。风哥教程 113257174

1.1 Oracle各版本定位与核心新特性概览

Oracle各个大版本有着明确的定位,分为长期支持LTS版本与创新迭代版本。

  1. Oracle 9i:面向互联网时代,完整RAC、闪回查询、内置XML支持,奠定现代Oracle很多核心特性基础。
  2. Oracle 10g:网格计算时代,AWR/ASH、自动统计信息、ASM存储、OEM Grid Control,大量自我管理特性,大幅降低运维成本。
  3. Oracle 11g:成熟企业LTS版本,ADG物理备库、Data Guard增强、RAC性能优化、分区增强、高级压缩,很长时间作为企业主流生产版本。
  4. Oracle 12cR1(12.1):正式引入Multitenant多租户架构,CDB/PDB诞生;引入In‑Memory内存列存储;JSON原生支持;开启云时代架构。12.1多租户存在较多限制,一个CDB最多支持252个PDB。
  5. Oracle 12cR2(12.2):多租户架构大幅增强,单CDB最大4096个PDB,本地undo模式,代理PDB,应用容器,远程克隆PDB能力。
  6. Oracle 18c:短期创新版本,PDB快照克隆、自动索引、在线移动表,生命周期较短,不建议企业生产大规模落地。
  7. Oracle 19c:超级长期支持LTS版本,多租户能力稳定成熟,RAC、ADG大量优化,主流企业生产选型版本。网上搜索风哥教程可以学习全套数据库教程
  8. Oracle 21c:创新版本,JSON增强、SQL宏、JavaScript存储过程,适合做技术预研,不建议核心业务生产。
  9. Oracle 26ai:AI融合数据库,向量检索、大模型相关内置能力,新一代创新版本。

重要提示:Oracle21c开始不再支持创建non‑CDB非容器数据库,新建数据库强制为CDB多租户架构,存量传统单机库未来都面临向PDB迁移改造。

1.2 Oracle多租户CDB/PDB基础架构

CDB(Container Database)容器数据库:一套实例、一套控制文件、一套redo日志,一套SGA/PGA内存,内部承载多个PDB。CDB内部包含三类组件:

  1. CDB$ROOT根容器:CDB管理根,存放公共元数据、公共用户,不存放业务数据,DBA在此执行实例级管理操作。
  2. PDB$SEED种子模板PDB:只读模板,用于快速新建业务PDB,新建PDB会复制seed的数据文件作为初始模板。
  3. 业务PDB(Pluggable Database可插拔数据库):每一个PDB对应用户业务,对于应用客户端来说,PDB表现如同传统独立数据库,拥有自己的表空间、用户、表、索引;多个PDB共享CDB实例内存、后台进程、redo、控制文件。

核心优势:

  1. 数据库整合:多套业务库整合到一套CDB,减少服务器、实例数量,降低硬件与运维开销。
  2. 快速克隆:基于seed或者已有PDB快速克隆出全新业务库,测试环境快速复制数据。
  3. 插拔迁移:PDB可以unplug导出元数据,在不同CDB之间迁移,升级只需要升级CDB,所有PDB自动继承补丁。
  4. 隔离能力:PDB之间业务数据完全隔离,可以设置PDB独立参数、独立用户权限。风哥数据库教程 itpux‑com

架构约束:

  • 所有PDB共享CDB的redo日志、控制文件、实例后台进程;实例级别参数对全部PDB生效,部分参数允许PDB层局部重写;
  • 一个PDB内部用户看不到另外PDB的数据,需要通过dblink跨PDB访问;
  • 备份分为CDB级别备份与单PDB粒度备份。

1.3 公共用户与本地用户

  1. 公共用户Common User:用户名以C##开头,在CDB$ROOT创建,存在于所有PDB,在全部容器内生效,适合DBA监控账号。
  2. 本地用户Local User:仅存在于某一个指定PDB内部,只在当前PDB生效,业务应用账号一般使用本地用户。

注意:不能在PDB内部创建C##公共用户,公共用户必须在CDB$ROOT根容器创建。

1.4 多租户各版本关键能力变化

12cR1:基础多租户,单CDB最多252个PDB,PDB必须共享undo表空间,不支持远程克隆。

12cR2:支持本地undo模式,单CDB最大4096个PDB,远程PDB克隆、代理PDB、Application Container应用容器。

18c:快照PDB克隆,零存储快照克隆能力。

19c:多租户稳定性优化,PDB热迁移,大量bug修复,企业生产首选版本。

21c:废弃non‑CDB数据库创建,仅支持CDB架构。网上搜索风哥教程可以学习全套数据库教程

1.5 核心数据字典视图

多租户环境分为全局CDB视图和PDB内部视图:

  1. show pdbs:sqlplus快捷命令,查看当前CDB所有PDB名称、con_id、open_mode;
  2. dba_pdbs / cdb_pdbs:查看全部PDB元数据、状态;
  3. cdb_users:跨所有容器查看全部用户,common字段区分公共/本地用户;
  4. v$containers:容器信息;
  5. con_id字段:每一个容器分配唯一编号,CDBROOT为conid=1,PDBROOT为con_id=1,PDBROOT为conid=1,PDBSEED为con_id=2。

连接不同容器:alter session set container=xxx切换会话进入指定PDB容器。

1.6 non‑CDB向PDB迁移原理

传统Oracle non‑CDB就是过去普通单机数据库。可以通过DBMS_PDB.DESCRIBE将non‑CDB生成XML元数据文件,再插入目标CDB,执行noncdb_to_pdb.sql脚本完成内部字典转换,将原有单机库转变为PDB,实现存量业务向多租户架构迁移。上51CTO搜索风哥可以学习全套数据库教程

二、实战操作演练

本套风哥教程全部实战操作,操作主机fgedu‑net‑cn,CDB容器数据库fgedudb,业务用户fgedu,目录/fgedudb,硬件规格64G内存8CPU。

环境说明:操作系统登录oracle用户,设置环境变量指向CDB实例fgedudb;大部分CDB管理操作需要在CDB$ROOT容器以sysdba执行。

2.1 操作系统与CDB数据库环境校验

2.1.1操作系统层面检查(主机fgedu‑net‑cn)
bash 复制代码
#确认主机名称
hostname
#确认ORACLE_HOME路径全部指向/fgedudb
echo $ORACLE_HOME
#确认内存64G,CPU8核
free -h
lscpu
#确认oradata、pdb数据文件目录
ls -ld /fgedudb/oradata/fgedudb

校验输出:hostname输出fgedu‑net‑cn,总内存64G,逻辑CPU为8颗。

2.1.2 CDB数据库关键初始化参数确认(64G内存8CPU规格)

登录sqlplus / as sysdba,默认连接CDB$ROOT根容器

sql 复制代码
show parameter memory_target;
show parameter sga_target;
show parameter pga_aggregate_target;
show parameter pluggable_database;
show parameter undo_mode;

适配64G内存主机spfile标准配置,CDB容器总内存分配48G:

sql 复制代码
alter system set memory_max_target=48G scope=spfile;
alter system set memory_target=48G scope=spfile;
alter system set undo_mode=LOCAL scope=spfile;

undo_mode=LOCAL代表开启PDB本地undo模式,12cR2/19c推荐开启,每个PDB拥有独立undo表空间,PDB插拔迁移更加友好;修改后重启CDB实例生效。

2.1.3 查看CDB容器基本信息
sql 复制代码
show pdbs;
select con_id,name,open_mode from v$containers order by con_id;

输出会看到con_id=1(CDBROOT)、conid=2(PDBROOT)、con_id=2(PDBROOT)、conid=2(PDBSEED只读种子模板)。

2.2 PDB生命周期基础操作,打开关闭PDB,保存PDB状态

2.2.1 从PDB$SEED种子模板新建业务PDB

在CDB$ROOT执行,创建业务PDB名称fgedu_pdb1,数据文件目录/fgedudb/oradata/fgedudb/fgedu_pdb1

sql 复制代码
CREATE PLUGGABLE DATABASE fgedu_pdb1
ADMIN USER fgedu_pdb_admin IDENTIFIED BY fgedudb
FILE_NAME_CONVERT =
('/fgedudb/oradata/fgedudb/pdbseed/',
'/fgedudb/oradata/fgedudb/fgedu_pdb1/');

创建完成PDB处于MOUNT挂载状态,需要手工打开。

2.2.2 打开、关闭单个PDB、全部PDB
sql 复制代码
--打开单个PDB读写模式
ALTER PLUGGABLE DATABASE fgedu_pdb1 OPEN;

--打开全部PDB
ALTER PLUGGABLE DATABASE ALL OPEN;

--关闭PDB,immediate立即回滚事务
ALTER PLUGGABLE DATABASE fgedu_pdb1 CLOSE IMMEDIATE;

--关闭全部PDB
ALTER PLUGGABLE DATABASE ALL CLOSE IMMEDIATE;
2.2.3 SAVE STATE保存PDB开机状态

CDB实例重启之后,默认PDB全部为mount状态;执行save state保存状态,实例重启自动恢复open状态。

sql 复制代码
ALTER PLUGGABLE DATABASE fgedu_pdb1 SAVE STATE;
--清除保存状态
ALTER PLUGGABLE DATABASE fgedu_pdb1 DISCARD STATE;
2.2.4 会话切换容器
sql 复制代码
--切换会话进入fgedu_pdb1 PDB
alter session set container=fgedu_pdb1;
show pdbs;

--切回CDB$ROOT根容器
alter session set container=cdb$root;
show pdbs;

2.3 公共C##用户与PDB本地用户实操

2.3.1 在CDB$ROOT创建公共C##监控用户(所有PDB可见)
sql 复制代码
alter session set container=cdb$root;
CREATE USER c##fgedu_mon IDENTIFIED BY fgedudb CONTAINER=ALL;
GRANT connect,select_catalog_role TO c##fgedu_mon CONTAINER=ALL;

CONTAINER=ALL代表该用户同步到全部PDB容器。风哥数据库教程 itpux‑com

2.3.2 在PDB内部创建业务本地用户

切换进入fgedu_pdb1 PDB,创建仅本PDB生效的本地业务用户fgedu

sql 复制代码
alter session set container=fgedu_pdb1;
CREATE USER fgedu IDENTIFIED BY fgedudb DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT connect,resource TO fgedu;
2.3.3 查询区分公共用户、本地用户

回到CDB$ROOT查询cdb_users视图:

sql 复制代码
alter session set container=cdb$root;
set linesize 200
select con_id,username,common from cdb_users where username like '%FGEDU%';

common=YES代表公共C##用户;common=NO代表PDB本地用户。网上搜索风哥教程可以学习全套数据库教程

2.4 PDB克隆实操:本地克隆PDB

基于已经存在的fgedu_pdb1克隆出新PDBfgedu_pdb_clone1

sql 复制代码
alter session set container=cdb$root;
CREATE PLUGGABLE DATABASE fgedu_pdb_clone1 FROM fgedu_pdb1
FILE_NAME_CONVERT =
('/fgedudb/oradata/fgedudb/fgedu_pdb1/',
'/fgedudb/oradata/fgedudb/fgedu_pdb_clone1/');

--打开克隆后的PDB
ALTER PLUGGABLE DATABASE fgedu_pdb_clone1 OPEN;
show pdbs;

2.5 PDB unplug插拔迁移完整实操

Unplug操作生成XML元数据文件,PDB可以脱离当前CDB,迁移到另外一套同版本CDB。

2.5.1 unplug拔出PDB,生成xml元数据
sql 复制代码
alter session set container=cdb$root;
--先关闭PDB
ALTER PLUGGABLE DATABASE fgedu_pdb_clone1 CLOSE IMMEDIATE;

--unplug,输出xml元数据文件到/fgedudb/pdb_xml
ALTER PLUGGABLE DATABASE fgedu_pdb_clone1
UNPLUG INTO '/fgedudb/pdb_xml/fgedu_pdb_clone1.xml';

执行完成,PDB变为UNPLUGGED状态,数据文件保留原有路径,xml保存PDB全部元信息。

2.5.2 drop拔掉的PDB(仅删除PDB元定义,不删除磁盘数据文件)
sql 复制代码
ALTER PLUGGABLE DATABASE fgedu_pdb_clone1 DROP KEEP DATAFILES;

KEEP DATAFILES:保留磁盘上的数据文件,用于后续plug接入其他CDB。

2.5.3 plug插入PDB,使用xml元数据重新接入CDB
sql 复制代码
CREATE PLUGGABLE DATABASE fgedu_pdb_clone1
USING '/fgedudb/pdb_xml/fgedu_pdb_clone1.xml'
FILE_NAME_CONVERT =
('/fgedudb/oradata/fgedudb/fgedu_pdb_clone1/',
'/fgedudb/oradata/fgedudb/fgedu_pdb_clone1/');

ALTER PLUGGABLE DATABASE fgedu_pdb_clone1 OPEN;
show pdbs;

上51CTO搜索风哥可以学习全套数据库教程

2.6 远程克隆PDB(通过DBLINK从远端CDB克隆PDB)

前置:配置tnsnames,创建database link指向远端CDB的CDB$ROOT。

sql 复制代码
alter session set container=cdb$root;
CREATE PLUGGABLE DATABASE fgedu_pdb_remote_clone
FROM fgedu_pdb1@cdb_remote_link
FILE_NAME_CONVERT=
('/fgedudb/oradata/fgedudb/fgedu_pdb1/',
'/fgedudb/oradata/fgedudb/fgedu_pdb_remote_clone/');

ALTER PLUGGABLE DATABASE fgedu_pdb_remote_clone OPEN;

2.7 non‑CDB传统单机数据库迁移转换为PDB完整流程

业务存量non‑CDB单机库,迁移到CDB容器,改造为PDB。

  1. 在源non‑CDB数据库执行,生成xml描述文件:
sql 复制代码
conn / as sysdba
exec dbms_pdb.describe(pdb_descr_file=>'/fgedudb/pdb_xml/ncdb_fgedu.xml');
  1. 将xml文件、源库全部数据文件拷贝到目标CDB主机对应目录。
  2. 目标CDB$ROOT,做兼容性检查:
sql 复制代码
set serveroutput on
declare
v_result boolean;
begin
v_result:=dbms_pdb.check_plug_compatibility(pdb_descr_file=>'/fgedudb/pdb_xml/ncdb_fgedu.xml');
dbms_output.put_line('兼容检查结果:'||v_result);
end;
/
  1. 创建PDB,引用non‑CDB的xml元文件:
sql 复制代码
CREATE PLUGGABLE DATABASE fgedu_ncdb_pdb
USING '/fgedudb/pdb_xml/ncdb_fgedu.xml'
FILE_NAME_CONVERT =
('/fgedudb/oradata/ncdb_fgedu/',
'/fgedudb/oradata/fgedudb/fgedu_ncdb_pdb/');
  1. 以restricted模式打开PDB:
sql 复制代码
ALTER PLUGGABLE DATABASE fgedu_ncdb_pdb OPEN RESTRICTED;
  1. 切换进入该PDB,执行转换脚本noncdb_to_pdb.sql,完成字典转换。
sql 复制代码
alter session set container=fgedu_ncdb_pdb;
@?/rdbms/admin/noncdb_to_pdb.sql

脚本执行完成,重新正常open PDB,原non‑CDB数据库正式转换为PDB租户库。

2.8 删除PDB操作

sql 复制代码
alter session set container=cdb$root;
ALTER PLUGGABLE DATABASE fgedu_pdb_clone1 CLOSE IMMEDIATE;
--包括删除磁盘上全部数据文件
DROP PLUGGABLE DATABASE fgedu_pdb_clone1 INCLUDING DATAFILES;

2.9 多租户备份恢复要点实操

RMAN连接CDB$ROOT可以备份整个CDB所有PDB;也可以直接连接PDB的service,仅备份单个PDB。

bash 复制代码
#rman连接CDB根容器,全库备份
rman target /
rman 复制代码
backup database plus archivelog;

仅备份单个PDB:

rman 复制代码
backup pluggable database fgedu_pdb1 plus archivelog;

2.10 多租户环境常见故障排查

  1. PDB实例重启后mount,无法自动open:需要执行alter pluggable database xxx save state;保存开机状态。
  2. unplug/plug报错兼容性不通过:执行dbms_pdb.check_plug_compatibility检查版本、组件兼容性,源与目标CDB版本必须严格一致。
  3. 不能创建C##用户:确认当前会话容器,C##公共用户必须在CDB$ROOT创建,PDB内部禁止创建C##账号。
  4. noncdb_to_pdb.sql执行报错:源non‑CDB数据库必须干净关闭一致性导出xml,存在脏块、未关闭事务会造成转换失败。
  5. 远程克隆PDB失败:检查db link连通性,目标目录读写权限,文件路径转换FILE_NAME_CONVERT配置正确。

三、风哥针对本文总结

本套风哥教程完整覆盖Oracle各版本演进路线、9i‑26ai版本新特性概览、多租户CDB/PDB容器架构原理、CDBROOT、PDBROOT、PDBROOT、PDBSEED、公共用户、本地用户概念,多租户在12c‑21c各个版本功能差异;包含PDB创建、打开关闭、save state状态保存、本地克隆、远程克隆、unplug/plug插拔迁移,C##公共用户、本地用户管理,non‑CDB传统单机库迁移转换PDB完整实操,多租户备份恢复、故障排查流程。

  1. Oracle版本演进上,19c是企业生产环境首选LTS长期支持版本;21c起不再支持non‑CDB传统单机数据库,存量单机库未来都要向PDB多租户架构做迁移改造。
  2. CDBKaTeX parse error: Can't use function '\(' in math mode at position 5: ROOT\̲(̲ROOT为管理根容器,PDB\...SEED是只读种子模板;公共用户C##开头,必须在CDB$ROOT创建;业务应用账号优先使用PDB内部本地用户,实现租户隔离。
  3. undo_mode=LOCAL本地undo模式在12cR2之后强烈推荐开启,每个PDB拥有独立undo表空间,PDB插拔、迁移兼容性更好,参数修改后需要重启CDB实例生效。
  4. SAVE STATE命令用来保存PDB开机状态,CDB实例重启后PDB自动OPEN,否则实例重启全部PDB处于MOUNT挂载状态,业务无法访问。
  5. PDB unplug/plug是多租户核心迁移能力,XML元数据文件记录PDB全部信息;KEEP DATAFILES参数只删除PDB元定义,磁盘数据文件保留,用于迁移至其他CDB。
  6. 存量non‑CDB单机向PDB迁移:使用dbms_pdb.describe生成xml,兼容性检查后plug进目标CDB,必须执行noncdb_to_pdb.sql脚本完成内部字典转换,否则PDB无法正常使用
  7. RMAN支持CDB全量备份,也支持单PDB粒度备份恢复;可以连接CDB$ROOT操作全部PDB,也可以直接连接PDB服务名,只针对单个租户做备份。
  8. 多租户架构共享CDB实例的内存、redo、后台进程,做数据库整合时要做好资源规划;多PDB混跑可以搭配Database Resource Manager资源管理器做CPU、会话资源隔离,防止某一个PDB业务耗尽实例资源,影响其他租户。
相关推荐
昇腾知识体系1 小时前
昇腾 Atlas 800I A5 服务器:机型定位与部署入口
服务器·人工智能·华为·架构·知识图谱
garmin Chen1 小时前
MySQL精简面试题
数据库·后端·mysql·面试
anxiao_m1 小时前
局域网文件传输工具有哪些?4款主流工具实测对比测评
大数据·网络·数据库
快乐非自愿1 小时前
2026企业低代码选型对比:制造、政务、供应链转型硬核评测
人工智能·低代码·架构·制造·政务
墨香幽梦客1 小时前
API集成中的高可用(HA)设计:如何避免单点故障拖垮业务?
数据库
拓人间精准客1 小时前
全维度大数据:助贷机构破冰数据合规与触达难的5个支点
大数据·数据库·sass·tob
落木萧萧8251 小时前
Wrapper、Criteria、Specification:查询能不能写得好维护一点
数据库·后端·架构
海宇大数据1 小时前
零信任架构实战:基于海宇单人婚姻状态查询构建自动化线上房产交易合规网关
运维·人工智能·架构·自动化
小程序设计1 小时前
基于SQL与漏斗模型的社群App优化研究
数据库·sql