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.