標準重啟 SOP (適用計畫性維護)
- 停止應用層:通知業務、關閉中介軟體、連線池、排程作業
- 停止監聽器:
lsnrctl stop
防止新連線湧入
- 備份控制檔追蹤 (Sysdba):
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
產生 USER_DUMP_DEST 下 *_ora_*.trc 含 CREATE CONTROLFILE 腳本
- 手動切換 Redo Log:
ALTER SYSTEM SWITCH LOGFILE;
確保當前 Redo 寫入磁碟、檢查點推進
- 產生 Kill Session 腳本:
SET HEAD OFF FEEDBACK OFF NEWPAGE NONE
SPOOL /tmp/kill_sessions.sql
SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
FROM v$session WHERE username IS NOT NULL;
SPOOL OFF
- 執行 Kill Session:
@/tmp/kill_sessions.sql
IMMEDIATE 讓交易回滾、釋放鎖
- IMMEDIATE 關閉資料庫:
SHUTDOWN IMMEDIATE;
等待完成、不接受新連線、回滾未提交交易、檢查點、關閉檔案
- 啟動監聽器:
lsnrctl start
- 啟動資料庫:
SQLPLUS /NOLOG
CONN / AS SYSDBA
STARTUP;
或 SRVCTL START DATABASE -d dbname (RAC/Grid)
- 啟動應用層並驗證:
- 檢查 Alert Log 無錯誤
SELECT status FROM v$instance; → OPEN
- 核心業務 SQL 測試
- 監聽器狀態
lsnrctl status
關機模式對比
| 模式 | 等待現有連線 | 回滾未提交 | 檢查點 | 適用場景 |
| NORMAL | 是 (無限) | 否 | 是 | 極少用 |
| TRANSACTIONAL | 是 (交易完成) | 否 | 是 | 溫和關機 |
| IMMEDIATE | 否 (立即斷開) | 是 | 是 | 標準維護 |
| ABORT | 否 (強制) | 否 (啟動時恢復) | 否 | 緊急/掛死 |
RAC 環境滾動重啟
# 節點 1
srvctl stop instance -d dbname -i inst1 -o immediate
srvctl start instance -d dbname -i inst1
# 驗證節點 1 正常後,依序處理節點 2, 3...
# 全叢集重啟
srvctl stop database -d dbname -o immediate
srvctl start database -d dbname
Data Guard 環境注意事項
- Primary 關機前確認 Standby 應用完所有 Redo:
SELECT * FROM v$archive_gap; 無列
- Standby 先關機、Primary 後關機;啟動順序相反
- 使用
DGMGRL 管理切換/容錯移轉
重啟後驗證清單
| 檢查項目 | 命令/方法 | 預期結果 |
| 執行個體狀態 | SELECT status FROM v$instance; | OPEN |
| Alert Log 錯誤 | tail -f alert_.log | 無 ORA- 錯誤 |
| 資料檔線上 | SELECT file#, status FROM v$datafile; | 全部 ONLINE |
| Redo Log 正常 | SELECT group#, status FROM v$log; | CURRENT/ACTIVE/INACTIVE |
| 表空間狀態 | SELECT tablespace_name, status FROM dba_tablespaces; | ONLINE |
| 無效物件 | SELECT count(*) FROM dba_objects WHERE status='INVALID'; | 0 (或已知可接受) |
| 監聽器服務 | lsnrctl status | 所有服務 READY |
| 應用連線測試 | 應用健康檢查端點 | 成功 |
自動化腳本範例 (Shell)
#!/bin/bash
# graceful_restart.sh
ORACLE_SID=ORCL
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
echo "1. Stopping listener..."
lsnrctl stop
echo "2. Backup controlfile..."
sqlplus -s / as sysdba <