《Oracle服务进程精准管控指南:23c/11g双版本内存优化实战》 ——附自动化脚本开发全攻略

正在学习或者是使用 Oracle 数据库的小伙伴,是不是对于那个一直启动且及其占用内存的后台进程感到烦躁呢?而且即使是手动去开关也显得即为麻烦,所以基于我之前所学习到的方法,我在此重新整理,让大家动动手指就能完成开关。

先看看这里嗷 ヾ(≧▽≦*)o , 本文技术验证环境:

操作系统:Windows 11

数据库版本:Oracle 23c

一、Oracle 服务进程精准定位与识别

1. 双通道定位技法

1.1 命令行直达:services.msc 快速调用指南

通过 Windows 原生指令实现服务矩阵精准定位

  1. 按下 Win + R 组合键打开运行框
  1. 输入命令:services.msc,并按回车键
  1. 打开的系统服务管理器如下图所示:

1.2 图形化捷径:Win+X 高效访问路径

可视化操作三步骤直达服务管理中心

  1. 按下 Win + X 组合键打开快捷选项
  1. 点击打开计算机管理
  1. 点击打开服务和应用程序下的服务
  1. 打开的系统服务管理器如下图所示:

2. 多版本服务组件图谱解析

2.1 版本差异对比(23c vs 11g)

不同版本服务组件的功能映射关系

通过服务命名规则与功能映射实现跨版本识别

注:带■标记的为必启核心服务

Oracle 23c 服务架构
plaintext 复制代码
■ OracleServiceFREE        
   ▸ 功能:数据库实例管理引擎  
   ▸ 作用:内存分配/进程调度/日志维护  

■ OracleOraDB23Home1TNSListener  
   ▸ 功能:分布式通信监听器  
   ▸ 协议:TCP/IP+SSL双栈支持  

○ OracleJobSchedulerFREE  
   ▸ 功能:自动化任务调度平台  
   ▸ 触发:DBMS_SCHEDULER内置包  

○ OracleVssWriterFREE  
   ▸ 功能:卷影拷贝服务集成  
   ▸ 场景:在线热备份支持
Oracle 11g 服务架构
plaintext 复制代码
■ OracleServiceORCL  
   ▸ 功能:实例生命周期管理  
   ▸ 特性:SGA/PGA自动优化  

■ OracleOraDb11g_home2TNSListener  
   ▸ 功能:传统监听服务  
   ▸ 限制:仅支持TCP/IP协议  

○ OracleDBConsoleorcl  
   ▸ 功能:Web控制台服务  
   ▸ 访问:http://localhost:1158/em  

○ OracleJobSchedulerORCL  
   ▸ 功能:基础任务调度器  
   ▸ 依赖:Oracle Scheduler架构  

○ Oracle ORCLVSSWriterService  
   ▸ 功能:卷影拷贝兼容层  
   ▸ 注意:需Windows VSS服务协同  

● OracleOraDb11g_home2ClrAgent  
   ▸ 功能:CLR集成运行时  
   ▸ 版本:.NET Framework 3.5+  

● OracleRemExecService  
   ▸ 特性:瞬时安装辅助服务  
   ▸ 状态:安装完成后自动禁用

二、Oracle 核心服务启停管理实战

1. 关键服务组件深度解码

  • OracleServiceXX:数据库实例的"心脏引擎"
  • TNSListener:网络通信的"智能网关"

如同我们展示的两个版本的 Oracle 进程,主要功能都是相同的。

对于初学者来说,如果没有特殊需求,其实只需要启动 2 个进程OracleServiceXXOracleOraDBXXHome1TNSListener),其他进程关闭即可,否则会占用大量内存空间。

为什么只需要这两个进程就够了呢?

  • OracleServiceXX(必须启动)

    该服务是数据库实例的核心管理者,负责启动/停止数据库、分配系统资源(如内存、进程)以及维护数据文件和日志文件的完整性。

    • 必要性 :若未启动此服务,数据库将无法运行,且会触发 ORA-12560: TNS: 协议适配器错误

    • 资源占用:作为基础服务,其内存和CPU占用相对可控,且是其他功能的前提条件。

  • OracleOraDBXXHome1TNSListener(按需启动)

    该服务是网络监听器,负责接收客户端连接请求(包括本地和远程)。

    • 必要性
      • 本地连接 :即使未启动此服务,仍可通过 SQL*Plus 等工具直接连接本地数据库(需配置 LISTENER.ORA 或使用 EZCONNECT 语法)。
      • 远程连接 :若需通过 PL/SQL Developer 或其他第三方工具远程访问数据库,则必须启动此服务,否则会触发 ORA-12541: TNS: 无监听器
    • 资源占用:仅在有连接需求时才会消耗资源,关闭后对本地操作无影响。

是 否 远程访问 仅本地操作 是否需要数据库基础功能 启动OracleServiceXX 关闭所有服务 需要网络通信 启动TNSListener 保持监听器关闭


2. 服务配置优化三部曲

通过系统服务属性实现永久性配置
修改步骤:

  1. 鼠标右键进程
  2. 在打开的窗口中点击属性
  3. 修改启动类型

注:将必要的两个进程(核心进程和监听进程)修改为手动,其他均为禁用。

  • 手动:电脑启动后将不会再自启动从而占用内存,但需要在使用前手动打开

启动和关闭步骤:

  1. 鼠标右键进程
  2. 启动时点击启动 ;关闭时点击停止

三、自动化运维脚本开发

如果经常操作数据库,上面的手动启动和关闭依然很是麻烦,所以我们可以编写脚本简化操作,只需要双击即可。

1. 23c 版自动化脚本工程

实现一键式服务管理的完整方案

1.1 服务启动脚本

带权限提升的自动化执行方案

bat 复制代码
:: 取得管理员权限
:Main
@echo off
cd /d "%~dp0"
:: 原始检测方法
:: cacls.exe "%SystemDrive%\System Volume Information" >nul 2>nul
:: 无弹窗方法
fltmc >nul 2>nul || goto Admin
if %errorlevel%==0 goto Admin
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
echo Set RequestUAC = CreateObject^("Shell.Application"^)>"%temp%\getadmin.vbs"
echo RequestUAC.ShellExecute "%~s0","","","runas",1 >>"%temp%\getadmin.vbs"
echo WScript.Quit >>"%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" /f
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
exit
:Admin

:: 手动启动 oracle 服务,因安装环境不同,需将下列服务名称替换成自己的
net start "OracleServiceFREE"
net start "OracleOraDB23Home1TNSListener"

:: 添加账号密码提示(使用醒目格式)
echo.
echo **************************************
echo user/password:  scott/tiger
echo **************************************
echo.

:: 如果需要使用控制台服务,将下面这行前面的 :: 删掉,并将服务名称替换成自己的
:: net start "OracleDBConsoleorcl"
pause

演示过程


1.2 服务终止脚本

安全关闭服务的标准化流程

bat 复制代码
:: 取得管理员权限
:Main
@echo off
cd /d "%~dp0"
:: 原始检测方法
:: cacls.exe "%SystemDrive%\System Volume Information" >nul 2>nul
:: 无弹窗方法
fltmc >nul 2>nul || goto Admin
if %errorlevel%==0 goto Admin
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
echo Set RequestUAC = CreateObject^("Shell.Application"^)>"%temp%\getadmin.vbs"
echo RequestUAC.ShellExecute "%~s0","","","runas",1 >>"%temp%\getadmin.vbs"
echo WScript.Quit >>"%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" /f
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
exit
:Admin

:: 手动关闭服务,需将下列服务名称替换成自己的
net stop "OracleServiceFREE"
net stop "OracleOraDB23Home1TNSListener"

:: 操作完成提示(使用醒目格式)
echo.
echo **************************************
echo   The service has been successfully shut down!
echo **************************************
echo.

:: 如果需要关闭控制台服务,将下面这行前面的 :: 删掉,并替换服务名称
:: net stop "OracleDBConsoleorcl"
pause

演示过程


2. 11g 版兼容性改造方案

向下兼容的脚本改造指南

2.1 服务启动脚本

bat 复制代码
:: 取得管理员权限
:Main
@echo off
cd /d "%~dp0"
:: 原始检测方法
:: cacls.exe "%SystemDrive%\System Volume Information" >nul 2>nul
:: 无弹窗方法
fltmc >nul 2>nul || goto Admin
if %errorlevel%==0 goto Admin
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
echo Set RequestUAC = CreateObject^("Shell.Application"^)>"%temp%\getadmin.vbs"
echo RequestUAC.ShellExecute "%~s0","","","runas",1 >>"%temp%\getadmin.vbs"
echo WScript.Quit >>"%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" /f
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
exit
:Admin

:: 手动启动 oracle 服务,因安装环境不同,需将下列服务名称替换成自己的
net start "OracleServiceORCL"
net start "OracleOraDb11g_home2TNSListener"

:: 添加账号密码提示(使用醒目格式)
echo.
echo **************************************
echo user/password:  scott/tiger
echo **************************************
echo.

:: 如果需要使用控制台服务,将下面这行前面的 :: 删掉,并将服务名称替换成自己的
:: net start "OracleDBConsoleorcl"
pause

2.2 服务终止脚本

bat 复制代码
:: 取得管理员权限
:Main
@echo off
cd /d "%~dp0"
:: 原始检测方法
:: cacls.exe "%SystemDrive%\System Volume Information" >nul 2>nul
:: 无弹窗方法
fltmc >nul 2>nul || goto Admin
if %errorlevel%==0 goto Admin
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
echo Set RequestUAC = CreateObject^("Shell.Application"^)>"%temp%\getadmin.vbs"
echo RequestUAC.ShellExecute "%~s0","","","runas",1 >>"%temp%\getadmin.vbs"
echo WScript.Quit >>"%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" /f
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
exit
:Admin

:: 手动关闭服务,需将下列服务名称替换成自己的
net stop "OracleServiceORCL"
net stop "OracleOraDb11g_home2TNSListener"

:: 操作完成提示(使用醒目格式)
echo.
echo **************************************
echo   The service has been successfully shut down!
echo **************************************
echo.

:: 如果需要关闭控制台服务,将下面这行前面的 :: 删掉,并替换服务名称
:: net stop "OracleDBConsoleorcl"
pause

3. 通用脚本开发原则

如果你仔细观察代码,就会发现,这个脚本区别只在于你的 Oracle 版本:

至于这两个怎么查找?其实就是之前所说的必要启动进程:

将这个了进程名称复制粘贴过去即可


本文在创作过程中采用智能化技术辅助工具:

由于本人电脑装的是 Oracle 23 ,在这里感谢某位同学的辛苦付出,为我截了一张 Oracle 11g 的进程截图。ヾ(≧▽≦*)o


📣 我是鸿·蒙,若有不解之处或发现疏漏,欢迎随时私信交流!

(虽然不一定秒回,但每条消息都会认真看嗷~ (๑•̀ㅂ•́)و✧)