建立 Oracle 實例非單純「安裝軟體」,而是**配置參數檔、分配 SGA、啟動背景進程、掛載/開啟資料庫**的精確工程過程。本文提供從**規劃參數、建立 SPFILE、啟動實例、狀態轉換控制、常見啟動失敗排查**的完整 SOP,確保每次啟動可控、可驗證、可回滾。
| 參數 | 決策依據 | 建議值/策略 |
| DB_NAME | 資料庫全域唯一名稱 (最長 8 字元) | 專案代碼縮寫,如 `PRDCRM` |
| DB_UNIQUE_NAME | Data Guard 環境唯一標識 | 同 DB_NAME 或加站點後綴 `PRDCRM_SITEA` |
| SGA_TARGET / MEMORY_TARGET | 記憶體管理模式 (ASMM/AMM) | 生產建議 ASMM: `SGA_TARGET=80% 物理記憶體` |
| PGA_AGGREGATE_TARGET | PGA 總量上限 | `SGA_TARGET * 0.2 ~ 0.5` |
| PROCESSES / SESSIONS | 最大連接數上限 | 預估峰值連接數 × 1.5 + 背景進程 (~30) |
| CONTROL_FILES | 控制檔多路複用路徑 (至少 2 路,不同磁碟/控制器) | `+DATA/PRDCRM/CONTROLFILE/current.1, +FRA/PRDCRM/CONTROLFILE/current.2` |
| DB_BLOCK_SIZE | 資料塊大小 (建立後不可變) | OLTP 8K,DW 16K/32K |
| COMPATIBLE | 版本相容性 (升級後不可降級) | 當前版本號 (如 `19.0.0`) |
| UNDO_TABLESPACE / UNDO_MANAGEMENT | 自動 Undo 管理 | `AUTO`, 專用 UNDO 表空間 |
| LOG_ARCHIVE_DEST_n | 歸檔目的地 (生產必開啟歸檔模式) | 至少 2 路:本地 + 遠端/備份 |
建立 SPFILE (Server Parameter File) —— 持久化參數倉庫
-- 1. 以 PFILE 文本編輯 (init.ora)
-- 2. 啟動 NOMOUNT 實例 (讀取 PFILE)
STARTUP NOMOUNT PFILE='/u01/app/oracle/dbs/initPRDCRM.ora';
-- 3. 從記憶體建立 SPFILE (寫入磁碟,二進制格式)
CREATE SPFILE FROM PFILE='/u01/app/oracle/dbs/initPRDCRM.ora';
-- 或指定 ASM 路徑
CREATE SPFILE='+DATA/PRDCRM/PARAMETERFILE/spfilePRDCRM.ora'
FROM PFILE='/u01/app/oracle/dbs/initPRDCRM.ora';
-- 4. 驗證 SPFILE 內容
SELECT name, value FROM v$spparameter WHERE value IS NOT NULL;
優勢: SPFILE 支援 `ALTER SYSTEM SET ... SCOPE=SPFILE/BOTH` 動態持久化,無需手工編輯文本、重啟生效。
三階段啟動流程標準化操作
階段 1:NOMOUNT (啟動實例)
-- 環境變數
export ORACLE_SID=PRDCRM
export ORACLE_HOME=/u01/app/oracle/product/19c
export PATH=$ORACLE_HOME/bin:$PATH
-- 啟動 (讀取 SPFILE 預設位置 $ORACLE_HOME/dbs/spfile.ora)
sqlplus / as sysdba
SQL> STARTUP NOMOUNT;
-- 輸出確認:
-- ORACLE instance started.
-- Total System Global Area 8589934592 bytes
-- ...
**驗證點:** `V$SGAINFO`、`V$BGPROCESS` (PMON/SMON/DBW0/LGWR/CKPT/SMON/ARC0... 狀態 `STARTED`)。
階段 2:MOUNT (掛載資料庫)
SQL> ALTER DATABASE MOUNT;
-- 輸出:Database altered.
-- 驗證:
SQL> SELECT name, open_mode FROM v$database;
-- NAME OPEN_MODE
-- PRDCRM MOUNTED
**適用場景:** 完整備份 (冷備份)、控制檔維護、歸檔模式切換、Data Guard 實體備份。此階段**僅 DBA 可連線** (`RESTRICTED SESSION`)。
階段 3:OPEN (開啟資料庫)
SQL> ALTER DATABASE OPEN;
-- 輸出:Database altered.
-- 驗證:
SQL> SELECT name, open_mode FROM v$database;
-- NAME OPEN_MODE
-- PRDCRM READ WRITE
-- 可選:唯讀開啟 (報表/備份)
SQL> ALTER DATABASE OPEN READ ONLY;
**驗證點:** `V$INSTANCE.STATUS = OPEN`,`V$THREAD.STATUS = OPEN`,Alert Log 記錄 `Database opened`。
一鍵完整啟動 (生產標準)
SQL> STARTUP;
-- 等同於依序執行 NOMOUNT → MOUNT → OPEN
關閉與狀態轉換控制鐵律
| 命令 | 行為 | 適用場景 | 耗時 |
| SHUTDOWN NORMAL | 等待所有用戶斷開、交易提交 | 計畫維護窗口、用戶少 | 不可控 (視用戶) |
| SHUTDOWN TRANSACTIONAL | 阻止新連接/交易,等待進行中交易提交/回滾 | **生產標準關閉**,平衡速度與數據安全 | 秒~分鐘 |
| SHUTDOWN IMMEDIATE | 強制回滾未提交交易、斷開所有連接、不做 Checkpoint | 緊急維護、效能惡化需快速重啟 | 秒級 |
| SHUTDOWN ABORT | 瞬間終止實例進程,**不關閉檔案**、下次啟動需實例恢復 | **極端緊急** (存儲故障、OS 掛起)、最後手段 | 瞬間 |
鐵律: **單向流向**:OPEN → MOUNT → NOMOUNT → SHUTDOWN。**無法從 OPEN 直接降級到 MOUNT**,必須 SHUTDOWN 再 STARTUP MOUNT。
特殊啟動模式
- RESTRICTED SESSION: `STARTUP RESTRICT` / `ALTER SYSTEM ENABLE RESTRICTED SESSION`。僅 `RESTRICTED SESSION` 權限用戶可連線 (DBA、維護帳號)。用於資料遷移、升級、大批次維護。
- FORCE: `STARTUP FORCE`。相當於 `SHUTDOWN ABORT` + `STARTUP`。實例卡住、共享記憶體殘留時強制重啟。
- RECOVER: `STARTUP MOUNT` → `RECOVER DATABASE` → `ALTER DATABASE OPEN`。介質恢復流程。
- UPGRADE/DOWNGRADE: `STARTUP UPGRADE` / `STARTUP DOWNGRADE`。版本升降級專用模式,僅核心系統表可存取。
常見啟動失敗排查矩陣
| 錯誤/現象 | 可能原因 | 排查動作 |
| ORA-01078: failure in processing system parameters | 參數檔路徑錯、參數值非法、隱藏參數衝突 | 檢查 Alert Log 具體參數錯誤行;改用 PFILE 啟動修正後重建 SPFILE |
| ORA-00205: error in identifying control file | CONTROL_FILES 路徑錯、檔案遺失、ASM 磁碟組未掛載 | 檢查參數值、ASM 實例狀態、從備份恢復控制檔 |
| ORA-01157: cannot identify/lock data file | 資料檔遺失、離線、權限、存儲故障 | `V$RECOVER_FILE` 確認狀態;恢復或離線非核心檔案 |
| ORA-00313: open failed for members of log group | Redo Log 損壞/遺失、多路複用成員不一致 | 清除/重建損壞成員;必要時不完全恢復 |
| 實例啟動卡住 (無報錯) | 共享記憶體不足 (OS /dev/shm)、大頁面配置錯、背景進程啟動順序死鎖 | 檢查 OS `ipcs -m`、`/proc/meminfo`、Alert Log 最後幾行;`STARTUP FORCE` |
| ORA-01033: ORACLE initialization or shutdown in progress | 實例尚未完全開啟 (恢復中)、或已開始關閉 | 等待或 `SHUTDOWN ABORT` 後重啟 |
啟動後驗證清單 (健康檢查)
- [ ] `SELECT status FROM v$instance;` → `OPEN`
- [ ] `SELECT open_mode FROM v$database;` → `READ WRITE`
- [ ] `SELECT count(*) FROM v$bgprocess WHERE pname NOT IN ('P000'...) AND status != 'STARTED';` → `0` (所有背景進程運行)
- [ ] `SELECT * FROM v$recover_file;` → `0 rows` (無需恢復檔案)
- [ ] Alert Log 尾端無錯誤、無 `ORA-` 開頭行
- [ ] 關鍵服務註冊:`LSNRCTL SERVICES` 顯示 `READY` 狀態
- [ ] 測試連線:`SQLPLUS user/pwd@tns` 成功
總結
實例建立與啟動是**基礎設施工程**,而非隨意操作。**參數規劃 → SPFILE 持久化 → 三階段標準啟動 → 健康檢查驗證 → 狀態轉換管控** 五環扣一環。將此 SOP 納入自動化部署腳本 (Ansible/Terraform/Shell)、變更管理流程、災難恢復演練手冊,才能保證 7×24 系統的啟動可靠性。
- 上一篇文章: Oracle SQL 效能優化綜合指南:優化器選擇、表存取、共享游標、連接順序四大支柱實戰
- 下一篇文章: Oracle SQL 優化規則精華:WHERE 條件順序、SELECT 星號禁忌、減少資料庫往返三大鐵律
Copyright ©
程式碼之家 All Rights Reserved