暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Administrator's Guide(Oracle 19c):3.3 Shutting Down a Database

原创 Ryan Bai 2025-04-09
25

您可以使用 SQL*Plus 或 Oracle Restart 关闭数据库。

关于关闭数据库

当不使用 Oracle Restart 时,您可以通过连接 SYSOPERSYSDBASYSBACKUPSYSDG 并发出 SHUTDOWN 命令来使用 SQL*Plus 关闭数据库实例。如果您的数据库是由 Oracle Restart 管理的,建议使用 srvctl stop database 命令关闭数据库。

在数据库关闭完成之前,不会将控制返回给启动数据库关闭的会话。在关机过程中尝试连接的用户会收到如下消息:

ORA-01090: shutdown in progress - connection is not permitted
复制

关闭数据库有几种模式:normal、immediate、transactional 和 abort。某些关闭模式在实际关闭数据库之前等待某些事件发生(例如事务完成或用户断开连接)。这些事件有一个一小时的超时时间。

以正常模式关闭

使用正常模式关闭数据库时,数据库将等待所有已连接的用户断开连接,然后再关闭。正常模式是默认的关机模式。

要在正常情况下关闭数据库,使用以下命令之一:

SQL*Plus SRVCTL(当使用 Oracle Restart)
SHUTDOWN [NORMAL] srvctl stop database -db db_unique_name -stopoption normal

SQL*Plus SHUTDOWN命令的 NORMAL 子句是可选的,因为这是默认的关闭方法。对于 SRVCTL,如果省略 -stopoption 选项,则根据 Oracle Restart 配置中存储的数据库停止选项进行关闭操作。默认的停止选项是 immediate

正常的数据库关闭会在以下条件下进行:

  • 声明发出后,不允许新的连接。
  • 在关闭数据库之前,数据库将等待所有当前连接的用户断开与数据库的连接。

数据库的下一次启动将不需要任何实例恢复过程。

以 Immediate 模式关闭

当您使用 immediate 模式关闭数据库时,Oracle 数据库将终止所有正在执行的 SQL 语句并断开用户连接。活动事务被终止,未提交的更改被回滚。

仅在以下情况下使用立即关闭数据库:

  • 启动无人值守的自动备份
  • 当停电即将发生时
  • 当数据库或其中一个应用程序运行不正常,您无法联系用户要求他们注销或他们无法注销时

立即关闭数据库,使用以下命令之一:

SQL*Plus SRVCTL(当使用 Oracle Restart)
SHUTDOWN IMMEDIATE srvctl stop database -db db_unique_name -stopoption immediate

在下列条件下,立即关闭数据库:

  • 在发出语句之后,不允许新的连接,也不允许启动新的事务。
  • 任何未提交的事务都被回滚。(如果存在长时间未提交的事务,这种关闭方法可能不会很快完成,尽管这么称呼这个操作。)
  • Oracle 数据库不等待当前连接数据库的用户断开连接。数据库隐式回滚活动事务并断开所有连接用户的连接。

数据库的下一次启动将不需要任何实例恢复过程。

使用 Transactional 模式关机

当您以事务模式关闭数据库时,数据库虽然会阻止用户启动新事务,但也会等待所有当前事务完成后再关闭。根据当前事务的性质,此模式可能会花费大量时间。

当您想在允许活动事务先完成的情况下执行计划关闭实例时,请使用以下命令之一:

SQL*Plus SRVCTL(当使用 Oracle Restart)
SHUTDOWN TRANSACTIONAL srvctl stop database -db db_unique_name -stopoption transactional

事务性数据库关闭在以下条件下进行:

  • 在发出语句之后,不允许新的连接,也不允许启动新的事务。
  • 在所有事务完成后,仍然连接到实例的任何客户端都将断开连接。
  • 此时,实例将关闭,就像提交 SHUTDOWN IMMEDIATE 语句时一样。

数据库的下一次启动将不需要任何实例恢复过程。

事务性关闭可以防止客户端丢失工作,同时不需要所有用户都注销。

使用 Abort 模式关机

可以通过中止数据库实例来立即关闭数据库。

如果可能,只在以下情况下执行这种类型的关闭:

  • 数据库或其中一个应用程序运行不正常,其他类型的关闭都不起作用。
  • 您必须立即关闭数据库(例如,如果您知道电源关闭将在一分钟内发生)。
  • 在启动数据库实例时遇到问题。

当必须通过中止事务和用户连接来关闭数据库时,请使用以下命令之一:

SQL*Plus SRVCTL(当使用 Oracle Restart)
SHUTDOWN ABORT srvctl stop database -db db_unique_name -stopoption abort

中止的数据库关闭将在以下条件下进行:

  • 在发出语句之后,不允许新的连接,也不允许启动新的事务。
  • Oracle数据库正在处理的客户端 SQL 语句将立即终止。
  • 未提交的事务不会回滚。
  • Oracle 数据库不等待当前连接数据库的用户断开连接。数据库隐式断开所有已连接用户的连接。

数据库的下一次启动将需要自动实例恢复过程。

关机超时

等待用户断开连接或等待事务完成的关闭模式对等待的时间有限制。

如果在一小时内没有发生所有阻止关机的事件,则关机操作将终止,并显示以下消息: ORA-01013: user requested cancel of current operation。如果您中断关机过程,例如按 CTRL-C,也会显示此消息。Oracle 建议不要尝试中断实例关闭。相反,应该允许关闭过程完成,然后重新启动实例。

ORA-01013 发生之后,必须考虑实例处于不可预测的状态。因此,必须通过重新提交 shutdown 命令来继续关闭过程。如果后续的 SHUTDOWN 命令继续失败,则必须提交 SHUTDOWN ABORT 命令来关闭实例。然后重新启动实例。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论