如何在 Windows 快速啟動一個 Oracle Database 23c Free 資料庫容器

我前幾天在企業內訓授課的時候,因為客戶主要採用 Oracle 資料庫,所以我原本想說要在 Docker 上安裝 Oracle Database 的免費版本來用,結果我在 2019 年寫過的 Oracle Database Server 12c R2 容器文章已經不能用了。這幾天進一步發現 Oracle 官方提供了新版本的 Oracle Database 容器映象可用,但要從官網或網路上找到一篇立即可上手的文章並不容易,我花了好幾個小時才釐清來龍去脈,這篇文章我就打算來分享新版本 Oracle Database 容器映象的安裝與使用方式。

image

先瞭解 Oracle Database 有哪些「免費」版本

我因為是上課所需,所以我肯定是想安裝「免費」版本,但是 Oracle 家大業大,光是一個資料庫產品,就有超多名字,我從 Oracle Container Registry 的 Database Repositories 就看到好幾個版本,光是「開源的資料庫」就有 8 個不同的 Repositories,其中光是「免費版的資料庫」也有 2 種,分別是 Oracle Database Express Edition (XE) 與 Oracle Database Free,這裡 XE 我還有聽過,這套真的是免費的,但另一套 Free 我就真的完全沒聽過,也不知道差別在哪,不知道應該安裝哪個版本才對,真的非常困擾。

雖然一時間沒辦法找到答案,但我自己分析研判後認為是這樣的:

  1. Oracle Database Express Edition (XE)

    這個 XE 版本出來很久了,主要就是給中小企業或開發者用的,它的功能比較簡單,但是免費,所以很多人都會用來開發或測試。

    目前在 Oracle Database XE Release 21c (21.3.0.0) Docker Image Documentation 可以看到他只有兩個 Tag 可用:18.4.0-xe 與 21.3.0-xe。

    所以我研判,這個就是 Oracle Database XE 18c 與 21c 的版本的容器映像。

  2. Oracle Database Free

    這個 Free 版本可能是新推出的,而也從字面上看來也是道道地地的免費版,至於功能是否有受限或者是擁有 Oracle Database 完整版,就不得而知了。

    目前在 Oracle Database Free Release 23c (23.3.0.0) Container Image Documentation 可以看到他只有一個 Tag 可用:23.3.0.0。

    所以我研判,這個就是 Oracle Database 23c 的版本的容器映像。

啟動 Oracle Database 23c Free 容器

  1. 先登入 Oracle Container Registry (OCR)

    你必須先建立 Oracle 帳號才能進行登入。

    取得你的 Oracle 帳號與密碼後,就可以透過 docker login 來登入 OCR 伺服器:

    docker login container-registry.oracle.com
    

    登入成功後,你才可以開始下載 Oracle Database 23c Free 容器映像。

  2. 下載容器映像

    直接下載最新版:

    docker pull container-registry.oracle.com/database/free:latest
    

    但我一般會直接指定版本號,以確保我下載的 Oracle 資料庫是我要的版本:

    docker pull container-registry.oracle.com/database/free:23.3.0.0
    
  3. 啟動 Oracle Database 23c Free 容器

    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
    

    第一次啟動的時間蠻長的,因為要初始化資料庫,所以要耐心等待。

    你可以透過 docker logs oracle -f 查看初始化進度:

    docker logs oracle -f
    

    看到以下字樣就代表資料庫已經可以用了:

    #########################
    DATABASE IS READY TO USE!
    #########################
    

    官方容器的預設帳號密碼如下:

    • SID: FREE
    • 帳號: SYS
    • 密碼: Test1234 (這是我在 docker run 指令中指定的密碼)
  4. 變更 SYS 資料庫管理員的預設密碼

    如果你在 docker run 的時候不指定 -e ORACLE_PWD=Test1234 環境變數時,初始化 Oracle 資料庫之後會設定一組亂數密碼,所以你勢必要修改密碼。

    使用以下命令可以很輕鬆的更換掉預設密碼:

    docker exec -it oracle ./setPassword.sh '<你的新密碼>'
    

連線到容器中的 Oracle Database 23c Free 資料庫

連線到資料庫只要跑 oracle 容器中的 SQL*Plus 工具即可:

# 使用「作業系統認證」來連線到資料庫,並以 SYSDBA 身份登入
docker exec -it oracle sqlplus / as sysdba

# 使用「資料庫認證」來連線到資料庫,並以 SYSDBA 身份登入
# 使用者名稱是 SYS,密碼是 Test1234,實例是 FREE
# 注意: 要登入 SYS 帳號,一定要指定 SYSDBA 或 SYSOPER 角色
docker exec -it oracle sqlplus sys/Test1234@FREE as sysdba

# 使用「資料庫認證」來連線到資料庫
# 使用者名稱是 SYSTEM,密碼是 Test1234,實例是 FREE
# 未使用 as sysdba 連線的典型場景包括應用程式開發者、資料分析師或一般使用者的連線
# 他們需要對特定資料執行查詢、更新、插入和刪除操作,但不需要進行資料庫級別的管理任務。
# SYSTEM 是一個預設的管理賬戶,雖然它的權限低於 SYS 使用者,但仍然擁有執行大多數資料庫管理任務的能力。
docker exec -it oracle sqlplus system/Test1234@FREE

# 連線到 Oracle 資料庫中的特定 Pluggable Database (PDB)
# 注意: FREEPDB1 是 Oracle 資料庫容器中的預設 Pluggable Database 名稱
# 這裡的 pdbadmin 是在 PDB FREEPDB1 中的一個使用者。通常,這種使用者會有管理該 PDB 的權限。
docker exec -it oracle sqlplus pdbadmin/Test1234@FREEPDB1

如果要從容器外連到容器內的資料庫,可以這樣通過認證:

# 以 SYSDBA 的身分與 CDB$ROOT 層級登入
sqlplus sys/Test1234@//localhost:1521/FREE as sysdba

# 以 non-SYSDBA 的身分與 CDB$ROOT 層級登入
sqlplus system/Test1234@//localhost:1521/FREE

# 連到 FREE 資料庫中的 Pluggable Database (PDB) FREEPDB1
sqlplus pdbadmin/Test1234@//localhost:1521/FREEPDB1

如果是應用程式要連接到 Oracle 資料庫,上述的連接字串就可以參考出所有必要的參數。

另一種連線方式則是透過「網路服務名稱」(Network Service Name) 或 TNS Name 這種方式連線:

  1. 先進入 sqlplus

    sqlplus /nolog
    
  2. 輸入以下命令進行連線

    CONNECT SYS@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=FREE)))' as sysdba
    Enter Password:
    

你也可以先設定好 $env:TNS_ADMIN\network\admin\tnsnames.ora 檔案,其內容範例如下:

MYDB =
    (DESCRIPTION=
        (ADDRESS=
            (PROTOCOL=TCP)
            (HOST=localhost)
            (PORT=1521)
        )
        (CONNECT_DATA=
            (SERVER=DEDICATED)
            (SERVICE_NAME=FREE)
        )
    )

接著你就可以這樣連線:

  1. 先進入 sqlplus

    sqlplus /nolog
    
  2. 輸入以下命令進行連線

    CONNECT SYS/Test1234@MYDB as sysdba
    

為容器中的 Oracle Database 23c Free 資料庫設定啟動腳本

在 Oracle Database 23c Free 容器中有兩個特殊的資料夾,當容器啟動後,會自動執行 Shell Script (*.sh) 或 PL/SQL (*.sql) 命令:

  1. /opt/oracle/scripts/setup

    當容器剛啟動,而且 Oracle 資料庫還沒有初始化時,這個資料夾中的腳本會在資料庫被初始化之後自動執行。

    如果你要確保執行順序,可以用數字當前綴,例如 01_users.sql、02_permissions.sql。

  2. /opt/oracle/scripts/startup

    當容器剛啟動,而且 Oracle 資料庫已經找到初始化過的資料庫實例時,這個資料夾中的腳本會在資料庫被初始化之後自動執行。

    如果你要確保執行順序,可以用數字當前綴,例如 01_initial.sql、02_reset.sh。

當然,你也可以透過 -v G:\oracle\startup:/opt/oracle/scripts/startup 這種方式掛載進去。

整理幾個常用的 PL/SQL 命令

  • 列出所有的 Instances 名稱

    SELECT INSTANCE_NAME FROM V$INSTANCE;
    
  • 查看當前用戶名稱

    SELECT USER FROM DUAL;
    
  • 列出所有表格清單 (在當前用戶的 schema 下)

    SELECT TABLE_NAME FROM USER_TABLES;
    
  • 列出所有 schema 中的表格 (需要有足夠的權限)

    SELECT TABLE_NAME FROM ALL_TABLES;
    
  • 列出資料庫中的所有表格 (需要 DBA 權限)

    SELECT TABLE_NAME FROM DBA_TABLES;
    
  • 查看表格結構

    DESCRIBE table_name;
    

    也可以簡寫:

    DESC table_name;
    
  • 檢視資料庫狀態

    SELECT name, open_mode FROM v$database;
    
  • 檢查安裝的 Oracle 版本

    SELECT * FROM v$version;
    
  • 檢視當前的 SGA (System Global Area) 配置

    SHOW sga;
    
  • 列出所有的表格空間 (Tablespaces)

    SELECT tablespace_name FROM dba_tablespaces;
    
  • 檢視資料庫中的所有使用者

    -- 調整每頁顯示筆數
    SET PAGESIZE 50
    
    SELECT username FROM dba_users;
    
  • 檢視 Instance 的組態參數設定

    SHOW parameter;
    
  • 檢視當前連線的 Session 資訊

    SELECT sid, serial#, username, status FROM v$session;
    
  • 建立一個新使用者

    CREATE USER new_user IDENTIFIED BY password;
    
  • 給新使用者分配許可權 (例如:賦予 DBA 角色)

    GRANT dba TO new_user;
    
  • 備份資料庫控制檔案

    ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
    

相關連結

留言評論