下表提供了定位可用来诊断RMAN备份问题的日志输出位置的概要。
输出类型 | 产生源 | 位置 | 描述 |
---|---|---|---|
RMAN日志 | RMAN | 完整的作业信息在V$RMAN_STATUS和RC_RMAN_STATUS。当前作业信息在V$RMAN_OUTPUT。当从命令行运行RMAN,你可以定向输出到以下地方:1)标准输出。2)命令行中的LOG或SPOOL LOG命令指定的日志文件。3)通过重定向RMAN输出创建的文件(例如,在UNIX中,使用“>”操作符) 包含与RMAN作业相关的行为和RMAN,数据库服务器和介质供应商产生的错误信息。RMAN错误日志有一个RMAN-前缀。正常行为描述没有前缀。 | 你可以执行以下PL/SQL从V$RMAN_STATUS中移除所有条目:update node set high_rsr_recid=0 where db_key = our_target_database_db_key ; 语句移除所有作业相关的条目。没有行可见直到新的备份作业显示在V$RMAN_BACKUP_JOB_DETAILS。 |
alert_SID.log | Oracle数据库 | 自动诊断库(ADR)家目录的alert子目录 | 包含错误,初始化参数设置和管理操作按时间顺序排列的日志。记录被覆盖的控制文件记录的值。 |
Oracle跟踪文件 | Oracle数据库 | ADR目录的trace子目录 | 包含Oracle数据库进程产生的详细输出。当ORA-600或ORA-3113错误信息发生时创建这个文件,无论何时RMAN不能分配通道和当数据库载入介质管理库失败时。 |
sbtio.log | 第三方介质管理软件 | ADR目录的trace子目录 | 包含介质管理软件写入的供应商相关的信息。日志不包含数据库或RMAN错误。 |
介质管理日志文件 | 第三方介质管理软件 | 任何除了sbtio.log之外由介质管理软件决定的介质管理日志的文件名称。 | 包含关于介质管理设备运行的信息。 |
当LIST,REPORT和SHOW命令不能提供所有你需要的RMAN操作信息时,某些V$视图可以提供有用的详细信息。
某些时候精确确认执行备份和恢复作业的服务器会话正在做什么是很有用的。下表中描述的这些视图对于获取关于RMAN作业的信息是有用的。
视图 | 描述 |
---|---|
V$PROCESS | 确认当前活动的进程 |
V$SESSION | 确认当前活动的会话。使用这个视图来确认哪个数据库服务器会话对应哪个RMAN分配的通道。 |
V$SESSION_WAIT | 列出事件或会话在等待的资源 |
可以用动态性能事件视图中的事件名称来监控RMAN调用介质管理器API。事件名称与SBT函数一对一对应。
看以下示例:
Backup: MML v1 open backup piece
Backup: MML v1 read backup piece
Backup: MML v1 write backup piece
Backup: MML v1 query backup piece
Backup: MML v1 delete backup piece
Backup: MML v1 close backup piece
...
为获取SBT事件的完整列表,可以使用以下查询:
SELECT NAME
FROM V$EVENT_NAME
WHERE NAME LIKE ‘%MML%’;
在调用任何介质管理器API的函数之前,服务器增加一行到V$SESSION_WAIT,STATE列包含字符串WAITING。V$SESSION_WAIT.SECONDS_IN_WAIT列显示服务器已经等待调用返回的秒数。在SBT函数从介质管理器返回之后,这行消失。
在V$SESSION_WAIT对应SBT事件名称的一行不是表明有问题,因为服务器在运行期间更新这些行。当做调用和返回时行对应地出现和消失。然而,如果SECONDS_IN_WAIT列值很高,那么介质管理器可能挂起。
为监控SBT事件,可以运行以下SQL查询:
COLUMN EVENT FORMAT a17
COLUMN SECONDS_IN_WAIT FORMAT 999
COLUMN STATE FORMAT a15
COLUMN CLIENT_INFO FORMAT a30
SELECT p.SPID, s.EVENT, s.SECONDS_IN_WAIT AS SEC_WAIT,
sw.STATE, s.CLIENT_INFO
FROM V$SESSION_WAIT sw, V$SESSION s, V$PROCESS p
WHERE sw.EVENT LIKE ‘%MML%’
AND s.SID=sw.SID
AND s.PADDR=p.ADDR;
检查SQL输出来确认哪些SBT函数在等待。例如,以下输出表明RMAN已经等待sbtbackup函数返回达10分钟:
SPID EVENT SEC_WAIT STATE CLIENT_INFO
---- ----------------- ---------- --------------- ---------------
8642 Backup: MML creat 600 WAITING rman channel=ORA_SBT_TAPE_1
注:V$SESSION_WAIT视图只显示数据库事件,不显示介质管理器事件。
可以查询视图V$SESSION和V$PROCESS确认哪个服务器会话与哪个RMAN通道对应。
V$PROCESS的SPID列表明进程或线程的操作系统ID号。例如,在UNIX列SPID显示进程ID,而在Windows上的SPID列显示线程ID。有两个基本方法获取这个信息,取决于你是否有多个RMAN会话同时是活动的。
当只有一个RMAN会话是活动时,确认RMAN通道的服务器会话ID的最简单的方法是查询目标数据库。
当RMAN任务在执行时,在目标数据库上运行以下查询:
COLUMN CLIENT_INFO FORMAT a30
COLUMN SID FORMAT 999
COLUMN SPID FORMAT 9999
SELECT s.SID, p.SPID, s.CLIENT_INFO
FROM V$PROCESS p, V$SESSION s
WHERE p.ADDR = s.PADDR
AND CLIENT_INFO LIKE ‘rman%’;
示例输出:
SID SPID CLIENT_INFO
---- ------------ ---------------------------------------------------
14 8374 rman channel=ORA_SBT_TAPE_1
如果使用RMAN的SET COMMAND ID命令设置ID而不是使用系统生成的缺省ID,那么在CLIENT_INFO列搜索该值而不是“rman%”。
如果多个RMAN会话是活动的,那么V$SESSION.CLIENT_INFO列会为每个会话中的通道产生相同的信息。
例如:
SID SPID CLIENT_INFO
---- ------------ ------------------------------
14 8374 rman channel=ORA_SBT_TAPE_1
9 8642 rman channel=ORA_SBT_TAPE_1
在这个情况中,你有以下方法来确认哪个通道对应哪个SID值。
你必须首先从RMAN输出中获取sid值,然后在SQL查询中使用这些值。
在备份期间关联进程和通道:
1)在活动会话中,像平常一样运行RMAN作业和检查输出来取得通道的SID。
Starting backup at 21-AUG-13
allocated channel: ORA_SBT_TAPE_1
channel ORA_SBT_TAPE_1: sid=14 devtype=SBT_TAPE
2)启动SQL*Plus会话,然后当RMAN作业执行时联合查询V
S
E
S
S
I
O
N
和
V
SESSION和V
SESSION和VPROCESS视图。
COLUMN CLIENT_INFO FORMAT a30
COLUMN SID FORMAT 999
COLUMN SPID FORMAT 9999
SELECT s.SID, p.SPID, s.CLIENT_INFO
FROM V$PROCESS p, V$SESSION s
WHERE p.ADDR = s.PADDR
AND CLIENT_INFO LIKE ‘rman%’
使用步骤1中获得的sid值来确认哪个通道对应哪个会话:
SID SPID CLIENT_INFO
---------- ------------ ------------------------------
14 2036 rman channel=ORA_SBT_TAPE_1
12 2066 rman channel=ORA_SBT_TAPE_1
你在RMAN备份脚本中指定命令ID字符串。然后可以查询V$SESSION.CLIENT_INFO获取字符串。
在备份期间关联进程和通道:
1)在每个会话中,在分配通道之后设置COMMAND ID为不同值,然后备份期望的对象。例如,在会话1中输入以下命令:
RUN
{
ALLOCATE CHANNEL c1 TYPE disk;
SET COMMAND ID TO ‘sess1’;
BACKUP DATABASE;
}
在会话2的作业中设置COMMAND ID为比如sess2的字符串:
RUN
{
ALLOCATE CHANNEL c1 TYPE sbt;
SET COMMAND ID TO ‘sess2’;
BACKUP DATABASE;
}
2)启动SQL*Plus会话,然后当RMAN作业执行时联合查询V
S
E
S
S
I
O
N
和
V
SESSION和V
SESSION和VPROCESS视图。
SELECT SID, SPID, CLIENT_INFO
FROM V$PROCESS p, V$SESSION s
WHERE p.ADDR = s.PADDR
AND CLIENT_INFO LIKE ‘%id=sess%’;
如果在RMAN作业中运行SET COMMAND ID命令,那么CLIENT_INFO列以下列格式显示:
id=command_id,rman channel=channel_id
例如:
SID SPID CLIENT_INFO
---- ------------ ------------------------------
11 8358 id=sess1
15 8638 id=sess2
14 8374 id=sess1,rman channel=c1
9 8642 id=sess2,rman channel=c1
行包含字符串rman channel显示通道在执行备份。剩余行显示到目标数据库的连接。
有几种方式终止在中途执行的RMAN命令:
它们包括以下:
1)优先的方法是在RMAN界面中按Ctrl+C(或你的系统的等同的“注意”键组合)。这也终止分配的通道,除非它们在介质管理代码中被挂起,和例如它们在等待挂载磁带时发生的一样。
2)你可以通过运行SQL的ALTER SYSTEM KILL SESSION语句来中止与RMAN通道相应的服务器会话。
3)你可以在操作系统上中止与RMAN通道相应的服务器会话。
通过使用ALTER SYSTEM语句终止RMAN会话,你需要RMAN通道的Oracle会话ID和序列号。这个信息包含在RMAN日志的消息中。
搜索使用如下例所示的格式的消息:
channel ch1: sid=15 devtype=SBT_TAPE
消息显示每个分配的通道的sid和devtype。Oracle数据库的sid与操作系统进程ID不同。可以使用SQL的ALTER SYSTEM KILL SESSION语句结束会话。
ALTER SYSTEM KILL SESSION采用2个参数,在RMAN消息中的sid和序列号,两个都可以通过查询V$SESSION获得。
例如,运行以下语句,其中sid_in_rman_output是RMAN消息中显示的数字:
SELECT SERIAL#
FROM V$SESSION
WHERE SID=sid_in_rman_output;
然后,运行以下语句,使用以上查询中获得的数字替代sid_in_rman_output和serial#:
ALTER SYSTEM KILL SESSION ‘sid_in_rman_output,serial#’;
如果会话在介质管理代码中停止,那么语句对会话没有影响。
找到和终止与服务器会话关联的进程是操作系统特定的步骤。在某些平台上,服务器会话不与任何进程关联。参考操作系统特定的文档获取更多的信息。
某些时候你可能需要终止在介质管理器中没有响应的RMAN作业。当通道连接在介质管理器中没有响应时,终止RMAN的最佳方式是在介质管理器中终止会话。
如果这个操作不能解决问题,那么在某些平台上,比如Linux,你可能可以终止连接的Oracle数据库进程(终止Oracle进程可能会造成介质管理器问题)。
RMAN会话的本质取决于操作系统。
在UNIX中,一个RMAN会话有以下与它关联的进程:
1)RMAN客户端进程本身。
2)缺省的通道,到目标数据库的初始化连接。
3)每个分配的通道对应的到目标数据库的目标连接。
4)到恢复目录数据库的目录连接,如果你使用恢复目录。
5)到辅助实例的辅助连接,在DUPLICATE或TSPITR操作期间。
6)到目标数据库的轮询连接,用于监控在各种分配的通道上的RMAN命令执行。缺省情况下,RMAN建立一个轮询连接。如果你在ALLOCATE CHANNEL或CONFIGURE CHANNEL命令中使用不同的连接字符串,RMAN建立额外的轮询连接。在ALLOCATE CHANNEL或CONFIGURE CHANNEL命令中使用的每个不同的连接字符串都存在一个轮询连接。
RMAN通常因为一个通道连接正在介质管理器代码中等待磁带资源而停止响应。目录连接和缺省通道似乎挂起,因为它们等待RMAN通知它们做什么。当在RMAN进程的控制下轮询RPC时,轮询连接好像在无限的循环中。
如果你终止RMAN进程本身,那么你也终止目录连接,辅助连接,缺省的通道和轮询连接。如果目标和辅助连接挂起但同时没有执行介质管理器代码,它们也终止。如果目标连接或任何辅助连接在介质管理层中执行,那么它们不终止直到进程在操作系统层被手动终止。
不是所有介质管理器都可以检测到Oracle数据库进程的终止。那些不能检测到的介质管理器可能会保持资源忙碌或继续处理。
终止目录连接不会造成RMAN进程终止,因为当备份或还原在进行时RMAN不会执行目录操作。移除缺省的通道和轮询连接会造成RMAN进程检测到通道不再存在,然后退出。在这种情况中,到无响应的通道的连接如之前描述的一样保持活动的状态。
在介质管理器中的无响应通道被终止之后,RMAN进程检测到这个终止和退出,移除除了在介质管理层仍然工作的目标连接之外的所有连接。
关于介质管理器资源的告警仍然应用到这种情况中。
终止在介质管理器中没有响应的Oracle数据库进程:
1)查询V
S
E
S
S
I
O
N
和
V
SESSION和V
SESSION和VSESSION_WAIT。
COLUMN EVENT FORMAT a17
COLUMN SECONDS_IN_WAIT FORMAT 999
COLUMN STATE FORMAT a10
COLUMN CLIENT_INFO FORMAT a30
SELECT p.SPID, s.EVENT, s.SECONDS_IN_WAIT AS SEC_WAIT,
sw.STATE, s.CLIENT_INFO
FROM V$SESSION_WAIT sw, V$SESSION s, V$PROCESS p
WHERE sw.EVENT LIKE ‘%MML%’
AND s.SID=sw.SID
AND s.PADDR=p.ADDR;
检查SQL输出确认哪个SBT功能在等待。例如,输出可能如下:
SPID EVENT SEC_WAIT STATE CLIENT_INFO
---- ----------------- ---------- ---------- -----------------------------
8642 Backup:MML write 600 WAITING rman channel=ORA_SBT_TAPE_1
8374 Backup:MML write 600 WAITING rman channel=ORA_SBT_TAPE_2
2)使用适合你的平台的操作系统层工具,终止无响应的会话。
% kill -9 8642 8374
某些平台包括名为orakill的命令行工具让你终止特定的线程。从命令提示符中,运行以下命令,其中sid指明目标数据库实例,thread_id是步骤1查询中的SPID值:
orakill sid thread_id
3)检查介质管理器也清除了它的进程。如果遗留,下次的备份或还原操作可能由于之前的备份或还原操作中的问题再次挂起。在某些介质管理器中,唯一的解决方法是关闭和重启介质管理器。
来源:《Oracle Database Backup and Recovery User’s Guide,19c》