《涂抹Oracle——三思笔记之一步一步学Oracle》作为一本创作之初就定位于技术应用的实践参考书,虽然前前后后串联了Oracle数据库中十余个常用特性或工具,但在章节的设计上完全遵循这一理念。第8章讲述RMAN说,我能备份。本节说的是V$BACKUP_CORRUPTION视图。
8.7.7 RMAN备份相关的动态性能视图
虽然使用LIST、REPORT等RMAN命令时也能显示备份信息,不过使用那些命令后看到的都是结果,而通过Oracle数据库中的一些动态性能视图,不仅仅能够看到备份信息,甚至还能在备份过程中监控备份进度,查看当前进行的操作等。
提 示
什么是动态性能视图?
可以将其理解成由Oracle提供的存在于内存中的虚拟视图。这批视图由Oracle的后台进程自行维护,访问的时候与普通表或视图一样,但用户只能读取而无法插入、修改或删除这些视图中的内容。这一系列视图在数据库调优方面具有重要的、不可替代的作用,而且功能完善、数量庞大。关于动态性能视图的全面介绍超出本书内容,感兴趣的朋友请参考相关书籍或阅读官方文档,本小节中仅介绍部分与RMAN备份恢复相关的常用动态性能视图。
8.7.7.1 V$ARCHIVED_LOG视图
本视图包含了归档重做日志文件的信息,如归档文件的名称、归档路径等。该视图中数据来自于控制文件,一般是当一个Online Redologs完成归档后,就会在控制文件中插入一条记录,如果归档目录有多个的话,则同时插入对应数量的记录(当然路径肯定不同),另外当通过RMAN恢复归档文件或复制归档文件时,也会插入对应的记录。
通过DESC命令查看可以看到该视图包括的列有很多:
SQL> DESC V$ARCHIVED_LOG Name Null? Type ----------------------------------------------------------- RECID NUMBER STAMP NUMBER NAME VARCHAR2(513) DEST_ID NUMBER THREAD# NUMBER SEQUENCE# NUMBER RESETLOGS_CHANGE# NUMBER RESETLOGS_TIME DATE RESETLOGS_ID NUMBER FIRST_CHANGE# NUMBER FIRST_TIME DATE NEXT_CHANGE# NUMBER NEXT_TIME DATE BLOCKS NUMBER BLOCK_SIZE NUMBER CREATOR VARCHAR2(7) REGISTRAR VARCHAR2(7) STANDBY_DEST VARCHAR2(3) ARCHIVED VARCHAR2(3) APPLIED VARCHAR2(3) DELETED VARCHAR2(3) STATUS VARCHAR2(1) COMPLETION_TIME DATE DICTIONARY_BEGIN VARCHAR2(3) DICTIONARY_END VARCHAR2(3) END_OF_REDO VARCHAR2(3) BACKUP_COUNT NUMBER ARCHIVAL_THREAD# NUMBER ACTIVATION# NUMBER IS_RECOVERY_DEST_FILE VARCHAR2(3) COMPRESSED VARCHAR2(3) FAL VARCHAR2(3) END_OF_REDO_TYPE VARCHAR2(10)
一般情况下并不是每一列都需要关注,通常你需要看下列字段的值:
NAME:记录归档文件路径和名称。
THREAD#:归档线程号,RAC环境下适用。
SEQUENCE#:归档文件序号。
FIRST_TIME:等同于创建时间。
CREATOR:该条记录的创建者(告诉你究竟是哪个进程干的)。
APPLIED:是否被应用,Data Guard环境下适用。
STATUS:该条记录的状态。
其中,CREATOR列标识该条记录的创建者,有下列几个值:
ARCH:表示由归档进程创建。
FGRD:表示由前台进程创建。
RMAN:表示由RMAN创建。
SRMN:表示由Standby端的RMAN创建。
LGWR:表示由Logwriter进程创建。
STATUS列标识该条记录的状态,有下列几个值:
A:指正常归档状态。
D:指该记录指向的归档文件已被删除。
U:指该记录指向的归档已不存用。
X:指该条记录失效,通常是当你在RMAN中执行了CROSSCHECK ARCHIVELOG后有可能出现。
其他字段理解起来比较简单,按照字面意义理解即可。
8.7.7.2 V$BACKUP_SET视图
V$BACKUP_SET视图中显示当前创建的备份集信息,该视图比较简单,通过DESC命令查看结构:
SQL> DESC V$BACKUP_SET; Name Null? Type ------------------------------------------------ RECID NUMBER STAMP NUMBER SET_STAMP NUMBER SET_COUNT NUMBER BACKUP_TYPE VARCHAR2(1) CONTROLFILE_INCLUDED VARCHAR2(3) INCREMENTAL_LEVEL NUMBER PIECES NUMBER START_TIME DATE COMPLETION_TIME DATE ELAPSED_SECONDS NUMBER BLOCK_SIZE NUMBER INPUT_FILE_SCAN_ONLY VARCHAR2(3) KEEP VARCHAR2(3) KEEP_UNTIL DATE KEEP_OPTIONS VARCHAR2(10)
该视图查看的信息与RMAN中命令LIST BACKUP类似,只不过表示形式不同。其中BACKUP_TYPE列标记该备份集中包含的文件类型,有下列几个值:
L:表示包含归档重做日志文件;
D:表示数据文件完全备份;
I:表示增量备份。
还有一个常用的关联视图V$BACKUP_SET_DETAILS,该视图除了包含V$BACKUP_SET中的数据外,还额外记录了备份集的详细信息,比如备份集大小、备份集所在设备等。额外的列也都比较简单,用字面意义理解列定义即可。另外还有一个显示所有备份集统计信息的视图V$BACKUP_SET_SUMMARY,该视图中只有一条记录(统计自所有备份集的数据),不过并不常用,这里就不介绍了。
8.7.7.3 V$BACKUP_PIECE视图
V$BACKUP_PIECE中显示备份片段的信息,通过SET_STAMP列可以与V$BACKUP_SET.SET_STAMP视图关联,从而获得备份集的信息。
使用DESC命令查看该视图,会发现列还是有点儿多的:
SQL> DESC V$BACKUP_PIECE; Name Null? Type ------------------------------------------------- RECID NUMBER STAMP NUMBER SET_STAMP NUMBER SET_COUNT NUMBER PIECE# NUMBER COPY# NUMBER DEVICE_TYPE VARCHAR2(17) HANDLE VARCHAR2(513) COMMENTS VARCHAR2(64) MEDIA VARCHAR2(65) MEDIA_POOL NUMBER CONCUR VARCHAR2(3) TAG VARCHAR2(32) STATUS VARCHAR2(1) START_TIME DATE COMPLETION_TIME DATE ELAPSED_SECONDS NUMBER DELETED VARCHAR2(3) BYTES NUMBER IS_RECOVERY_DEST_FILE VARCHAR2(3) RMAN_STATUS_RECID NUMBER RMAN_STATUS_STAMP NUMBER COMPRESSED VARCHAR2(3)
不过通常情况下需要我们关注的并不多,如下所示:
SET_STAMP:用来关联V$BACKUP_SET列。
PIECE#:该备份片段在对应备份集中的序号,默认是从1开始。
DEVICE_TYPE:备份片段对应文件存储的设备类型。
HANDLE:备份片段对应的文件。
STATUS:备份片段状态,有三个状态值:A(可用);D(已删除);或X(文件存在)。
BYTES:该备份片段大小。
与V$BACKUP_SET一样,V$BACKUP_PIECE也有一个对应的记录详细信息的视图V$BACKUP_PIECE_DETAILS,该视图中除了包含V$BACKUP_PIECE中的列外,还提供了一些额外的信息。
8.7.7.4 V$BACKUP_CORRUPTION视图
这个视图中记录了备份集中发现的损坏的数据块,通常是当你在RMAN中执行了BACKUP VALIDATE命令对备份集进行检查后,如果发现有操作的数据块,就会向该视图中插入记录。注意不包括控制文件或归档文件,因为这两类文件都是独立个体,一旦损坏就表示彻底完蛋,不可修复,不像数据块,就算某个数据块坏了也没关系,还可以用其他备份集中匹配的数据进行修复。
通过DESC查看:
SQL> DESC V$BACKUP_CORRUPTION; Name Null? Type ---------------------------------------------- RECID NUMBER STAMP NUMBER SET_STAMP NUMBER SET_COUNT NUMBER PIECE# NUMBER FILE# NUMBER BLOCK# NUMBER BLOCKS NUMBER CORRUPTION_CHANGE# NUMBER MARKED_CORRUPT VARCHAR2(3) CORRUPTION_TYPE VARCHAR2(9)
该视图的列定义都比较简单,字面意义理解即可,就不过多描述了。
8.7.7.5 V$SESSION视图和V$PROCESS视图
不仅仅局限于RMAN,在整个数据库运行过程中V$SESSION和V$PROCESS都是非常重要并且常用的视图。
1.V$SESSION视图对应"会话"信息
每一个连接到Oracle数据库的会话都能在该视图中对应一条记录,根据该视图中的信息可以查询该会话使用的用户,正在执行或者刚刚执行的SQL语句,连接者的信息等。
V$SESSION视图中的列很多,常用到的会有如下几列:
SID:会话的标识,具有唯一性,通常要对某个会话进行分析前,首先就需要获得该会话的SID。
SERIAL#:会话的序号。
PADDR:会话所属进程的地址,关联V$PROCESS视图即可查到该会话的所属进程,然后再通过V$PROCESS视图得到对应的操作系统进程号(Windows对应的是线程号)。
USERNAME:创建该会话的用户名。
CLIENT_INFO:还记得SET COMMAND ID命令吗?该命令设置的值就会在V$SESSION.CLIENT_INFO中体现。
OSUSER:客户端操作系统的用户名。
MACHINE:客户端的机器名。
TERMINAL:客户端运行的终端名。
PROGRAM:客户端执行的程序名。
SQL_ADDRESS:执行SQL的地址。
SQL_HASH_VALUE:执行SQL的HASH值,与SQL_ADDRESS关联查询其他SQL相关视图后即可查询会话当前正在执行的SQL语句。
EVENT:当前会话的等待事件。
例如:已知设置的client_info值,查询会话的相关信息:
SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS FROM V$SESSION WHERE client_info like '%id=rman%';
2.V$PROCESS视图对应"连接"信息
V$PROCESS视图中的一条记录对应操作系统中的一个进程(Windows中为线程),该视图中的SPID即操作系统中的进程号,通过该视图就可以将Oracle中的会话、连接与操作系统中的进程关联起来。
例如:通过下列SQL语句,通过关联查询V$PROCESS和V$SESSION获得执行RMAN操作的进程的SID与SPID信息:
SELECT S.SID, S.SERIAL#, P.SPID, S.CLIENT_INFO FROM V$PROCESS P, V$SESSION S WHERE P.ADDR = S.PADDR AND CLIENT_INFO LIKE '%id=rman%'
8.7.7.6 V$SESSION_LONGOPS视图
V$SESSION_LONGOPS视图本意是记录Oracle数据库中执行时间超过6秒的操作,由于RMAN备份操作涉及大量I/O读写,多数情况下肯定会超过6秒,因此通过该视图查询RMAN操作正合适。
该视图中的列并不是很多,需要我们关注的主要有下列几个:
SID:会话的标识,具有唯一性,通常要对某个会话进行分析前,首先就需要获得该会话的SID。
SERIAL#:会话的序号。
OPNAME:操作描述信息,如RMAN: full datafile backup或RMAN: full datafile restore。
SOFAR:已完成的工作量。
TOTALWORK:要完成的工作总量。
MESSAGE:当前操作的统计信息。
SQL_ADDRESS:执行SQL的地址。
SQL_HASH_VALUE:执行SQL的HASH值,与SQL_ADDRESS关联查询其他SQL相关视图后即可查询会话当前正在执行的SQL语句。
可以通过如下SQL语句获得正在进行的镜像复制操作的状态信息:
SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK, ROUND(SOFAR / TOTALWORK * 100, 2) "%_COMPLETE" FROM V$SESSION_LONGOPS WHERE OPNAME LIKE 'RMAN:%' AND OPNAME NOT LIKE '%aggregate%' AND TOTALWORK != 0 AND SOFAR <> TOTALWORK;