首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 12c CDB/PDB 架構下使用者建立與表空間分配規則詳解

     編輯:Oracle 教學

Oracle 12c CDB/PDB 架構下使用者建立與表空間分配規則詳解

Oracle 12c 引入多租戶架構:容器資料庫 (CDB) 可掛載多個可插拔資料庫 (PDB)。實例與資料庫由 1:1 變為 1:N。此架構改變了使用者建立、權限管理、表空間分配的規則。本文釐清常見困惑:C## 前綴、Common User vs Local User、表空間跨容器可見性。

核心概念

  • CDB (Container Database): 根容器 (CDB$ROOT) + 種子庫 (PDB$SEED) + 0-N 個 PDB。
  • Common User (共用使用者): 在 CDB$ROOT 建立,名稱必須以 C## 或 c## 開頭 (參數 COMMON_USER_PREFIX 控制,預設 C##)。可跨所有容器存取。
  • Local User (本地使用者): 在特定 PDB 內建立,名稱不可帶 C## 前綴。僅存在於該 PDB。
  • Common Object/Role: 同樣需 C## 前綴,在 Root 建立,元資料鏡像至所有 PDB (Metadata Link) 或資料共享 (Data Link/Extended Data Link)。

表空間分配鐵律

在 CDB$ROOT 建立 Common User 指定預設表空間時,該表空間必須存在於 CDB$ROOT 且同名表空間必須存在於所有目標 PDB 中 (或至少種子庫 PDB$SEED 中),否則報錯 ORA-65048 / ORA-00959。

原因:Common User 的預設表空間在每個容器中都必須可用。建立 Common User 時,Oracle 會嘗試在所有 PDB 中同步建立該使用者的元資料連結,並驗證表空間存在性。

實測場景重現

場景一:無 PDB 環境 (傳統非 CDB 或單租戶)

CREATE USER c##admin IDENTIFIED BY admin DEFAULT TABLESPACE users;
GRANT DBA TO c##admin;
-- 成功。表空間 USERS 存在於 CDB$ROOT。

場景二:有 PDB (PDBORCL),CDB$ROOT 有 TEST 表空間,PDB 無

-- 在 CDB$ROOT
CREATE TABLESPACE test DATAFILE '/u01/test.dbf' SIZE 100M;
CREATE USER c##test IDENTIFIED BY test DEFAULT TABLESPACE test;
-- 錯誤:ORA-65048: common user c##test cannot be created because tablespace test does not exist in PDBORCL.

場景三:在 PDB 中建立同名表空間後再建 Common User

-- 切換至 PDB
ALTER SESSION SET CONTAINER = PDBORCL;
CREATE TABLESPACE test DATAFILE '/u01/pdb_test.dbf' SIZE 100M;

-- 切回 CDB$ROOT
ALTER SESSION SET CONTAINER = CDB$ROOT;
CREATE USER c##test IDENTIFIED BY test DEFAULT TABLESPACE test;
-- 成功。CDB$ROOT 與 PDBORCL 均有 TEST 表空間 (雖然檔案路徑、大小可不同)。

關鍵操作指令

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved