The Oracle Container DB (CDB) and Pluggable (PDB)
前言
由於最近工作上會用到 Oracle, 想說以前用過 11g, 應該很容易入門才對; 但發現在第一關的建立使用者就踼到鐵板, 如下面指令及輸出結果.
CREATE USER JASPER IDENTIFIED BY Test1234;
-- 執行結果:
-- ORA-65096: common user or role name must start with prefix C##
查了一下, 才發現自 Oracle 12c 起導入了所謂的 Multitenant Environment 多租用戶環境觀念, 允許一個 Container Database (CDB) 承載多個 Pluggable Database (PDB).
章節如下:
一. 建立一個 Oracle 23c Free 的 Docker Container
二. 以 11g 的方式, 建立使用者失敗
三. 連入 CDB, 建立 Common User Account
四. 連入 PDB, 建立屬於該 PDB 的 Local User Account
五. 以前述建立的 Local User Account, 建立 Table
一. 建立一個 Oracle 23c Free 的 Docker Container
參考 Will保哥的這篇文章 , 建立及啟動 Oracle 23c Free 版本的 Oracle 資料庫執行個體.
主要的指令如下:
1.. 啟動 Docker Desktop for Windows.
2.. 在 Windows Terminal 或 PowerShell 登入 container-registry.oracle.com.
註: 當然要先建立 Oracle 的帳號, 才能登入.
docker login container-registry.oracle.com
3.. 下載 Oracle 23c Free 的 docker image.
docker pull container-registry.oracle.com/database/free:23.3.0.0
4.. 啟動基於前述 docker image 的 container.
docker run --name oracle -p 1521:1521 -e ORACLE_PWD=Test1234 -v "oradata:/opt/oracle/oradata" container-registry.oracle.com/database/free:23.3.0.0
5.. 利用本機的 sqlplus 連入 container 的 Oracle 資料庫執行個體.
註: 要先下載 Oracle Instant Client.
PS D:\Temp> sqlplus sys/Test1234@//localhost:1521/FREE as sysdba
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
SQL>
二. 以 11g 的方式, 建立使用者失敗
1.. 執行以下指令, 發生錯誤.
SQL> CREATE USER JASPER IDENTIFIED BY Test1234;
CREATE USER JASPER IDENTIFIED BY Test1234
*
ERROR at line 1:
ORA-65096: common user or role name must start with prefix C##
2.. 參考 黑暗執行緒的這篇文章, 發現自 Oracle 12c 起整個 Oracle 的架構作了大幅度的改變.
3.. 目前連入是在 CDB$ROOT.
CDB$ROOT 代表 CDB 的根容器 (root container). 有點類似 MSSQL 的 master 資料庫.
SQL> SHOW CON_NAME;
CON_NAME
------------------------------
CDB$ROOT
4.. 目前有 2 個 PDBs.
(1) PDB$SEED: Oracle 內建的範本 PDB. 任何使用者自行建立的 PDB, 都會以此為範本. 有點類似 MSSQL 的 model 資料庫.
(2) FREEPDB1: Oracle 的應用程式資料庫. 在同一個 CDB 上面可以有多個應用程式資料庫, 例如: 醫院系統的 病歷, 檢驗, 放射 各個應用系統, 可以有各自的 PDBs. 不用像以前的 11g, 必須切不同資料庫執行個體, 或者同一個 資料庫執行個體, 利用 Schema Name 作區分.
SQL> SHOW PDBs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 FREEPDB1 READ WRITE NO
5.. Oracle 官網 提供的架構圖.
(1) 不含 Application Container 的架構圖.
(2) 含有 Application Container 的架構圖.
三. 連入 CDB, 建立 Common User Account
所謂的 Common User Account, 是指建立在 CDB 上的使用者, 這個使用者可以連入任何 PDBs, 當然, 需要 PDBs 的管理者, 給予使用權限.
1.. 連入 Oracle.
PS D:\Temp> sqlplus sys/Test1234@//localhost:1521/FREE as sysdba
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
SQL>
2.. 建立 CDB 使用者.
SQL> CREATE USER C##JASPER IDENTIFIED BY Test1234;
SQL> GRANT CONNECT, RESOURCE, DBA TO C##JASPER;
Grant succeeded.
3.. 檢視使用者.
SQL> SELECT USER_ID, USERNAME FROM dba_users WHERE USERNAME = 'C##JASPER';
USER_ID USERNAME
------- -------------------------------
134 C##JASPER
四. 連入 PDB, 建立屬於該 PDB 的 Local User Account
1.. 連入 Oracle.
PS D:\Temp> sqlplus SYS/Test1234@localhost:1521/FREEPDB1 AS SYSDBA
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
SQL>
2.. 建立 PDB 使用者.
(1) 預設就有一個 pdbadmin, 但權限不足, 必須額外設定.
(2) 以 pdbadmin 連入, 再建立 JASPER 這個使用者帳號.
SQL> GRANT CONNECT, RESOURCE, DBA TO pdbadmin;
Grant succeeded.
SQL> DISCONNECT;
Disconnected from Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
SQL> CONNECT pdbadmin/Test1234@MYPDB1;
Connected.
SQL> CREATE USER JASPER IDENTIFIED BY Test1234;
User created.
SQL> GRANT CONNECT, RESOURCE, DBA TO JASPER;
Grant succeeded.
五. 以前述建立的 Local User Account, 建立 Table
1.. 連入 PDB.
PS D:\Temp> sqlplus JASPER/Test1234@localhost:1521/FREEPDB1
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
SQL>
2.. 建立 Table, 添加資料, 查詢.
-- 建立 table: EMPLOYEE
CREATE TABLE EMPLOYEE (
Id NUMBER GENERATED AS IDENTITY,
Name NVARCHAR2(32),
Address NVARCHAR2(128),
Photo BLOB,
CONSTRAINT PK_EMPLOYEE PRIMARY KEY (Id)
);
-- 新增資料
INSERT INTO "JASPER"."EMPLOYEE" (NAME, ADDRESS) VALUES (N'JASPER', N'台北市');
-- 查詢資料
SELECT *
FROM EMPLOYEE;
結論
經由前述的過程, 把 CDB 與 PDB 的架構, 稍微釐清一下, 整理如下表.
對於比較熟悉 MSSQL 的朋友, 會比較容易類推, 但只是類似, 不完全相同, 僅供參考.
Oracle | MSSQL |
---|---|
CDB | master |
PDB$SEED | model |
FREEPDB1 (可拔插資料庫) | Northwind |
Common User Account | server login account |
Local User Account | database user account |
沒有留言:
張貼留言