Oracle数据库何以关闭不成(oracle 关不掉)

Oracle数据库:何以关闭不成?

在使用Oracle数据库时,我们有时会遇到数据库无法正常关闭的情况。即使使用”shutdown immediate”命令,但数据库仍然在运行。这时候我们该怎么办呢?

一、查看当前会话

我们需要确定是否有会话在运行,如果有会话在执行,则数据库是无法关闭的。我们需要查看当前会话,并终止它们。

通过下面的命令可以查看当前正在运行的会话:

select sid, serial#, status, username from v$session where status = 'ACTIVE';

该命令将返回正在运行的会话的相关信息,包括会话ID,序列号,状态和用户名。我们可以逐个终止这些会话:

alter system kill session ', ';

其中是会话ID,是序列号。执行该命令后,会话将被立即终止。

二、查看锁定情况

除了会话以外,锁定也可能导致Oracle数据库无法正常关闭。如果有锁定存在,我们需要查看它们的详细信息。

通过下面的命令可以查看当前的锁定:

select * from v$lock;

该命令将返回当前的锁定信息,包括锁定类型,对象ID,锁定模式和锁定持有者等。我们需要根据锁定类型和锁定持有者来判断如何处理锁定。

如果是行锁定,则我们可以通过下面的命令解锁:

alter table  enable row movement;
update
set = null where = '';
alter table
disable row movement;

其中

是表名,是加锁列,是被锁定的值。

如果是表级锁定,则我们可以通过下面的命令解锁:

alter table 
enable/disable all triggers;

该命令将禁用所有触发器,并且可以使表级锁定解除。

三、查看等待事件

如果以上两种情况都排除了,并且回滚段空间还足够,那么我们还需要查看当前的等待事件。等待事件可能导致我们无法关闭数据库。

通过下面的命令可以查看当前的等待事件:

select event, time_wted_seconds, total_wts from v$system_event where time_wted_seconds > 0;

该命令将返回当前的等待事件及其等待时间和等待次数等。我们需要根据等待事件来决定如何处理。

如果是缓冲区等待,则我们可以通过下面的命令清理缓冲区:

alter system flush buffer_cache;

如果是redo日志等待,则我们可以通过下面的命令强制写入redo日志:

alter system checkpoint;

如果是数据文件IO等待,则我们可以通过下面的命令关闭归档日志:

alter system set log_archive_dest_state_2=defer;

经过以上步骤,我们应该可以顺利关闭Oracle数据库了。如果仍然无法正常关闭,则可能需要进行进一步的故障排查。


数据运维技术 » Oracle数据库何以关闭不成(oracle 关不掉)