首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Windows 下 Oracle 服務啟動關閉批次腳本自動化管理

     編輯:Oracle 資料庫相關知識

Oracle 資料庫服務佔用大量系統資源,開機自動啟動會拖慢開機速度。本文提供三種管理方式,重點給出**批次檔一鍵啟動/關閉**方案,並說明如何將服務設為「手動」模式實現開機不自啟、用時再啟。

三種管理方式對比

方式優點缺點推薦場景
工作管理員強制結束進程即時生效極度危險:導致資料庫不一致、需執行個體恢復、可能損壞資料檔**絕不推薦** (除非資料庫已掛起無法正常關閉)
服務管理器手動操作圖形化、安全、可查看狀態每次需多步點擊、無法自動化、不適合腳本整合臨時測試、單次操作
批次腳本自動化一鍵執行、可排程、可整合 CI/CD、支援參數化需管理員權限執行日常開發/測試/生產維護首選

核心服務識別 (以 Oracle 11g/12c/19c 典型安裝為例)

打開 services.msc,篩選以 Oracle 開頭的服務,核心三項通常為:

  • OracleService — **資料庫核心執行個體服務** (如 OracleServiceORCL)
  • OracleTNSListener — **監聽器服務** (如 OracleOraDB19Home1TNSListener)
  • OracleiSQL*Plus / OracleDBConsole — 管理工具服務 (可選,視安裝組件)

關鍵: 服務名稱含 SID 與 Oracle Home 名稱,**請在本機 services.msc 確認確切名稱**,下方腳本中替換為實際值。

批次腳本實作

1. 設定服務為「手動」啟動 (一次性操作,永久生效)

REM 以管理員身分執行 CMD
sc config "OracleServiceORCL" start= demand
sc config "OracleOraDB19Home1TNSListener" start= demand
sc config "OracleDBConsoleORCL" start= demand
REM start= demand 即「手動」;start= auto 為「自動」

2. 啟動腳本 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

3. 關閉腳本 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/Unix 對應方案

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 批次檔一致。

最佳實務清單

  • ✅ 所有腳本 **以管理員/root 權限執行**。
  • ✅ 關閉順序:**管理工具 → 監聽器 → 核心執行個體**;啟動順序相反。
  • ✅ 生產環境關閉前,**確認無活躍業務會話** (查詢 V$SESSION),建議 SHUTDOWN IMMEDIATE 而非 ABORT。
  • ✅ 將腳本納入版本控制,部署文檔化。
  • ✅ 定期演練腳本啟停,驗證服務名稱變更後的可用性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved