︿
Top

2024年3月24日 星期日

Oracle 的容器資料庫(CDB) 與 可拔插資料庫(PDB)

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 的架構圖.
01 Oracle_CDB_PDB_only_plugable

(2) 含有 Application Container 的架構圖.
02 Oracle_CDB_PDB_with_appcontainer

三. 連入 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

參考文件

沒有留言:

張貼留言