-
首选方法是
CTRL+C
在 RMAN 界面中按下(或对您的系统使用等效的“注意”组合键)。这也将终止分配的通道,除非它们挂在媒体管理代码中,例如,当它们等待安装磁带时就会发生这种情况。 -
您可以通过运行 SQL
ALTER
SYSTEM KILL SESSION
语句杀死 RMAN 通道对应的服务器会话。 -
您可以终止与操作系统上的 RMAN 通道对应的服务器会话。
使用 ALTER SYSTEM KILL SESSION 终止会话
您可以通过在 RMAN 日志中查找具有以下示例中显示的格式的消息来识别 RMAN 通道的 Oracle 会话 ID:
channel ch1: sid=15 devtype=SBT_TAPE
的sid
和devtype
显示每个分配的信道。请注意,Oraclesid
不同于操作系统进程 ID。您可以使用 SQLALTER
SYSTEM
KILL
SESSION
语句终止会话。
ALTER SYSTEM KILL SESSION
有两个参数,sid
RMAN 消息中打印的 和一个序列号,这两个参数都可以通过查询获得V$SESSION
。例如,运行以下语句,其中sid_in_rman_output
是来自 RMAN 消息的编号:
SELECT SERIAL# FROM V$SESSION WHERE SID=sid_in_rman_output;
然后,运行以下语句,替换sid_in_rman_output
从查询中获得的和序列号:
ALTER SYSTEM KILL SESSION 'sid_in_rman_output,serial#';
请注意,如果会话挂在媒体管理器代码中,这不会取消挂起会话。
终止在媒体管理器中挂起的 RMAN 会话
您有时可能需要终止挂在媒体管理器中的 RMAN 作业。当通道连接在媒体管理器中挂起时终止 RMAN 的最佳方法是终止媒体管理器中的会话。如果此操作不能解决问题,那么在某些平台上,例如 Unix,您可能可以杀死连接的 Oracle 进程。(请注意,终止 Oracle 进程可能会导致媒体管理器出现问题。有关详细信息,请参阅您的媒体管理器文档。)
RMAN 会话的组件
RMAN 会话的性质取决于操作系统。在 UNIX 中,RMAN 会话具有以下关联进程:
-
该RMAN客户端进程本身
-
的缺省信道,到目标数据库的初始连接
-
与每个分配的通道对应的目标数据库的一个目标连接
-
到恢复目录数据库的目录连接(如果使用恢复目录)
-
在或 TSPITR 操作期间到辅助实例的辅助连接
DUPLICATE
-
甲轮询连接到目标数据库,用于在各个分配的信道监控RMAN命令执行。默认情况下,RMAN 建立一个轮询连接。如果您在
ALLOCATE
CHANNEL
orCONFIGURE
CHANNEL
命令中使用不同的连接字符串,RMAN 会建立额外的轮询连接。对于ALLOCATE
CHANNEL
orCONFIGURE
CHANNEL
命令中使用的每个不同的连接字符串,都存在一个轮询连接。
挂起作业期间的进程行为
RMAN 通常挂起,因为其中一个通道连接正在媒体管理器代码中等待磁带资源。目录连接和默认通道似乎挂起,因为它们正在等待 RMAN 告诉它们要做什么。在 RMAN 进程的控制下轮询 RPC 时,轮询连接似乎处于无限循环中。
如果您终止 RMAN 进程本身,那么您也会终止目录连接、辅助连接、默认通道和轮询连接。如果目标和辅助连接没有挂在媒体管理器代码中,它们也会终止。如果目标连接或任何辅助连接在媒体管理层中执行,它们将不会终止,直到在操作系统级别手动终止进程。
并非所有媒体管理器都能检测到 Oracle 进程的终止。那些不能保持资源繁忙或继续处理的。有关详细信息,请参阅您的媒体管理器文档。
终止目录连接不会导致 RMAN 进程终止,因为 RMAN 在备份或还原过程中未执行目录操作。删除默认通道和轮询连接会导致 RMAN 进程检测到通道之一已死亡,然后继续退出。在这种情况下,与挂起通道的连接保持活动状态,如前所述。
终止 RMAN 会话:基本步骤
一旦媒体管理器代码中的挂起通道被终止,RMAN 进程会检测到该终止并继续退出,删除除目标连接之外的所有连接,这些连接在媒体管理层中仍然有效。在这种情况下,有关媒体管理器资源的警告仍然适用。
要终止挂在媒体管理器中的 Oracle 进程:
-
查询
V$SESSION
并V$SESSION_WAIT
如“通过 V$ 视图监视 RMAN”中所述。例如,执行以下查询:COLUMN EVENT FORMAT a10 COLUMN SECONDS_IN_WAIT FORMAT 999 COLUMN STATE FORMAT a20 COLUMN CLIENT_INFO FORMAT a30 SELECT p.SPID, EVENT, SECONDS_IN_WAIT AS SEC_WAIT, sw.STATE, CLIENT_INFO FROM V$SESSION_WAIT sw, V$SESSION s, V$PROCESS p WHERE sw.EVENT LIKE 'sbt%' AND s.SID=sw.SID AND s.PADDR=p.ADDR ;
检查 SQL 输出以确定哪些 sbt 函数正在等待。例如,输出可能如下:
SPID EVENT SEC_WAIT STATE CLIENT_INFO ---- ---------- ---------- -------------------- ------------- 8642 sbtwrite2 600 WAITING rman channel=ORA_SBT_TAPE_1 8374 sbtwrite2 600 WAITING rman channel=ORA_SBT_TAPE_2
-
使用适合您平台的操作系统级工具,终止挂起的会话。例如,在 Solaris 上执行
kill
-9
命令:% kill -9 8642 8374
在 Windows 上,有一个命令行实用程序
ORAKILL
可以让您在这种情况下终止特定线程。从命令提示符运行以下命令:orakill sid thread_id
where
sid
标识要定位的数据库实例,而 thethread_id
是SPID
步骤 1 中查询的值。 -
检查媒体管理器是否也清除其进程。如果有任何剩余,则下一次备份或恢复操作可能会由于先前的挂起而再次挂起。在某些媒体管理器中,唯一的解决方案是关闭并重新启动媒体管理器。如果媒体管理器的文档未提供所需信息,请联系媒体管理器的技术支持。