Linux 上 Oracle 資料庫的啟動與關閉涉及環境變數、實例階段、關閉模式選擇等關鍵細節。本文系統整理從環境配置、SQL*Plus 連線、STARTUP/SHUTDOWN 四大模式、監聽器管理、常見錯誤排查到自動化腳本的完整操作指南,適合 DBA 日常運維與新手入門參考。
export ORACLE_SID=ORCL
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
執行 source ~/.bash_profile 生效。驗證:echo $ORACLE_SID、sqlplus -v。
$ sqlplus /nolog
SQL> CONN / AS SYSDBA
SQL> STARTUP;
-- 等同於依序執行:
-- STARTUP NOMOUNT (啟動 SGA + 背景進程,讀取 SPFILE/初始化參數)
-- ALTER DATABASE MOUNT (讀取控制檔,掛載資料庫)
-- ALTER DATABASE OPEN (開啟數據檔/Redo,允許用戶存取)
| 模式 | 階段 | 典型用途 |
|---|---|---|
| NOMOUNT | 僅 Instance | 建立資料庫、重建控制檔、恢復控制檔 |
| MOUNT | Instance + 控制檔 | 備份/恢復控制檔、啟用/關閉歸檔、重命名數據檔/Redo |
| OPEN (預設) | 完整開啟 | 正常業務服務 |
| READ ONLY | 唯讀開啟 | 報表查詢、邏輯備份、立由庫開啟 |
| RESTRICT | 限制模式 | 僅允許 RESTRICTED SESSION 權限用戶 (DBA 維護) |
| FORCE | 強制重啟 | 資料庫掛死無法正常關閉時 (相當 ABORT + STARTUP) |
| PFILE=path | 指定參數檔 | 參數調優測試、SPFILE 損壞恢復 |
SQL> SHUTDOWN IMMEDIATE; -- 推薦生產標準
-- 等同於:
-- 1. 拒絕新連線
-- 2. 等待當前 SQL 完成
-- 3. 回滾未提交交易
-- 4. 斷開所有會話
-- 5. 關閉數據檔/Redo (MOUNT)
-- 6. 釋放 SGA、終止背景進程 (NOMOUNT)
| 模式 | 等待條件 | 資料安全 | 啟動恢復時間 | 適用場景 |
|---|---|---|---|---|
| NORMAL | 所有用戶主動斷開 | ✅ | 短 | 計劃維護、無緊迫性 |
| IMMEDIATE | 當前 SQL 完成 | ✅ (回滾未提交) | 短 | **生產標準** |
| TRANSACTIONAL | 當前交易提交/回滾 | ✅ | 短 | 長交易業務、需最小化回滾 |
| ABORT | 不等待、立即終止 | ⚠️ 需實例恢復 | **長** (視 Redo 量) | 緊急故障、掛死 |
# 啟動
$ lsnrctl start
# 狀態
$ lsnrctl status
# 停止
$ lsnrctl stop
# 重新載入配置 (不中斷現有連線)
$ lsnrctl reload
最佳實踐: **關閉資料庫前先停止監聽器**,啟動資料庫後再啟動監聽器,避免啟動過程中新連線干擾恢復。
| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-01031: insufficient privileges | 非 oracle 用戶 / 未加入 dba 組 / 遠端無密碼檔 | su - oracle / usermod -aG dba oracle / orapwd 建立密碼檔 | ORA-01034: ORACLE not available | 實例未啟動 / ORACLE_SID 錯誤 / 共享記憶體不足 | 檢查 ORACLE_SID、ipcs -m 清理舊段、STARTUP |
| ORA-00845: MEMORY_TARGET not supported | /dev/shm 太小 | mount -o remount,size=4G /dev/shm 或調小 MEMORY_TARGET |
| LRM-00109: could not open parameter file | SPFILE/PFILE 路徑錯誤 | STARTUP PFILE=/path/to/init.ora 或 CREATE SPFILE FROM PFILE |
| 監聽器啟動失敗 TNS-01150 | PORT 1521 佔用 / listener.ora 格式錯 | netstat -anp | grep 1521 / netca 重建 |
| SHUTDOWN 掛起 | 大交易回滾 / 會話不釋放鎖 | 另開會話 KILL SESSION / 無奈則 SHUTDOWN ABORT |
# /etc/systemd/system/oracle-db.service
[Unit]
Description=Oracle Database 19c
After=network.target oracle-listener.service
[Service]
Type=forking
User=oracle
Group=oinstall
Environment=ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
Environment=ORACLE_SID=ORCL
ExecStart=$ORACLE_HOME/bin/dbstart $ORACLE_HOME
ExecStop=$ORACLE_HOME/bin/dbshut $ORACLE_HOME
TimeoutSec=600
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/oracle-listener.service
[Unit]
Description=Oracle Listener
After=network.target
[Service]
Type=forking
User=oracle
Group=oinstall
Environment=ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
ExecStart=$ORACLE_HOME/bin/lsnrctl start
ExecStop=$ORACLE_HOME/bin/lsnrctl stop
[Install]
WantedBy=multi-user.target
# 啟用
systemctl daemon-reload
systemctl enable oracle-listener oracle-db
systemctl start oracle-listener oracle-db
dbstart/dbshut 會讀取 /etc/oratab (格式: ORCL:/u01/app/oracle/product/19.0.0/dbhome_1:Y 最後 Y 表示自動啟動)。
SELECT INSTANCE_NAME, STATUS, OPEN_MODE, LOG_MODE FROM V$INSTANCE, V$DATABASE;SELECT COUNT(*) FROM V$SESSION WHERE USERNAME IS NOT NULL; (應 > 0 含背景進程)lsnrctl status 顯示服務 READYtail -200 $ORACLE_BASE/diag/rdbms/*/*/trace/alert_*.log熟練掌握 Linux 上 Oracle 的啟停模式、環境變數、監聽器協作與自動化部署,是 DBA 穩定交付資料庫服務的基本功。