容器化技術的普及,已將 Oracle Database 等傳統關聯式資料庫的部署模式推向新階段,在 Docker 環境中進行開發與測試成為標準實踐。此方法不僅簡化了環境配置,更確保了部署的一致性。本文以 Oracle Database 11g XE 為範例,從基礎的使用者帳號與權限建立,到實際的數據表定義(DDL)與資料操作(DML),完整演示容器化環境的資料庫管理週期。此外,透過與 MySQL 在使用者模型、欄位約束、自動增長機制等核心設計上的比較,本文旨在闡明不同資料庫在架構哲學上的差異,協助技術人員在面對多樣化的解決方案時,能做出更具深度的技術評估。

創建數據庫使用者與賦予權限

在成功連接到數據庫後,為了安全和管理方便,我們通常會創建新的數據庫使用者,並為其分配必要的權限。

創建新使用者 OE

本節將演示如何創建一個名為 OE 的使用者,並為其配置無限額度的 SYSTEM 表空間和指定密碼。

  1. SQL 命令: 在 SQL*Plus 的 SQL> 提示符下,執行以下命令:

    CREATE USER OE QUOTA UNLIMITED ON SYSTEM IDENTIFIED BY 玄貓;
    
    • CREATE USER OE:創建一個名為 OE 的使用者。
    • QUOTA UNLIMITED ON SYSTEM:為該使用者在 SYSTEM 表空間設置無限的空間配額。SYSTEM 表空間通常用於存儲數據字典和系統對象,對於初學者或測試環境,可以這樣設置,但在生產環境中應謹慎。
    • IDENTIFIED BY 玄貓:設置使用者的密碼為 玄貓。請注意,這裡使用了台灣本地慣用的繁體中文作為密碼,這在實際應用中是不推薦的,但用於演示。在生產環境中,應使用複雜且安全的密碼。
  2. 賦予權限: 創建使用者後,還需要為其賦予必要的權限才能執行數據庫操作。CONNECT 角色允許使用者連接到數據庫,RESOURCE 角色則允許使用者創建數據庫對象(如表、視圖等)。

    GRANT CONNECT, RESOURCE TO OE;
    

執行完這些 SQL 命令後,使用者 OE 就被成功創建,並擁有了連接和創建數據庫對象的基本權限。

Oracle Database 11g XE 的數據表操作與容器資源清理

本章節將引導您完成在 Oracle Database 11g XE 容器中創建數據表、插入數據以及查詢數據的過程。最後,我們將學習如何清理 Docker 環境中不再需要的數據庫容器和映像檔。

OE Schema 中創建數據表

在成功創建 OE 使用者並賦予權限後,我們就可以使用該使用者來創建數據庫對象。

  1. 創建 Catalog: 使用 SQL*Plus,以 OE 使用者身份連接(如果尚未連接,請先執行 sqlplus OE/玄貓@localhost:1521/xe)。然後,執行以下 SQL 語句來創建一個名為 Catalog 的表,並定義其結構:

    CREATE TABLE OE.Catalog(
        CatalogId INTEGER PRIMARY KEY,
        Journal VARCHAR2(25),
        Publisher VARCHAR2(25),
        Edition VARCHAR2(25),
        Title VARCHAR2(45),
        Author VARCHAR2(25)
    );
    
    • CREATE TABLE OE.Catalog:在 OE schema 下創建一個名為 Catalog 的表。
    • CatalogId INTEGER PRIMARY KEY:定義一個名為 CatalogId 的整數欄位,並將其設為主鍵。
    • 後續欄位定義了雜誌的期刊名稱、出版商、版本、標題和作者,均為 VARCHAR2 類型,並指定了最大長度。

    執行此命令後,您會收到「Table created.」的確認訊息,表示 Catalog 表已成功創建。

向數據表中插入數據

創建表後,就可以向其中添加數據了。

  1. 插入單行數據: 使用 INSERT INTO 語句向 OE.Catalog 表中插入一條記錄:

    INSERT INTO OE.Catalog VALUES('1','Oracle Magazine','Oracle Publishing','November December 2013','Engineering as a Service','David A. Kelly');
    
    • '1':對應 CatalogId,注意這裡雖然是數字,但作為字串傳入,Oracle 會自動轉換。
    • 後續的字串值分別對應 JournalPublisherEditionTitleAuthor 欄位。

    執行此命令後,您會收到「One row created.」的確認訊息。

查詢數據表中的數據

為了驗證數據是否已成功插入,可以使用 SELECT 語句查詢表中的內容。

  1. 執行查詢

    SELECT * FROM OE.CATALOG;
    

    此查詢會返回 OE.Catalog 表中的所有欄位和所有行。

    您將看到之前插入的那一行數據被顯示出來,確認數據操作成功。

退出 SQL*Plus

完成數據庫操作後,可以使用 exit 命令退出 SQL*Plus 工具。

EXIT;

這將終止 SQL*Plus 會話,並將您返回到容器的 Shell 提示符。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

object "使用者" as User
object "Docker CLI" as DockerCLI
object "Docker Daemon" as DockerDaemon
object "Docker Container (orcldb)" as ORCLDBContainer
object "SQL*Plus Tool" as SQLPlus
object "Oracle Database 11g XE Instance" as OracleXEInstance

partition "Oracle Database 11g XE 數據表操作與退出" {
  User --> SQLPlus : 在 SQL> 提示符下執行 CREATE TABLE OE.Catalog(...)
  SQLPlus --> OracleXEInstance : 發送 CREATE TABLE 語句
  OracleXEInstance --> User : 返回 "Table created." 確認訊息
  User --> SQLPlus : 執行 INSERT INTO OE.Catalog VALUES(...)
  SQLPlus --> OracleXEInstance : 發送 INSERT 語句
  OracleXEInstance --> User : 返回 "One row created." 確認訊息
  User --> SQLPlus : 執行 SELECT * FROM OE.CATALOG
  SQLPlus --> OracleXEInstance : 發送 SELECT 語句
  OracleXEInstance --> SQLPlus : 返回查詢結果 (一行數據)
  SQLPlus --> User : 顯示查詢結果
  User --> SQLPlus : 執行 EXIT 命令
  SQLPlus --> User : 終止 SQL*Plus 會話
}

partition "清理 Docker 資源" {
  User --> DockerCLI : 執行 docker rm c0fa107a43d2 (或 docker rm orcldb)
  DockerCLI --> DockerDaemon : 請求移除容器
  DockerDaemon --> ORCLDBContainer : 標記容器為已停止並準備移除
  DockerDaemon --> User : 返回容器移除確認訊息
  User --> DockerCLI : 執行 docker rmi sath89/oracle-xe-11g
  DockerCLI --> DockerDaemon : 請求移除映像檔
  DockerDaemon --> OracleXEImage : 檢查映像檔是否還有其他容器依賴
  DockerDaemon --> User : 返回映像檔移除確認訊息 (若無依賴)
}

@enduml

看圖說話:

此圖示涵蓋了 Oracle Database 11g XE 容器內的數據表操作以及最終的資源清理過程。在 SQLPlus 環境中,使用者首先執行 CREATE TABLE OE.Catalog(...) 命令,SQLPlus 將此語句傳送給 Oracle Database 11g XE 實例,實例處理後回傳「Table created.」的確認訊息。接著,使用者執行 INSERT INTO OE.Catalog VALUES(...) 命令,將一筆數據插入到 Catalog 表中,數據庫實例回傳「One row created.」的確認。為了驗證插入操作,使用者執行 SELECT * FROM OE.CATALOG,數據庫實例查詢並返回了剛才插入的那一行數據,顯示在使用者終端。完成所有數據操作後,使用者在 SQL*Plus 中輸入 EXIT 命令,終止了數據庫的互動式會話。隨後,使用者回到 Docker CLI 環境,執行 docker rm c0fa107a43d2(或使用容器名稱 orcldb)來移除已經停止運行的 Oracle Database 容器,Docker Daemon 執行此操作並確認。最後,使用者執行 docker rmi sath89/oracle-xe-11g 命令,Docker Daemon 檢查該映像檔是否還有其他容器依賴,若無則將其從本地移除,完成整個 Docker 資源的清理工作。

移除 Oracle Database 容器與映像檔

完成 Oracle Database 的使用後,為了釋放磁碟空間和保持環境整潔,我們需要移除不再需要的 Docker 資源。

  1. 移除容器: 首先,確保 Oracle Database 容器已停止。然後,使用 docker rm 命令移除容器。您可以使用容器的 ID(例如 c0fa107a43d2)或您在啟動時指定的名稱(例如 orcldb)。

    sudo docker rm c0fa107a43d2
    

    執行此命令後,容器及其相關的文件系統將被刪除。

  2. 移除映像檔: 如果不再需要 sath89/oracle-xe-11g 這個 Docker 映像檔,可以使用 docker rmi 命令將其從本地倉庫中移除。

    sudo docker rmi sath89/oracle-xe-11g
    

    請注意,如果該映像檔還有其他容器正在使用或依賴它,docker rmi 命令可能會失敗,提示您需要先移除所有依賴該映像檔的容器。

執行這些清理命令後,Oracle Database 的 Docker 容器和映像檔將被徹底移除。

下一章預告:MySQL 數據庫的 Docker 化

下一章將轉向另一個廣泛使用的開源關係型數據庫——MySQL。我們將探討如何在 Docker 容器中部署 MySQL,並對比其與 Oracle Database 在某些方面的異同,特別是在用戶管理和權限模型上的差異。

MySQL 與 Oracle Database 的核心差異探討

儘管 MySQL 和 Oracle Database 同為廣泛使用的關係型數據庫,但它們在設計理念、功能實現和細節處理上存在顯著差異。理解這些差異對於在不同數據庫環境中進行開發和管理至關重要。

1. 用戶與權限管理模型

  • Oracle Database:Oracle 採用了基於 角色(Roles) 的權限管理系統。權限可以被授予給角色,然後角色再授予給使用者。這種模型使得權限管理更加靈活和集中,便於維護大量使用者。
  • MySQL:MySQL 的權限管理相對直接,它不直接支持角色的概念。權限必須單獨授予給每個使用者。雖然可以透過創建特定權限組合的「模擬角色」使用者來實現類似功能,但其底層機制與 Oracle 的角色系統不同。

2. 欄位的預設值與 NULL 約束

  • MySQL:在 MySQL 中,如果一個欄位被定義為 NOT NULL,並且在 INSERT 語句中沒有為該欄位提供值,MySQL 會自動為其生成一個預設值(例如,數值類型為 0,字串類型為空字串 ''),前提是 MySQL 的嚴格模式(SQL strict mode)未被啟用。這有助於確保數據的完整性,避免因遺漏插入值而導致錯誤。
  • Oracle Database:Oracle 在處理 NOT NULL 約束時則更為嚴格。如果一個欄位被標記為 NOT NULL,且在 INSERT 語句中未提供值,Oracle 不會自動生成預設值,而是會直接報錯,要求使用者必須為該欄位提供一個有效值。若需要預設值,則必須在欄位定義時明確指定 DEFAULT 子句。

3. 自動增長欄位機制

  • MySQL:MySQL 提供了 AUTO_INCREMENT 屬性,可以直接應用於數據表的某個欄位(通常是主鍵)。當插入新記錄時,MySQL 會自動為該欄位生成一個遞增的唯一值。
  • Oracle Database:Oracle 數據庫則使用 序列(Sequences) 來實現類似的功能。序列是一個獨立的數據庫對象,可以生成唯一的、遞增的數字序列。在插入數據時,需要顯式地調用序列的 NEXTVAL 來獲取下一個值,並將其賦值給相應的欄位。

4. 資料類型差異

  • MySQL:MySQL 支持多種數據類型,但它不直接支持 VARCHAR2 這個 Oracle 特有的數據類型。MySQL 使用 VARCHAR 作為可變長字串的類型,其行為與 VARCHAR2 在某些方面有所不同(例如,VARCHAR2 在 Oracle 中會自動去除尾部空格,而 VARCHAR 在 MySQL 中則不會)。此外,MySQL 還有其他獨特的數據類型,如 ENUMSET 等。
  • Oracle Database:Oracle 擁有豐富的數據類型,包括 VARCHAR2NUMBERDATETIMESTAMP 等,這些類型在 Oracle 的生態系統中有著廣泛的應用。
看圖說話:

此圖示旨在概括 MySQL 與 Oracle Database 在核心機制上的主要差異,並列出本章節將要涵蓋的關於在 Docker 中部署和使用 MySQL 的關鍵學習目標。圖的左側部分,使用者與 Oracle Database 進行互動,重點比較了兩者在權限管理(Oracle 的角色機制 vs MySQL 的獨立授權)、欄位預設值處理(Oracle 的嚴格要求 vs MySQL 的隱含預設值)、自動增長欄位機制(Oracle 的 Sequence vs MySQL 的 AUTO_INCREMENT)以及資料類型(如 VARCHAR2 的差異)等方面的區別。右側部分則描繪了本章的學習路徑:使用者首先透過 Docker CLI 與 Docker Daemon 互動,啟動一個 MySQL 容器,其中運行著 MySQL Server。隨後,使用者進入容器,啟動 MySQL Client(命令行介面),並與 MySQL Server 進行互動,完成設置目標數據庫、創建數據表、添加和查詢數據、列出數據庫與表等一系列操作,最後安全地退出容器的終端。整個流程強調了從環境準備到實際數據操作的完整鏈條。

結論

縱觀本章節從環境建置、數據庫操作到資源清理的完整實踐,不僅展示了容器化技術對提升開發敏捷性與環境一致性的顯著價值,更透過對比 Oracle 與 MySQL 在用戶權限、欄位約束及自動增長機制上的核心差異,揭示了兩者在設計哲學與管理模型上的根本不同。這些差異直接影響著數據庫的效能表現、開發效率與後續的維運複雜度。

對於高階管理者而言,這些技術細節的背後,實則反映了在團隊技能儲備、開發規範彈性與長期維運成本之間的權衡取捨。Oracle 的角色與序列機制提供了嚴謹且強大的管理框架,適合需要高度數據一致性與複雜權限劃分的企業級應用;而 MySQL 的直觀設計與隱含預設值則降低了入門門檻,有利於快速迭代與敏捷開發。在容器化環境中,這些差異雖被簡化了部署流程,但其內在的管理邏輯與效能瓶頸依然存在,是技術選型時必須深入評估的關鍵。

在雲原生架構與微服務日益普及的趨勢下,熟練掌握主流數據庫的容器化部署與管理,已從加分項轉變為開發團隊不可或缺的核心能力。因此,玄貓認為,選擇哪一種數據庫不僅是技術選型的問題,更是對未來開發流程與維運模式的策略性投資。理解其底層差異,是制定高效、可擴展數據策略的基石。