# 数据库教程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容器架构基础概念,CDB$ROOT、PDB$SEED、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`字段:每一个容器分配唯一编号,CDB$ROOT为con_id=1,PDB$SEED为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(CDB$ROOT)、con_id=2(PDB$SEED只读种子模板)。
### 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`克隆出新PDB`fgedu_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’);
“`
2. 将xml文件、源库全部数据文件拷贝到目标CDB主机对应目录。
3. 目标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;
/
“`
4. 创建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/’);
“`
5. 以restricted模式打开PDB:
“`sql
ALTER PLUGGABLE DATABASE fgedu_ncdb_pdb OPEN RESTRICTED;
“`
6. 切换进入该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容器架构原理、CDB$ROOT、PDB$SEED、公共用户、本地用户概念,多租户在12c‑21c各个版本功能差异;包含PDB创建、打开关闭、save state状态保存、本地克隆、远程克隆、unplug/plug插拔迁移,C##公共用户、本地用户管理,non‑CDB传统单机库迁移转换PDB完整实操,多租户备份恢复、故障排查流程。
1. Oracle版本演进上,19c是企业生产环境首选LTS长期支持版本;21c起不再支持non‑CDB传统单机数据库,存量单机库未来都要向PDB多租户架构做迁移改造。
2. CDB$ROOT\(ROOT为管理根容器,PDB\)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业务耗尽实例资源,影响其他租户。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
