在进行升级或修补之前关闭数据库可以通过多种方式完成。
shutdown immediate;
或者
shutdown abort;
startup restrict;
shutdown immediate;
或者
shutdown abort;
startup restrict;
shutdown;
或者
alter system checkpoint;
shutdown abort;
startup restrict;
shutdown immediate;
当然还有其他选择。哪个应该是首选,为什么?
关闭以进行维护(或冷备份)的目的是使数据库保持一致状态,无需在启动时进行回滚/恢复。
理论上有 3 个 SQL*Plus
shutdown
命令可以实现这一点,所有这些命令都会立即阻止新会话连接到实例:shutdown normal
或者只是shutdown
:等待所有会话断开连接。这种模式在实践中很少使用,因为它依赖于行为良好的客户端不会打开连接。这曾经是唯一shutdown
不取消正在运行的事务的模式。shutdown transactional
:一旦当前正在运行的事务完成就断开会话,防止新事务开始。shutdown immediate
:立即断开所有会话并在关闭之前回滚中断的事务。请注意,断开连接是立即的,但可能不会关闭,因为任何中断的事务都可能需要时间来回滚。第四种模式
shutdown
是shutdown abort
。这就像拔掉电源线 - 实例现在停止而没有任何清理。您通常希望之后再次启动数据库并在之后立即干净地关闭,如您的示例所示。概念指南说:您给出的所有示例都将检查点作为
shutdown [normal]
或shutdown immediate
显式检查点的一部分执行,大概是为了减少恢复所需的时间。一般建议:
shutdown normal
.shutdown transactional
有人参与的关闭,当您想要最小化取消的事务时(仅参与是因为如果违反超时,这种关闭不能保证完全关闭数据库)。shutdown immediate
无人值守关闭或当您不关心当前正在运行的事务时。shutdown abort
(加上启动/关闭) - 这在今天的早期版本的 Oracle 中更为常见。在其他情况下(不是补丁/升级),如果您需要最大限度地减少停机时间,则此模式可能是合适的。我更喜欢关闭中止方法,因为它是关闭数据库的最快方法。有些操作在关机中止后无法完成,例如
在这两种情况下,数据库都已损坏,必须从完整备份中恢复。
从 9i 开始,可以使用dbnewid实用程序来重命名数据库或更改 dbid。据我所知,该实用程序检查数据库是否正确关闭。重命名数据文件、临时文件和日志文件可以通过执行适当的 sql 语句来完成,当然无需重新创建控制文件。