您可以使用 SQL*Plus 或 Oracle Restart 关闭数据库。
关于关闭数据库
当不使用 Oracle Restart 时,您可以通过连接 SYSOPER
、SYSDBA
、SYSBACKUP
或 SYSDG
并发出 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 命令来关闭实例。然后重新启动实例。