前言
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整套技术。网上搜索风哥教程可以学习全套数据库教程
内容大纲
- Oracle数据库版本演进路线,9i/10g/11g/12c/18c/19c/21c/26ai版本定位与核心新特性概览
- Oracle多租户CDB/PDB容器架构基础概念,CDBROOT、PDBROOT、PDBROOT、PDBSEED、PDB租户库作用
- 公共用户、本地用户、容器概念,多租户核心数据字典视图说明
- Oracle多租户各版本功能变化:12cR1、12cR2、18c、19c、21c、26ai能力差异
- 多租户架构业务适用场景与架构限制,整合、隔离、补丁升级、迁移场景分析
- CDB容器实例启停,PDB打开关闭、保存状态实操
- PDB多种创建方式:从seed模板创建、本地克隆、远程克隆
- PDB unplug插拔、plug接入完整实操流程
- 公共用户C##用户创建,本地用户管理,容器切换操作
- 传统non‑CDB单机数据库迁移转换为PDB完整流程
- 多租户环境备份恢复要点,日常运维注意事项,常见故障排查
一、核心理论知识
本章节为本套风哥教程理论基础,理清版本演进以及多租户底层架构,才能够合理做数据库整合规划、升级迁移方案,规避多租户架构下的运维陷阱。风哥教程 113257174
1.1 Oracle各版本定位与核心新特性概览
Oracle各个大版本有着明确的定位,分为长期支持LTS版本与创新迭代版本。
- Oracle 9i:面向互联网时代,完整RAC、闪回查询、内置XML支持,奠定现代Oracle很多核心特性基础。
- Oracle 10g:网格计算时代,AWR/ASH、自动统计信息、ASM存储、OEM Grid Control,大量自我管理特性,大幅降低运维成本。
- Oracle 11g:成熟企业LTS版本,ADG物理备库、Data Guard增强、RAC性能优化、分区增强、高级压缩,很长时间作为企业主流生产版本。
- Oracle 12cR1(12.1):正式引入Multitenant多租户架构,CDB/PDB诞生;引入In‑Memory内存列存储;JSON原生支持;开启云时代架构。12.1多租户存在较多限制,一个CDB最多支持252个PDB。
- Oracle 12cR2(12.2):多租户架构大幅增强,单CDB最大4096个PDB,本地undo模式,代理PDB,应用容器,远程克隆PDB能力。
- Oracle 18c:短期创新版本,PDB快照克隆、自动索引、在线移动表,生命周期较短,不建议企业生产大规模落地。
- Oracle 19c:超级长期支持LTS版本,多租户能力稳定成熟,RAC、ADG大量优化,主流企业生产选型版本。网上搜索风哥教程可以学习全套数据库教程
- Oracle 21c:创新版本,JSON增强、SQL宏、JavaScript存储过程,适合做技术预研,不建议核心业务生产。
- Oracle 26ai:AI融合数据库,向量检索、大模型相关内置能力,新一代创新版本。
重要提示:Oracle21c开始不再支持创建non‑CDB非容器数据库,新建数据库强制为CDB多租户架构,存量传统单机库未来都面临向PDB迁移改造。
1.2 Oracle多租户CDB/PDB基础架构
CDB(Container Database)容器数据库:一套实例、一套控制文件、一套redo日志,一套SGA/PGA内存,内部承载多个PDB。CDB内部包含三类组件:
- CDB$ROOT根容器:CDB管理根,存放公共元数据、公共用户,不存放业务数据,DBA在此执行实例级管理操作。
- PDB$SEED种子模板PDB:只读模板,用于快速新建业务PDB,新建PDB会复制seed的数据文件作为初始模板。
- 业务PDB(Pluggable Database可插拔数据库):每一个PDB对应用户业务,对于应用客户端来说,PDB表现如同传统独立数据库,拥有自己的表空间、用户、表、索引;多个PDB共享CDB实例内存、后台进程、redo、控制文件。
核心优势:
- 数据库整合:多套业务库整合到一套CDB,减少服务器、实例数量,降低硬件与运维开销。
- 快速克隆:基于seed或者已有PDB快速克隆出全新业务库,测试环境快速复制数据。
- 插拔迁移:PDB可以unplug导出元数据,在不同CDB之间迁移,升级只需要升级CDB,所有PDB自动继承补丁。
- 隔离能力:PDB之间业务数据完全隔离,可以设置PDB独立参数、独立用户权限。风哥数据库教程 itpux‑com
架构约束:
- 所有PDB共享CDB的redo日志、控制文件、实例后台进程;实例级别参数对全部PDB生效,部分参数允许PDB层局部重写;
- 一个PDB内部用户看不到另外PDB的数据,需要通过dblink跨PDB访问;
- 备份分为CDB级别备份与单PDB粒度备份。
1.3 公共用户与本地用户
- 公共用户Common User:用户名以C##开头,在CDB$ROOT创建,存在于所有PDB,在全部容器内生效,适合DBA监控账号。
- 本地用户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内部视图:
show pdbs:sqlplus快捷命令,查看当前CDB所有PDB名称、con_id、open_mode;dba_pdbs/cdb_pdbs:查看全部PDB元数据、状态;cdb_users:跨所有容器查看全部用户,common字段区分公共/本地用户;v$containers:容器信息;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。
- 在源non‑CDB数据库执行,生成xml描述文件:
sql
conn / as sysdba
exec dbms_pdb.describe(pdb_descr_file=>'/fgedudb/pdb_xml/ncdb_fgedu.xml');
- 将xml文件、源库全部数据文件拷贝到目标CDB主机对应目录。
- 目标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;
/
- 创建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/');
- 以restricted模式打开PDB:
sql
ALTER PLUGGABLE DATABASE fgedu_ncdb_pdb OPEN RESTRICTED;
- 切换进入该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 多租户环境常见故障排查
- PDB实例重启后mount,无法自动open:需要执行
alter pluggable database xxx save state;保存开机状态。 - unplug/plug报错兼容性不通过:执行
dbms_pdb.check_plug_compatibility检查版本、组件兼容性,源与目标CDB版本必须严格一致。 - 不能创建C##用户:确认当前会话容器,C##公共用户必须在CDB$ROOT创建,PDB内部禁止创建C##账号。
- noncdb_to_pdb.sql执行报错:源non‑CDB数据库必须干净关闭一致性导出xml,存在脏块、未关闭事务会造成转换失败。
- 远程克隆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完整实操,多租户备份恢复、故障排查流程。
- Oracle版本演进上,19c是企业生产环境首选LTS长期支持版本;21c起不再支持non‑CDB传统单机数据库,存量单机库未来都要向PDB多租户架构做迁移改造。
- CDBKaTeX parse error: Can't use function '\(' in math mode at position 5: ROOT\̲(̲ROOT为管理根容器,PDB\...SEED是只读种子模板;公共用户C##开头,必须在CDB$ROOT创建;业务应用账号优先使用PDB内部本地用户,实现租户隔离。
- undo_mode=LOCAL本地undo模式在12cR2之后强烈推荐开启,每个PDB拥有独立undo表空间,PDB插拔、迁移兼容性更好,参数修改后需要重启CDB实例生效。
- SAVE STATE命令用来保存PDB开机状态,CDB实例重启后PDB自动OPEN,否则实例重启全部PDB处于MOUNT挂载状态,业务无法访问。
- PDB unplug/plug是多租户核心迁移能力,XML元数据文件记录PDB全部信息;KEEP DATAFILES参数只删除PDB元定义,磁盘数据文件保留,用于迁移至其他CDB。
- 存量non‑CDB单机向PDB迁移:使用
dbms_pdb.describe生成xml,兼容性检查后plug进目标CDB,必须执行noncdb_to_pdb.sql脚本完成内部字典转换,否则PDB无法正常使用。 - RMAN支持CDB全量备份,也支持单PDB粒度备份恢复;可以连接CDB$ROOT操作全部PDB,也可以直接连接PDB服务名,只针对单个租户做备份。
- 多租户架构共享CDB实例的内存、redo、后台进程,做数据库整合时要做好资源规划;多PDB混跑可以搭配Database Resource Manager资源管理器做CPU、会话资源隔离,防止某一个PDB业务耗尽实例资源,影响其他租户。