Oracle 10g/11g/12c/19c on Linux/Unix (AIX, HP-UX, Solaris) / Windows。生產環境建議在維護窗口執行,並提前通知應用擁有者。
$ lsnrctl stop
# 或指定 Listener 名稱
$ lsnrctl stop LISTENER_ORCL
防止新連線建立,加速現有會話中斷。SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
產生的 trace 檔位於 `USER_DUMP_DEST` (11g+ 為 `DIAG_DEST`),含 `CREATE CONTROLFILE` 腳本,災難恢復關鍵。SQL> ALTER SYSTEM SWITCH LOGFILE;
-- 建議連續執行 2-3 次,確保當前 redo 已歸檔
減少執行個體恢復時間 (MTTR)。SQL> SET HEAD OFF FEEDBACK OFF NEWPAGE NONE PAGESIZE 0
SQL> SPOOL /tmp/kill_sessions.sql
SQL> SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
2 FROM v$session WHERE username IS NOT NULL;
SQL> SPOOL OFF
SQL> @/tmp/kill_sessions.sql
`IMMEDIATE` 讓交易回滾並釋放鎖定,避免 `SHUTDOWN IMMEDIATE` 等待過久。SQL> SHUTDOWN IMMEDIATE;
-- 等待完成:Database closed. Database dismounted. ORACLE instance shut down.
禁止使用 `SHUTDOWN ABORT`** (除非極端故障),否則啟動時需執行執行個體恢復,耗時不可控且有資料一致性風險。$ lsnrctl start
確認服務狀態 `READY`。$ sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> STARTUP;
-- 或使用舊版 svrmgrl (10g 前)
$ svrmgrl
SVRMGR> CONNECT INTERNAL
SVRMGR> STARTUP
觀察輸出:`Database mounted. Database opened.` 代表啟動成功。| 情境 | 調整建議 |
|---|---|
| RAC 叢集 | 需在所有節點依序執行,或使用 `srvctl stop/start database -d |
| Data Guard 物理備援 | 主庫關閉前確保備援庫同步完成 (無應用延遲);啟動順序:主庫 → 備援庫。 |
| Windows 服務管理 | 用 `net stop OracleServiceORCL` / `net start OracleServiceORCL` 控制執行個體服務;Listener 同為服務。 |
| 緊急重啟 (掛死) | `SHUTDOWN ABORT` → `STARTUP` → 立即執行 `ANALYZE TABLE ... VALIDATE STRUCTURE` 檢查壞塊。 |
| 修改參數需重啟 | 僅修改靜態參數 (如 `memory_target`, `processes`, `db_block_size`) 才需重啟;動態參數 `ALTER SYSTEM SET ... SCOPE=BOTH` 即時生效。 |
#!/bin/bash
# restart_oracle.sh
export ORACLE_SID=ORCL
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
log="/var/log/oracle_restart_$(date +%F_%H%M).log"
exec > >(tee -a "$log") 2>&1
echo "=== $(date) 開始重啟流程 ==="
lsnrctl stop >> "$log"
sqlplus -s / as sysdba <> "$log"
sqlplus -s / as sysdba <
生產環境必備: 變更管理審批、備份驗證、回滾方案、事後複盤記錄。