架構核心概念
| 組件 | 名稱 | 功能 | 數量限制 |
| CDB$ROOT | 根容器 | 存儲公共用戶、元數據、系統資料、CDB 級視圖 | 每 CDB 僅 1 個 |
| PDB$SEED | 種子模板 | 新 PDB 複製來源,唯讀 | 每 CDB 僅 1 個 |
| PDB (User) | 可插拔資料庫 | 承載租戶業務資料、應用用戶、本地物件 | 12c: 252、18c+: 4096 (每 CDB) |
| Application Root | 應用根 | 共享應用元數據的中間層容器 (12.2+) | 可多個 |
日常運維核心命令速查
1. 容器切換與狀態查看
-- 查看當前容器
SHOW CON_NAME;
SELECT CON_ID, NAME, OPEN_MODE FROM V$PDBS;
-- 切換至 PDB (需在 CDB$ROOT 執行)
ALTER SESSION SET CONTAINER = pdb1;
-- 或直接 TNS 連線 PDB (需 listener.ora/tnsnames.ora 配置 SERVICE_NAME=PDB名)
-- sqlplus sys/pwd@pdb1 as sysdba
2. PDB 生命周期管理
-- 啟動單個 PDB (需在 CDB$ROOT)
ALTER PLUGGABLE DATABASE pdb1 OPEN [READ WRITE | READ ONLY | RESTRICTED];
-- 批量啟動/關閉
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE ALL CLOSE [IMMEDIATE];
-- 在 PDB 內部操作 (同傳統資料庫)
-- sqlplus / as sysdba → ALTER SESSION SET CONTAINER=pdb1 → STARTUP/SHUTDOWN
3. 用戶與權限模型 (關鍵差異)
| 用戶類型 | 命名規則 | 建立位置 | 可見範圍 | 典型用途 |
| Common User | C## 或 c## 開頭 | CDB$ROOT | 所有容器 (含未來新建 PDB) | DBA、監控、備份帳號 |
| Local User | 無前綴限制 | 特定 PDB | 僅該 PDB | 應用業務用戶 |
-- CDB$ROOT 建立 Common User
CREATE USER c##dba IDENTIFIED BY password CONTAINER=ALL;
GRANT DBA TO c##dba CONTAINER=ALL; -- 跨容器授權
-- PDB 內建立 Local User (需先切換容器)
ALTER SESSION SET CONTAINER=pdb1;
CREATE USER app_user IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO app_user; -- 僅在 pdb1 生效
4. 參數管理層級
| 層級 | SCOPE | 生效範圍 | 範例 |
| CDB 級 | CONTAINER=ALL | 所有 OPEN 的 PDB 繼承 | `ALTER SYSTEM SET open_cursors=500 CONTAINER=ALL;` |
| PDB 級 | 在 PDB 內執行 | 覆蓋 CDB 設定,僅該 PDB | `ALTER SYSTEM SET open_cursors=100;` (在 pdb1 會話中) |
| 會話級 | SCOPE=MEMORY | 當前會話臨時生效 | `ALTER SESSION SET nls_date_format='YYYY-MM-DD';` |
進階操作場景
PDB 克隆與遷移 (12.2+)
-- 熱克隆 (源 PDB 需 READ ONLY 或 OPEN READ WRITE)
CREATE PLUGGABLE DATABASE pdb1_clone FROM pdb1
FILE_NAME_CONVERT=('/u01/oradata/cdb/pdb1/', '/u01/oradata/cdb/pdb1_clone/');
-- 非 CDB 遷移至 PDB (12c+)
-- 1. 非 CDB 執行 DBMS_PDB.DESCRIBE 生成 XML
-- 2. CDB 執行 CREATE PLUGGABLE DATABASE ... USING 'xml_path' ...
資源管理 (Resource Manager)
-- CDB 計劃分配 CPU/IO 給 PDB
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(plan=>'CDB_PLAN', comment=>'CDB Resource Plan');
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan=>'CDB_PLAN', pluggable_database=>'PDB1', shares=>3, utilization_limit=>50);
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan=>'CDB_PLAN', pluggable_database=>'PDB2', shares=>1, utilization_limit=>100);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/
ALTER SYSTEM SET resource_manager_plan='CDB_PLAN';
備份恢復策略
- CDB 級備份:RMAN `BACKUP DATABASE` 含根、種子、所有 PDB
- PDB 級備份:`BACKUP PLUGGABLE DATABASE pdb1` (需 CDB OPEN)
- 表空間點恢復 (TSPITR):PDB 級支援,不影響其他 PDB
- PDB 解除/插入:跨 CDB 遷移、升級的核心手段
常見坑點與避坑指南
| 坑點 | 現象 | 根因 | 解決 |
| ORA-65096 | CDB$ROOT 建立無前綴用戶失敗 | 強制 Common User 命名規則 | 加 `C##` 前綴或切換至 PDB 建立 Local User |
| ORA-65094 | PDB 內建立 `C##` 用戶失敗 | PDB 禁止建立 Common User | 在 PDB 僅建 Local User |
| Common User 權限不生效 | PDB 內無法使用系統權限 | 授權需 `CONTAINER=ALL` 或在各 PDB 重新授權 | `GRANT ... CONTAINER=ALL` 或 PDB 內 `GRANT ...` |
| PDB 無法 OPEN | MOUNTED 狀態卡住 | CDB 級參數衝突、資源不足、檔案缺失 | 查 `CDB_PDB_HISTORY`、`V$PDBS`、`alert.log` |
| 連線不上 PDB | TNS 解析失敗 | SERVICE_NAME 未註冊、local_listener 未設 | `ALTER SYSTEM SET local_listener=...`、`ALTER SYSTEM REGISTER` |
版本演進關鍵特性
| 版本 | 關鍵特性 |
| 12.1 | 多租戶基礎架構、PDB 熱克隆、Resource Manager CDB 計劃 |
| 12.2 | Application Container、PDB 級鎖定、REFRESHABLE PDB、熱克隆無需 READ ONLY |
| 18c | PDB 快照輪轉、自動索引、資源管理器增強 |
| 19c | 長期支援版、PDB 鎖定模式、CDB Fleet 管理、原生 Sharding 支援 |
| 21c/23c | PDB 級 Data Guard、Blockchain Tables、JSON 雙重性、真正的多租戶隔離增強 |
總結
CDB/PDB 架構將「實例級隔離」下沉為「字典級隔離」,大幅提升密度與管理性。**核心心法:Common 物件在 ROOT、Local 物件在 PDB、參數分層繼承、資源統一調度**。運維重點從「管理實例」轉向「管理容器集合」,善用 `CONTAINER=ALL`、`ALTER SESSION SET CONTAINER`、RMAN PDB 級備份、Resource Manager CDB 計劃四大工具,即可駕馭百萬級 PDB 環境。