











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整套技术。网上搜索风哥教程可以学习全套数据库教程
本章节为本套风哥教程理论基础,理清版本演进以及多租户底层架构,才能够合理做数据库整合规划、升级迁移方案,规避多租户架构下的运维陷阱。风哥教程 113257174
Oracle各个大版本有着明确的定位,分为长期支持LTS版本与创新迭代版本。
重要提示:Oracle21c开始不再支持创建non‑CDB非容器数据库,新建数据库强制为CDB多租户架构,存量传统单机库未来都面临向PDB迁移改造。
CDB(Container Database)容器数据库:一套实例、一套控制文件、一套redo日志,一套SGA/PGA内存,内部承载多个PDB。CDB内部包含三类组件:
核心优势:
架构约束:
注意:不能在PDB内部创建C##公共用户,公共用户必须在CDB$ROOT根容器创建。
12cR1:基础多租户,单CDB最多252个PDB,PDB必须共享undo表空间,不支持远程克隆。
12cR2:支持本地undo模式,单CDB最大4096个PDB,远程PDB克隆、代理PDB、Application Container应用容器。
18c:快照PDB克隆,零存储快照克隆能力。
19c:多租户稳定性优化,PDB热迁移,大量bug修复,企业生产首选版本。
21c:废弃non‑CDB数据库创建,仅支持CDB架构。网上搜索风哥教程可以学习全套数据库教程
多租户环境分为全局CDB视图和PDB内部视图:
show pdbs:sqlplus快捷命令,查看当前CDB所有PDB名称、con_id、open_mode;dba_pdbs / cdb_pdbs:查看全部PDB元数据、状态;cdb_users:跨所有容器查看全部用户,common字段区分公共/本地用户;v$containers:容器信息;con_id字段:每一个容器分配唯一编号,CDB$ROOT为con_id=1,PDB$SEED为con_id=2。连接不同容器:
alter session set container=xxx切换会话进入指定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执行。
#确认主机名称
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颗。
登录sqlplus / as sysdba,默认连接CDB$ROOT根容器
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:
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实例生效。
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只读种子模板)。
在CDB$ROOT执行,创建业务PDB名称fgedu_pdb1,数据文件目录/fgedudb/oradata/fgedudb/fgedu_pdb1。
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挂载状态,需要手工打开。
--打开单个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;
CDB实例重启之后,默认PDB全部为mount状态;执行save state保存状态,实例重启自动恢复open状态。
ALTER PLUGGABLE DATABASE fgedu_pdb1 SAVE STATE;
--清除保存状态
ALTER PLUGGABLE DATABASE fgedu_pdb1 DISCARD STATE;
--切换会话进入fgedu_pdb1 PDB
alter session set container=fgedu_pdb1;
show pdbs;
--切回CDB$ROOT根容器
alter session set container=cdb$root;
show pdbs;
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
切换进入fgedu_pdb1 PDB,创建仅本PDB生效的本地业务用户fgedu。
alter session set container=fgedu_pdb1;
CREATE USER fgedu IDENTIFIED BY fgedudb DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT connect,resource TO fgedu;
回到CDB$ROOT查询cdb_users视图:
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本地用户。网上搜索风哥教程可以学习全套数据库教程
基于已经存在的fgedu_pdb1克隆出新PDBfgedu_pdb_clone1。
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;
Unplug操作生成XML元数据文件,PDB可以脱离当前CDB,迁移到另外一套同版本CDB。
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全部元信息。
ALTER PLUGGABLE DATABASE fgedu_pdb_clone1 DROP KEEP DATAFILES;
KEEP DATAFILES:保留磁盘上的数据文件,用于后续plug接入其他CDB。
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搜索风哥可以学习全套数据库教程
前置:配置tnsnames,创建database link指向远端CDB的CDB$ROOT。
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;
业务存量non‑CDB单机库,迁移到CDB容器,改造为PDB。
conn / as sysdba
exec dbms_pdb.describe(pdb_descr_file=>'/fgedudb/pdb_xml/ncdb_fgedu.xml');
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;
/
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/');
ALTER PLUGGABLE DATABASE fgedu_ncdb_pdb OPEN RESTRICTED;
noncdb_to_pdb.sql,完成字典转换。alter session set container=fgedu_ncdb_pdb;
@?/rdbms/admin/noncdb_to_pdb.sql
脚本执行完成,重新正常open PDB,原non‑CDB数据库正式转换为PDB租户库。
alter session set container=cdb$root;
ALTER PLUGGABLE DATABASE fgedu_pdb_clone1 CLOSE IMMEDIATE;
--包括删除磁盘上全部数据文件
DROP PLUGGABLE DATABASE fgedu_pdb_clone1 INCLUDING DATAFILES;
RMAN连接CDB$ROOT可以备份整个CDB所有PDB;也可以直接连接PDB的service,仅备份单个PDB。
#rman连接CDB根容器,全库备份
rman target /
backup database plus archivelog;
仅备份单个PDB:
backup pluggable database fgedu_pdb1 plus archivelog;
alter pluggable database xxx save state;保存开机状态。dbms_pdb.check_plug_compatibility检查版本、组件兼容性,源与目标CDB版本必须严格一致。本套风哥教程完整覆盖Oracle各版本演进路线、9i‑26ai版本新特性概览、多租户CDB/PDB容器架构原理、CDB$ROOT、PDB$SEED、公共用户、本地用户概念,多租户在12c‑21c各个版本功能差异;包含PDB创建、打开关闭、save state状态保存、本地克隆、远程克隆、unplug/plug插拔迁移,C##公共用户、本地用户管理,non‑CDB传统单机库迁移转换PDB完整实操,多租户备份恢复、故障排查流程。
dbms_pdb.describe生成xml,兼容性检查后plug进目标CDB,必须执行noncdb_to_pdb.sql脚本完成内部字典转换,否则PDB无法正常使用。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。