oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > oracle关闭数据库方法

oracle关闭数据库的4种操作方法区别详析

作者:Leon-Ning Liu

Oracle数据库提供了几种不同的数据库启动和关闭方式,这篇文章主要介绍了oracle关闭数据库的4种操作方法区别的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、引言

在 Oracle 数据库运维中,SHUTDOWN命令的选择直接影响业务中断时长、数据安全性及后续启动效率。本文将系统梳理SHUTDOWN NORMALSHUTDOWN TRANSACTIONALSHUTDOWN IMMEDIATESHUTDOWN ABORT四种模式的核心差异,并结合实际测试验证其行为特性

关闭模式新连接允许新事务允许活跃事务处理方式用户会话处理方式关闭速度下次启动是否需实例恢复核心适用场景
SHUTDOWN NORMAL阻止阻止等待完成(提交 / 回滚)等待用户主动断开最慢计划内长期停机(如深夜维护)
SHUTDOWN TRANSACTIONAL阻止阻止等待完成(提交 / 回滚)事务结束后强制断开较快需保留当前事务的快速维护
SHUTDOWN IMMEDIATE阻止阻止强制回滚未完成事务立即终止所有会话需快速关闭(可接受事务回滚)
SHUTDOWN ABORT阻止阻止强制终止(不回滚)立即终止所有进程最快是(自动恢复)数据库故障紧急关闭

二、各模式深度解析与测试验证

2.1 SHUTDOWN NORMAL(正常关闭):安全优先,无数据风险

核心原理

SHUTDOWN NORMAL是 Oracle 最安全的关闭模式之一,遵循 “不中断用户、不丢失事务” 原则:

  1. 执行命令后立即阻止新用户连接数据库;
  2. 阻止已连接用户发起新事务;
  3. 等待所有已连接用户主动断开会话;
  4. 等待所有活跃事务自然完成(提交或回滚);
  5. 所有会话断开后,释放资源并将数据库置于MOUNT状态。

实际测试验证

测试环境:开启两个会话(会话 1:执行关闭命令;会话 2:模拟普通用户连接)

  1. 会话 1 执行关闭命令
 SHUTDOWN NORMAL;

执行后命令行进入 “阻塞状态”,等待用户断开(如下图):

  1. 会话 2 查询当前活跃用户

通过V$SESSION视图确认当前连接的用户会话:

```sql
SELECT COUNT(*) FROM V$SESSION WHERE USERNAME IS NOT NULL;
```

结果返回`2`,说明会话 1(关闭操作)和会话 2(普通用户)均处于连接状态: 

  1. 定位具体活跃会话

    进一步查询会话详情,确认未断开的会话信息:

  SELECT S.SID, S.SERIAL#, S.USERNAME, S.STATUS, S.PROGRAM 
  FROM V$SESSION S 
  JOIN V$SQL Q ON S.SQL_ID = Q.SQL_ID 
  WHERE S.USERNAME IS NOT NULL;

结果显示会话 2 为普通用户的活跃会话:

  1. 断开会话后验证关闭结果
    退出会话 2 后,会话 1 的SHUTDOWN NORMAL命令自动完成,数据库成功关闭并进入MOUNT状态:

适用场景

2.2 SHUTDOWN TRANSACTIONAL(事务性关闭):平衡安全与效率

核心原理

SHUTDOWN TRANSACTIONAL兼顾 “事务完整性” 与 “关闭效率”,核心逻辑如下:

  1. 阻止新用户连接,同时阻止已连接用户发起新事务;
  2. 不等待用户主动断开会话,但会等待当前正在执行的活跃事务完成;
  3. 所有活跃事务结束后,立即强制断开所有用户会话;
  4. 释放资源并将数据库置于MOUNT状态,无需等待用户手动退出。

实际测试验证

测试环境:开启两个会话(会话 1:执行关闭命令;会话 2:模拟未提交事务)

  1. 会话 2 发起未提交事务
    执行INSERT操作但不提交,模拟活跃事务:

  2. 会话 1 执行关闭命令

    SHUTDOWN TRANSACTIONAL;
    

    命令行进入阻塞状态,等待会话 2 的事务完成:

  3. 确认未提交事务
    通过V$TRANSACTIONV$SESSION关联查询,定位未提交事务:

    SELECT 
        T.ADDR AS 事务地址,
        S.SID AS 会话ID,
        S.SERIAL# AS 序列号,
        S.USERNAME AS 用户名,
        T.START_TIME AS 事务开始时间,
        T.STATUS AS 事务状态
    FROM V$TRANSACTION T
    JOIN V$SESSION S ON T.SES_ADDR = S.SADDR
    ORDER BY T.START_TIME

结果显示会话 2 存在未提交的活跃事务:

  1. 提交事务后验证关闭结果
    会话 2 执行COMMIT提交事务(不退出会话),会话 1 的SHUTDOWN TRANSACTIONAL命令立即完成,数据库强制断开会话 2 并关闭:

适用场景

2.3 SHUTDOWN IMMEDIATE(立即关闭):效率优先,安全兜底

核心原理

SHUTDOWN IMMEDIATE以 “快速关闭” 为目标,同时通过自动回滚保障数据一致性:

  1. 阻止新用户连接与新事务发起;
  2. 强制回滚所有未完成的活跃事务(避免数据不一致);
  3. 回滚完成后,立即终止所有用户会话;
  4. 释放资源并将数据库置于MOUNT状态,下次启动无需实例恢复。

关键特性

适用场景

2.4 SHUTDOWN ABORT(终止关闭):紧急故障下的最后手段

核心原理

SHUTDOWN ABORT是 “强制中断” 模式,完全不考虑事务完整性与会话状态:

  1. 立即阻止新连接与新事务;
  2. 强制终止所有活跃事务(不回滚,事务状态保留在重做日志中);
  3. 直接终止所有数据库进程(类似 “断电”),跳过资源清理步骤;
  4. 数据库直接从OPEN状态变为SHUTDOWN状态,不经过MOUNT阶段。

关键风险与特性

适用场景

三、关闭模式选择决策树

在实际运维中,可按以下逻辑选择关闭模式:

  1. 是否允许等待用户操作?

    • 是 → 选择SHUTDOWN NORMAL(长期维护);
    • 否 → 进入下一步。
  2. 是否需要保留当前活跃事务?

    • 是 → 选择SHUTDOWN TRANSACTIONAL(临时维护);
    • 否 → 进入下一步。
  3. 是否能接受事务回滚耗时?

    • 是 → 选择SHUTDOWN IMMEDIATE(快速安全关闭);
    • 否(紧急故障) → 选择SHUTDOWN ABORT(最后手段)。

四、总结

Oracle 四种SHUTDOWN模式的设计,本质是 “数据安全性” 与 “关闭效率” 的权衡:

到此这篇关于oracle关闭数据库的4种操作方法区别的文章就介绍到这了,更多相关oracle关闭数据库方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文