我前幾天在企業內訓授課的時候,因為客戶主要採用 Oracle 資料庫,所以我原本想說要在 Docker 上安裝 Oracle Database 的免費版本來用,結果我在 2019 年寫過的 Oracle Database Server 12c R2 容器文章已經不能用了。這幾天進一步發現 Oracle 官方提供了新版本的 Oracle Database 容器映象可用,但要從官網或網路上找到一篇立即可上手的文章並不容易,我花了好幾個小時才釐清來龍去脈,這篇文章我就打算來分享新版本 Oracle Database 容器映象的安裝與使用方式。
先瞭解 Oracle Database 有哪些「免費」版本
我因為是上課所需,所以我肯定是想安裝「免費」版本,但是 Oracle 家大業大,光是一個資料庫產品,就有超多名字,我從 Oracle Container Registry 的 Database Repositories 就看到好幾個版本,光是「開源的資料庫」就有 8 個不同的 Repositories,其中光是「免費版的資料庫」也有 2 種,分別是 Oracle Database Express Edition (XE) 與 Oracle Database Free,這裡 XE
我還有聽過,這套真的是免費的,但另一套 Free
我就真的完全沒聽過,也不知道差別在哪,不知道應該安裝哪個版本才對,真的非常困擾。
雖然一時間沒辦法找到答案,但我自己分析研判後認為是這樣的:
-
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
的版本的容器映像。
-
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 容器
-
先登入 Oracle Container Registry (OCR)
你必須先建立 Oracle 帳號才能進行登入。
取得你的 Oracle 帳號與密碼後,就可以透過 docker login
來登入 OCR 伺服器:
docker login container-registry.oracle.com
登入成功後,你才可以開始下載 Oracle Database 23c Free 容器映像。
-
下載容器映像
直接下載最新版:
docker pull container-registry.oracle.com/database/free:latest
但我一般會直接指定版本號,以確保我下載的 Oracle 資料庫是我要的版本:
docker pull container-registry.oracle.com/database/free:23.3.0.0
-
啟動 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
指令中指定的密碼)
-
變更 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 這種方式連線:
-
先進入 sqlplus
sqlplus /nolog
-
輸入以下命令進行連線
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)
)
)
接著你就可以這樣連線:
-
先進入 sqlplus
sqlplus /nolog
-
輸入以下命令進行連線
CONNECT SYS/Test1234@MYDB as sysdba
為容器中的 Oracle Database 23c Free 資料庫設定啟動腳本
在 Oracle Database 23c Free 容器中有兩個特殊的資料夾,當容器啟動後,會自動執行 Shell Script (*.sh
) 或 PL/SQL (*.sql
) 命令:
-
/opt/oracle/scripts/setup
當容器剛啟動,而且 Oracle 資料庫還沒有初始化時,這個資料夾中的腳本會在資料庫被初始化之後自動執行。
如果你要確保執行順序,可以用數字當前綴,例如 01_users.sql
、02_permissions.sql
。
-
/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;
相關連結