Oracle 資料庫服務佔用大量系統資源,開機自動啟動會拖慢開機速度。本文提供三種管理方式,重點給出**批次檔一鍵啟動/關閉**方案,並說明如何將服務設為「手動」模式實現開機不自啟、用時再啟。
| 方式 | 優點 | 缺點 | 推薦場景 |
|---|---|---|---|
| 工作管理員強制結束進程 | 即時生效 | 極度危險:導致資料庫不一致、需執行個體恢復、可能損壞資料檔 | **絕不推薦** (除非資料庫已掛起無法正常關閉) |
| 服務管理器手動操作 | 圖形化、安全、可查看狀態 | 每次需多步點擊、無法自動化、不適合腳本整合 | 臨時測試、單次操作 |
| 批次腳本自動化 | 一鍵執行、可排程、可整合 CI/CD、支援參數化 | 需管理員權限執行 | 日常開發/測試/生產維護首選 |
打開 services.msc,篩選以 Oracle 開頭的服務,核心三項通常為:
OracleService — **資料庫核心執行個體服務** (如 OracleServiceORCL)OracleTNSListener — **監聽器服務** (如 OracleOraDB19Home1TNSListener)OracleiSQL*Plus / OracleDBConsole — 管理工具服務 (可選,視安裝組件)關鍵: 服務名稱含 SID 與 Oracle Home 名稱,**請在本機 services.msc 確認確切名稱**,下方腳本中替換為實際值。
REM 以管理員身分執行 CMD
sc config "OracleServiceORCL" start= demand
sc config "OracleOraDB19Home1TNSListener" start= demand
sc config "OracleDBConsoleORCL" start= demand
REM start= demand 即「手動」;start= auto 為「自動」
db_start.bat@echo off
echo ==========================================
echo 正在啟動 Oracle 資料庫服務...
echo ==========================================
net start "OracleServiceORCL"
IF %ERRORLEVEL% NEQ 0 (
echo [錯誤] 資料庫執行個體服務啟動失敗,請檢查事件檢視器。
pause
exit /b 1
)
net start "OracleOraDB19Home1TNSListener"
IF %ERRORLEVEL% NEQ 0 (
echo [警告] 監聽器啟動失敗,遠端連線將不可用。
)
net start "OracleDBConsoleORCL"
IF %ERRORLEVEL% NEQ 0 (
echo [資訊] Enterprise Manager 服務啟動失敗 (若未安裝則忽略)。
)
echo.
echo 所有核心服務啟動完成!
echo ==========================================
pause
db_stop.bat@echo off
echo ==========================================
echo 正在關閉 Oracle 資料庫服務...
echo ==========================================
REM 先關閉管理工具與監聽器,最後關閉核心執行個體
net stop "OracleDBConsoleORCL"
net stop "OracleOraDB19Home1TNSListener"
net stop "OracleServiceORCL"
IF %ERRORLEVEL% NEQ 0 (
echo [警告] 部分服務關閉失敗,可能有活躍會話阻塞。
echo 請嘗試在 SQL*Plus 執行: SHUTDOWN IMMEDIATE
) ELSE (
echo 所有服務已安全關閉。
)
echo ==========================================
pause
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
REM === 參數區 ===
SET SID=ORCL
SET HOME=OraDB19Home1
SET LOG_FILE=D:\Oracle\scripts\db_control.log
REM === 服務名組裝 ===
SET SRV_DB=OracleService%SID%
SET SRV_LSNR=Oracle%HOME%TNSListener
SET SRV_EM=OracleDBConsole%SID%
REM === 函數:記錄日誌 ===
:LOG
echo [%DATE% %TIME%] %~1 >> "%LOG_FILE%"
GOTO:EOF
REM === 主流程 ===
IF "%1"=="start" (
CALL :LOG "=== START REQUEST ==="
FOR %%S IN (%SRV_DB% %SRV_LSNR% %SRV_EM%) DO (
sc query "%%S" | FIND "RUNNING" >NUL
IF %ERRORLEVEL% EQU 0 (
CALL :LOG "Service %%S already running."
) ELSE (
net start "%%S"
IF !ERRORLEVEL! EQU 0 (
CALL :LOG "Service %%S started successfully."
) ELSE (
CALL :LOG "ERROR: Service %%S failed to start."
)
)
)
CALL :LOG "=== START COMPLETE ==="
) ELSE IF "%1"=="stop" (
CALL :LOG "=== STOP REQUEST ==="
FOR %%S IN (%SRV_EM% %SRV_LSNR% %SRV_DB%) DO (
sc query "%%S" | FIND "RUNNING" >NUL
IF %ERRORLEVEL% EQU 0 (
net stop "%%S"
IF !ERRORLEVEL! EQU 0 (
CALL :LOG "Service %%S stopped successfully."
) ELSE (
CALL :LOG "ERROR: Service %%S failed to stop."
)
) ELSE (
CALL :LOG "Service %%S already stopped."
)
)
CALL :LOG "=== STOP COMPLETE ==="
) ELSE (
echo Usage: %0 [start^|stop]
echo Example: %0 start
)
ENDLOCAL
用法: db_control.bat start / db_control.bat stop。支援狀態檢查避免重複操作、詳細日誌記錄、參數化 SID/Home 便於多環境復用。
Linux 下使用 systemctl 或 dbstart/dbshut 腳本 (配合 /etc/oratab):
# systemd 方式 (Oracle 18c+ 支援)
systemctl start oracle-db@ORCL
systemctl stop oracle-db@ORCL
# 傳統 dbstart/dbshut (需配置 oratab 最後一欄為 Y)
su - oracle -c "dbstart $ORACLE_HOME"
su - oracle -c "dbshut $ORACLE_HOME"
Shell 腳本同樣可實現狀態檢查、日誌、並行啟動等進階功能,原理與 Windows 批次檔一致。
V$SESSION),建議 SHUTDOWN IMMEDIATE 而非 ABORT。