文件版本:1.0
最後更新:2026-01-09
適用版本:Oracle Database 26ai Free (23.26.0)
1. 環境需求
1.1 虛擬機硬體需求
| 項目 | 最低需求 | 建議配置 | 說明 |
|---|---|---|---|
| vCPU | 2 核心 | 2 核心 | Free 版本限制最多 2 核心 |
| RAM | 4 GB | 6-8 GB | Free 版本限制最多 2 GB |
| 磁碟 | 40 GB | 60 GB | 建議 SSD |
| Swap | 2 GB | 4 GB |
1.2 軟體需求
| 軟體 | 版本 |
|---|---|
| 作業系統 | Oracle Linux 8 / Ubuntu 22.04+ |
| Docker | 20.10+ |
| Docker Compose | v2.0+ |
1.3 Free 版本限制
| 項目 | 限制 |
|---|---|
| CPU | 最多 2 核心 |
| 記憶體 | 最多 2 GB |
| User Data | 最多 12 GB |
| SID | 固定 FREE |
| PDB | 固定 FREEPDB1 |
2. 系統準備
2.1 Oracle Linux 8
# 更新系統
sudo dnf update -y
# 安裝 Docker
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 啟動 Docker
sudo systemctl start docker
sudo systemctl enable docker
# 加入 docker 群組
sudo usermod -aG docker $USER
newgrp docker
# 設定防火牆
sudo firewall-cmd --permanent --add-port=1521/tcp
sudo firewall-cmd --reload
2.2 Ubuntu 22.04/24.04
# 更新系統
sudo apt update && sudo apt upgrade -y
# 安裝 Docker
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 加入 docker 群組
sudo usermod -aG docker $USER
newgrp docker
# 設定防火牆
sudo ufw allow 1521/tcp
2.3 驗證安裝
docker --version
docker compose version
3. Docker Compose 部署
3.1 建立專案目錄
mkdir -p ~/oracle-free
cd ~/oracle-free
3.2 建立目錄結構
mkdir -p oradata scripts/setup scripts/startup
完成後目錄結構如下:
oracle-free/
├── docker-compose.yml
├── .env
├── .env.example
├── .gitignore
├── oradata/
└── scripts/
├── setup/
└── startup/
3.3 建立 .env.example
cat << 'EOF' > .env.example
# Oracle Database Free 環境變數範本
# 複製此檔案為 .env 並填入實際值:cp .env.example .env
# 資料庫密碼(必填,至少 8 字元,含大小寫和數字)
ORACLE_PWD=
# 字元集(選填)
ORACLE_CHARACTERSET=AL32UTF8
# 啟用歸檔日誌(選填)
ENABLE_ARCHIVELOG=false
# 啟用強制日誌(選填)
ENABLE_FORCE_LOGGING=false
# 資料目錄
ORACLE_DATA_DIR=./oradata
EOF
3.4 建立 .env
cat << 'EOF' > .env
# Oracle Database Free 環境變數
ORACLE_PWD=YourSecurePassword123
ORACLE_CHARACTERSET=AL32UTF8
ENABLE_ARCHIVELOG=false
ENABLE_FORCE_LOGGING=false
ORACLE_DATA_DIR=./oradata
EOF
請修改 ORACLE_PWD 為你的密碼(至少 8 字元,含大小寫和數字)
3.5 建立 docker-compose.yml
cat << 'EOF' > docker-compose.yml
version: "3.8"
services:
oracle-free:
image: container-registry.oracle.com/database/free:latest
container_name: oracle-free
hostname: oracle-free
ports:
- "1521:1521"
environment:
- ORACLE_PWD=${ORACLE_PWD}
- ORACLE_CHARACTERSET=${ORACLE_CHARACTERSET:-AL32UTF8}
- ENABLE_ARCHIVELOG=${ENABLE_ARCHIVELOG:-false}
- ENABLE_FORCE_LOGGING=${ENABLE_FORCE_LOGGING:-false}
volumes:
- ${ORACLE_DATA_DIR:-./oradata}:/opt/oracle/oradata
- ./scripts/setup:/opt/oracle/scripts/setup
- ./scripts/startup:/opt/oracle/scripts/startup
healthcheck:
test: ["CMD", "sqlplus", "-L", "sys/${ORACLE_PWD}@FREE as sysdba", "@/dev/null"]
interval: 30s
timeout: 10s
retries: 10
start_period: 300s
restart: unless-stopped
networks:
default:
name: oracle-network
EOF
3.6 建立 .gitignore(選用)
cat << 'EOF' > .gitignore
# 環境變數(含密碼)
.env
# 資料目錄
oradata/
# 日誌
*.log
EOF
3.7 設定資料目錄權限
sudo chown -R 54321:54321 oradata
4. 啟動服務
4.1 登入 Oracle Container Registry
首次使用需登入(使用 Oracle 帳號):
docker login container-registry.oracle.com
4.2 啟動容器
# 啟動(背景執行)
docker compose up -d
# 查看啟動日誌
docker compose logs -f
4.3 等待資料庫就緒
首次啟動需要 3-10 分鐘初始化,等待出現以下訊息:
#########################
DATABASE IS READY TO USE!
#########################
4.4 檢查狀態
# 容器狀態
docker compose ps
# 健康檢查狀態
docker inspect oracle-free --format='{{.State.Health.Status}}'
5. 連線測試
5.1 連線資訊
| 項目 | 值 |
|---|---|
| Host | localhost 或 VM IP |
| Port | 1521 |
| SID | FREE |
| Service Name (CDB) | FREE |
| Service Name (PDB) | FREEPDB1 |
| SYS 密碼 | .env 中設定的 ORACLE_PWD |
5.2 使用 sqlplus 連線
# 連線到 CDB(以 sysdba 身份)
docker exec -it oracle-free sqlplus sys/\${ORACLE_PWD}@FREE as sysdba
# 連線到 PDB
docker exec -it oracle-free sqlplus pdbadmin/\${ORACLE_PWD}@FREEPDB1
或直接指定密碼:
docker exec -it oracle-free sqlplus sys/YourSecurePassword123@FREE as sysdba
5.3 驗證 SQL
-- 檢查實例狀態
SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;
-- 檢查 PDB
SELECT NAME, OPEN_MODE FROM V$PDBS;
-- 檢查版本
SELECT BANNER FROM V$VERSION WHERE ROWNUM = 1;
-- 離開
EXIT;
6. 常用操作
6.1 服務管理
# 啟動
docker compose up -d
# 停止
docker compose down
# 重啟
docker compose restart
# 查看日誌
docker compose logs -f
# 查看即時日誌(最後 100 行)
docker compose logs -f --tail 100
6.2 變更密碼
docker exec oracle-free /opt/oracle/setPassword.sh NewPassword456
記得同步更新 .env 檔案中的 ORACLE_PWD。
6.3 進入容器
# Bash shell
docker exec -it oracle-free bash
# 直接進入 sqlplus
docker exec -it oracle-free sqlplus / as sysdba
6.4 查看 Alert Log
docker exec oracle-free tail -100 /opt/oracle/diag/rdbms/free/FREE/trace/alert_FREE.log
7. 自訂初始化腳本
7.1 腳本說明
| 目錄 | 執行時機 |
|---|---|
scripts/setup/ | 資料庫首次建立後執行一次 |
scripts/startup/ | 每次容器啟動後執行 |
支援 .sql 和 .sh 檔案,依檔名順序執行(建議加數字前綴)。
7.2 範例:建立應用程式使用者
cat << 'EOF' > scripts/setup/01_create_appuser.sql
-- 切換到 PDB
ALTER SESSION SET CONTAINER = FREEPDB1;
-- 建立使用者
CREATE USER appuser IDENTIFIED BY "AppUserPassword123"
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON USERS;
-- 授權
GRANT CONNECT, RESOURCE TO appuser;
GRANT CREATE VIEW, CREATE SYNONYM TO appuser;
COMMIT;
EXIT;
EOF
7.3 範例:建立範例資料表
cat << 'EOF' > scripts/setup/02_create_tables.sql
ALTER SESSION SET CONTAINER = FREEPDB1;
-- 切換到 appuser
ALTER SESSION SET CURRENT_SCHEMA = appuser;
-- 建立資料表
CREATE TABLE employees (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR2(100) NOT NULL,
email VARCHAR2(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入測試資料
INSERT INTO employees (name, email) VALUES ('張三', 'zhang@example.com');
INSERT INTO employees (name, email) VALUES ('李四', 'li@example.com');
COMMIT;
EXIT;
EOF
7.4 套用腳本
如果容器已在運行,需要重建:
# 停止並移除容器和資料
docker compose down -v
sudo rm -rf oradata/*
sudo chown -R 54321:54321 oradata
# 重新啟動
docker compose up -d
8. 備份與還原
8.1 使用 Data Pump 匯出
# 建立備份目錄
docker exec oracle-free mkdir -p /opt/oracle/backup
# 匯出 Schema
docker exec oracle-free expdp system/${ORACLE_PWD}@FREEPDB1 \
directory=DATA_PUMP_DIR \
dumpfile=backup_$(date +%Y%m%d).dmp \
logfile=backup_$(date +%Y%m%d).log \
schemas=APPUSER
# 複製到主機
docker cp oracle-free:/opt/oracle/admin/FREE/dpdump/ ./backup/
8.2 使用 Data Pump 匯入
# 複製備份到容器
docker cp ./backup/backup_20260109.dmp oracle-free:/opt/oracle/admin/FREE/dpdump/
# 匯入
docker exec oracle-free impdp system/${ORACLE_PWD}@FREEPDB1 \
directory=DATA_PUMP_DIR \
dumpfile=backup_20260109.dmp \
schemas=APPUSER
8.3 備份整個資料目錄
# 停止容器
docker compose down
# 備份資料目錄
sudo tar -czvf oracle-free-backup-$(date +%Y%m%d).tar.gz oradata/
# 重新啟動
docker compose up -d
9. 故障排除
9.1 容器無法啟動
# 檢查日誌
docker compose logs
# 常見原因:
# 1. 資料目錄權限不正確
sudo chown -R 54321:54321 oradata
# 2. 磁碟空間不足
df -h
# 3. 記憶體不足
free -h
9.2 連線被拒絕
# 確認容器運行中
docker compose ps
# 確認 Listener 狀態
docker exec oracle-free lsnrctl status
# 確認防火牆
sudo firewall-cmd --list-ports # Oracle Linux
sudo ufw status # Ubuntu
9.3 密碼錯誤
# 重設密碼
docker exec oracle-free /opt/oracle/setPassword.sh NewPassword
# 更新 .env 檔案
vim .env
9.4 完全重建
# 停止並刪除所有資料
docker compose down -v
sudo rm -rf oradata/*
sudo chown -R 54321:54321 oradata
# 重新建立
docker compose up -d
10. 完整檔案範本
10.1 一鍵建立所有檔案
#!/bin/bash
# create-oracle-free.sh
# 建立目錄
mkdir -p ~/oracle-free/{oradata,scripts/setup,scripts/startup}
cd ~/oracle-free
# 建立 .env.example
cat << 'EOF' > .env.example
ORACLE_PWD=
ORACLE_CHARACTERSET=AL32UTF8
ENABLE_ARCHIVELOG=false
ENABLE_FORCE_LOGGING=false
ORACLE_DATA_DIR=./oradata
EOF
# 建立 .env
cat << 'EOF' > .env
ORACLE_PWD=YourSecurePassword123
ORACLE_CHARACTERSET=AL32UTF8
ENABLE_ARCHIVELOG=false
ENABLE_FORCE_LOGGING=false
ORACLE_DATA_DIR=./oradata
EOF
# 建立 docker-compose.yml
cat << 'EOF' > docker-compose.yml
version: "3.8"
services:
oracle-free:
image: container-registry.oracle.com/database/free:latest
container_name: oracle-free
hostname: oracle-free
ports:
- "1521:1521"
environment:
- ORACLE_PWD=${ORACLE_PWD}
- ORACLE_CHARACTERSET=${ORACLE_CHARACTERSET:-AL32UTF8}
- ENABLE_ARCHIVELOG=${ENABLE_ARCHIVELOG:-false}
- ENABLE_FORCE_LOGGING=${ENABLE_FORCE_LOGGING:-false}
volumes:
- ${ORACLE_DATA_DIR:-./oradata}:/opt/oracle/oradata
- ./scripts/setup:/opt/oracle/scripts/setup
- ./scripts/startup:/opt/oracle/scripts/startup
healthcheck:
test: ["CMD", "sqlplus", "-L", "sys/${ORACLE_PWD}@FREE as sysdba", "@/dev/null"]
interval: 30s
timeout: 10s
retries: 10
start_period: 300s
restart: unless-stopped
networks:
default:
name: oracle-network
EOF
# 建立 .gitignore
cat << 'EOF' > .gitignore
.env
oradata/
*.log
EOF
# 設定權限
sudo chown -R 54321:54321 oradata
echo "=== 建立完成 ==="
echo "1. 編輯 .env 設定密碼"
echo "2. 執行 docker compose up -d 啟動"
10.2 使用方式
# 儲存腳本
vim create-oracle-free.sh
# 執行
bash create-oracle-free.sh
# 編輯密碼
cd ~/oracle-free
vim .env
# 登入 Oracle Container Registry
docker login container-registry.oracle.com
# 啟動
docker compose up -d
# 查看日誌
docker compose logs -f
參考資源
文件由 Claude 整理