Multitenant Architecture (CDB/PDB)
39.1 Concepts
The single non-CDB architecture is desupported from 21c. Multitenant is mandatory now.
Up to 3 user PDBs without the Multitenant license (19c+). 4,096 with the license.
Shared: instance, SGA, background processes, redo, control files, (optionally) undo. Separate: SYSTEM/SYSAUX/user datafiles, local users.
CDB (Container Database: one instance)
├── CDB$ROOT (CON_ID 1: Oracle metadata, common users)
├── PDB$SEED (CON_ID 2: read-only template)
├── PDB1 (application data)
├── PDB2
└── App Root → App PDBs (Application Containers)39.2 Navigating
SHOW CON_NAME
SHOW PDBS
SELECT con_id, name, open_mode, restricted FROM v$pdbs;
ALTER SESSION SET CONTAINER = PDB1;
SELECT con_id, tablespace_name FROM cdb_tablespaces ORDER BY con_id;39.3 Creating and Managing PDBs
-- From the seed
CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdbadmin IDENTIFIED BY "Pwd#1"
FILE_NAME_CONVERT = ('/pdbseed/', '/pdb2/');
ALTER PLUGGABLE DATABASE pdb2 OPEN;
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE pdb2 SAVE STATE; -- auto-open on CDB restart
-- Clone (hot clone with local undo)
CREATE PLUGGABLE DATABASE pdb2_test FROM pdb2;
CREATE PLUGGABLE DATABASE pdb_remote FROM pdb1@cdb2_link; -- remote clone
CREATE PLUGGABLE DATABASE pdb_snap FROM pdb2 SNAPSHOT COPY; -- thin clone
-- Unplug / plug
ALTER PLUGGABLE DATABASE pdb2 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE pdb2 UNPLUG INTO '/tmp/pdb2.xml'; -- or .pdb archive
-- Check compatibility first: DBMS_PDB.CHECK_PLUG_COMPATIBILITY
CREATE PLUGGABLE DATABASE pdb2 USING '/tmp/pdb2.xml' NOCOPY TEMPFILE REUSE;
-- Relocate (near-zero downtime move)
CREATE PLUGGABLE DATABASE pdb2 FROM pdb2@src_link RELOCATE;
-- Refreshable clone
CREATE PLUGGABLE DATABASE pdb_rep FROM pdb1@src_link REFRESH MODE EVERY 60 MINUTES;
-- Proxy PDB, PDB snapshot carousel, non-CDB to PDB conversion (DBMS_PDB.DESCRIBE + noncdb_to_pdb.sql)
DROP PLUGGABLE DATABASE pdb2_test INCLUDING DATAFILES;39.4 Users and Privileges in Multitenant
Common users (prefix C##, exist in all containers) vs local users (one PDB).
Common vs local roles and privileges. CONTAINER = ALL | CURRENT.
CREATE USER c##dba IDENTIFIED BY "Pwd#1" CONTAINER = ALL;
GRANT DBA TO c##dba CONTAINER = ALL;39.5 PDB Resource Management and Isolation
CDB resource plans (shares and utilization limits per PDB), CPU_COUNT per PDB, SGA_TARGET / SGA_MIN_SIZE / PGA_AGGREGATE_LIMIT per PDB, MAX_IOPS, MAX_MBPS.
Lockdown profiles restrict features per PDB (CREATE LOCKDOWN PROFILE, PDB_LOCKDOWN).
MAX_PDB_STORAGE. PDB-level backups and PITR.
39.6 Application Containers
An application root plus application PDBs. Shared application metadata and data (SHARING = METADATA | DATA | EXTENDED DATA), application install/upgrade/patch, and the CONTAINERS() clause for cross-PDB queries.