Relatório Oracle DB Verify

Você sabia que é possivel realizar Backup via RMAN de blocos Corrompidos?
Sim, é possivel.

E se você não estiver se preocupando com isto você pode ter um Backup queimado e ser impossiblitado de realizar o Recovery.

Para isto você deve usar periodicamente o DBV ou alterar um parametro no banco para realizar a verificação dos blocos logicos do Oracle.

Recentemente precisei analizar um log do DBVERIFY de um banco de dados que tinha mais de 500 datafiles.

Para facilitar nossa vida eu criei um pequeno codigo que lê e importa a saida do arquivo de log do DBV.

Consulta que gera a o script para a execução do DBVERIFY.

set echo off feedback off verify off pages 0 termout off  linesize 150
spool dbv_check.ksh
 select 'dbv userid=system/xxxx file=' || name || ' blocksize=' || block_size ||
 ' feedback=' || round(blocks*.10,0) -- 10 dots per file
 from v$datafile;
 spool off

Iremos criar um objeto Oracle Directory onde iremos colocar os arquivos de log .

-- Criar o Diretorio no S.O
mkdir -p /u01/app/external_tables/dba
-- Criar Oracle DIRECTORY
DROP DIRECTORY EXT_DBA_DIR;
CREATE DIRECTORY "EXT_DBA_DIR" AS '/u01/app/external_tables/dba';

Nós iremos criar uma External Table que irá ler o arquivo de log DBV_OUTPUT.LOG no diretorio “/ u01/app/external_tables/dba”.

-- CREATE EXTERNAL TABLE

-- DROP TABLE TBE_DBV_OUTPUT PURGE;

 CREATE TABLE "TBE_DBV_OUTPUT"
 (
 "FULL_TEXT" VARCHAR2(2555 CHAR)
 )
 ORGANIZATION EXTERNAL
 (
 TYPE ORACLE_LOADER DEFAULT
 DIRECTORY "EXT_DBA_DIR" LOCATION ( "EXT_DBA_DIR":'DBV_OUTPUT.LOG' )
 );

Iremos Criar uma tabela que irá armazenar os Itens a serem analizado pelo DBV and e inserir os itens existentes.

-- CREATE TABLE ITENS OF DBV
 DROP TABLE TB_DBV_ITENS PURGE;
 CREATE TABLE "TB_DBV_ITENS"
 (
 "ID"    NUMBER,
 "ITENS" VARCHAR2(400 BYTE)
 );

 --------------------------------------------------------------------------------------------------------
 ALTER TABLE TB_DBV_ITENS MODIFY   (ID NOT NULL) ;
 --------------------------------------------------------------------------------------------------------
 ALTER TABLE TB_DBV_ITENS ADD CONSTRAINT TB_DBV_ITENS_PK PRIMARY KEY  (ID) ENABLE;
--------------------------------------------------------------------------------------------------------
--  REM INSERTING into TB_DBV_ITENS
Insert into TB_DBV_ITENS (ID,ITENS) values (1,'Total Pages Failing   (Data) ');
Insert into TB_DBV_ITENS (ID,ITENS) values (2,'Total Pages Processed (Other)');
Insert into TB_DBV_ITENS (ID,ITENS) values (3,'Total Pages Examined         ');
Insert into TB_DBV_ITENS (ID,ITENS) values (4,'Total Pages Processed (Data) ');
Insert into TB_DBV_ITENS (ID,ITENS) values (5,'Total Pages Processed (Index)');
Insert into TB_DBV_ITENS (ID,ITENS) values (6,'Total Pages Marked Corrupt   ');
Insert into TB_DBV_ITENS (ID,ITENS) values (7,'Total Pages Failing   (Index)');
Insert into TB_DBV_ITENS (ID,ITENS) values (8,'Total Pages Processed (Seg)  ');
Insert into TB_DBV_ITENS (ID,ITENS) values (9,'Total Pages Failing   (Seg)  ');
Insert into TB_DBV_ITENS (ID,ITENS) values (10,'Total Pages Influx           ');
Insert into TB_DBV_ITENS (ID,ITENS) values (11,'Total Pages Empty            ');
Insert into TB_DBV_ITENS (ID,ITENS) values (12,'Highest block SCN            ');
COMMIT;

 

Iremos criar uma tablela que ira armazenar o nome dos datafiles e tempo gasto na analise e versão do DBV.

 --- CREATE TABLE DBV_DATAFILES
 DROP TABLE TB_DBV_DATAFILES PURGE;
 CREATE TABLE "TB_DBV_DATAFILES"
 (
 "ID"            NUMBER NOT NULL ENABLE,
 "DATAFILE_NAME" VARCHAR2(500 BYTE),
 "ELAPSED"       VARCHAR2(100 BYTE),
 "DBV_VERSION"   VARCHAR2(200 BYTE)
 ) ;

COMMENT ON COLUMN "TB_DBV_DATAFILES"."ELAPSED" IS 'HH24:MI:SS';

We will create a table to store the results of analyzed items during the process of DBV.

 ---------------------------------------------------------------------------------------------------------
 DROP TABLE TB_DBV_ITENS_VALUES PURGE;
 CREATE TABLE "TB_DBV_ITENS_VALUES"
 (
 "DATAFILE_NAME" NUMBER,
 "ITENS"         NUMBER,
 "ITENS_VALUES"  VARCHAR2(300 BYTE))
 ;

Iremos criar uma função para calcular o tempo gasto durante a analise do datafile.

create or replace
function datediff(                       p_d1   in date,
 p_d2   in date ) return date
 as
 l_result    date;
 begin
 select to_date(to_char(mod(floor((p_d1-p_d2)*24),24),'00')
 || ':' ||
 to_char(mod(floor((p_d1-p_d2)*24*60),60),'00')
 || ':' ||
 to_char(mod(floor((p_d1-p_d2)*24*60*60),60),'00'),'HH24:MI:SS')
 into l_result from dual;
 return l_result;
 end;
/


Criaremos também uma sequencia que será usada como ID da tabela que irá armazenar o nome dos Datafiles

DROP SEQUENCE SEQ_ID_DATAFILE;

CREATE SEQUENCE SEQ_ID_DATAFILE INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 CACHE 20;
 

Agora iremos criar uma Procedure que irá carregar os dados no banco de dados

 create or replace
PROCEDURE LOAD_DBV_LOG
AS
 vDBV_FULL_TEXT VARCHAR2(2555);
 vDBV_VERSION   VARCHAR2(100);
 vDBV_TIME1 DATE;
 vDBV_TIME2 DATE;
 vDBV_FILE         VARCHAR2(1300);
 vDBV_ITENS        VARCHAR2(4000);
 vDBV_ITENS_VALUES VARCHAR2(300);
 vDBV_DATAFILE     VARCHAR2(1000);
 v_id_datafile     NUMBER;
 vDBV_ITENS_ID     NUMBER;
 vDBV_ELAPSED      VARCHAR2(200);
 v_id_datafile_aux NUMBER;
BEGIN
 DELETE TB_DBV_ITENS_VALUES;
 COMMIT;

 DELETE TB_DBV_DATAFILES;
 COMMIT;

 FOR DBV_INPUT IN
 (SELECT FULL_TEXT FROM TBE_DBV_OUTPUT
 )
 LOOP
 BEGIN
 vDBV_FULL_TEXT := DBV_INPUT.FULL_TEXT;
 BEGIN
 IF SUBSTR(vDBV_FULL_TEXT,1,17) = 'DBVERIFY: Release' THEN
 vDBV_TIME2                  := vDBV_TIME1;
 vDBV_VERSION                := SUBSTR(vDBV_FULL_TEXT,19,10);
 vDBV_TIME1                  := TO_DATE(UPPER(SUBSTR(vDBV_FULL_TEXT,50)),'MON DD HH24:MI:SS YYYY');
 END IF;
 END;
 BEGIN
 IF SUBSTR(vDBV_FULL_TEXT,1,41) = 'DBVERIFY - Verification starting : FILE =' THEN
 v_id_datafile_aux           := v_id_datafile;
 vDBV_DATAFILE               := SUBSTR(vDBV_FULL_TEXT,43);
 v_id_datafile               := SEQ_ID_DATAFILE.nextval;
 INSERT
 INTO TB_DBV_DATAFILES
 (
 ID,
 DATAFILE_NAME,
 DBV_VERSION
 )
 VALUES
 (
 v_id_datafile,
 vDBV_DATAFILE,
 vDBV_VERSION
 );
 COMMIT;
 IF v_id_datafile_aux IS NOT  NULL THEN
 SELECT TO_CHAR(DATEDIFF(vDBV_TIME1,vDBV_TIME2),'HH24:MI:SS') INTO vDBV_ELAPSED FROM DUAL;
 UPDATE TB_DBV_DATAFILES SET ELAPSED=vDBV_ELAPSED WHERE ID = v_id_datafile_aux;
 COMMIT;
 END IF;
 END IF;
 END;
 BEGIN
 IF SUBSTR ( vDBV_FULL_TEXT,1,11 ) = 'Total Pages' OR SUBSTR ( vDBV_FULL_TEXT,1,7 ) = 'Highest' THEN
 SELECT ID
 INTO vDBV_ITENS_ID
 FROM TB_DBV_ITENS
 WHERE ITENS        = SUBSTR(vDBV_FULL_TEXT,1,29);
 vDBV_ITENS_VALUES := SUBSTR(vDBV_FULL_TEXT,32);
 INSERT
 INTO TB_DBV_ITENS_VALUES
 (
 ITENS,
 DATAFILE_NAME,
 ITENS_VALUES
 )
 VALUES
 (
 vDBV_ITENS_ID,
 v_id_datafile,
 vDBV_ITENS_VALUES
 );
 COMMIT;
 END IF;
 END;
 END;
 END LOOP;
END;
/

Concluindo iremos criar uma VIEW que irá retornar os valores das tabelas igual a saida de log do DBV_LOG

CREATE OR REPLACE FORCE VIEW "REPORT_DBV"
AS
 SELECT DF.DATAFILE_NAME,
 DF.DBV_VERSION,
 DF.ELAPSED,
 I.ITENS,
 IV.ITENS_VALUES
 FROM TB_DBV_DATAFILES DF ,
 TB_DBV_ITENS I ,
 TB_DBV_ITENS_VALUES IV
 WHERE IV.DATAFILE_NAME = DF.ID
 AND IV.ITENS           = I.ID;

Exemplo de Execução:

Gerando o Arquivo de Log DBV

cat dbv_check.ksh
dbv userid=system/xxxx file=+DG_DATA/tsm/datafile/system.256.71328 blocksize=8192 feedback=11776

Saida do DBV:

DBVERIFY: Release 10.2.0.5.0 - Production on Sun Sep 12 05:17:28 2010

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

DBVERIFY - Verification starting : +DG_DATA/tsm/datafile/system.256.71328

DBVERIFY - Verification complete

Total Pages Examined         : 655360
Total Pages Processed (Data) : 0
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 8
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 655352
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 0 (0.0)

Após colocarmos o log no diretorio /u01/app/external_tables/dba, só conectar no Oracle e executar a Procedure

SQL*Plus: Release 11.2.0.1.0 Production on Thu Sep 16 15:39:49 2010

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Release 11.2.0.1.0 - Production
With the Automatic Storage Management option

SQL> exec load_dbv_log;

PL/SQL procedure successfully completed.


Com uma simples consulta….

SET UNDERLINE =
SET PAGESIZE 15
SET LINESIZE 200
BREAK ON DATAFILE_NAME ON DBV_VERSION ON  ELAPSED SKIP 1;
COL DATAFILE_NAME FOR A50
COL DBV_VERSION FOR A14
COL ELAPSED FOR A10
COL ITENS FOR A30
COL IVALUES FOR A10
SELECT DATAFILE_NAME, DBV_VERSION, ELAPSED, ITENS, ITENS_VALUES AS IVALUES
FROM REPORT_DBV
WHERE   DATAFILE_NAME LIKE '%system%'


Nós conseguimos isto…

DATAFILE_NAME                                      DBV_VERSION    ELAPSED    ITENS                          IVALUES
================================================== ============== ========== ============================== ==========
+DG_DATA/tsm/datafile/system.256.71328             10.2.0.5.0     00:00:43   Total Pages Failing   (Data)   0
                                                                             Total Pages Processed (Other)  692853
                                                                             Total Pages Examined           1310720
                                                                             Total Pages Processed (Data)   194873
                                                                             Total Pages Processed (Index)  51889
                                                                             Total Pages Marked Corrupt     0
                                                                             Total Pages Failing   (Index)  0
                                                                             Total Pages Processed (Seg)    0
                                                                             Total Pages Failing   (Seg)    0
                                                                             Total Pages Influx             0
                                                                             Total Pages Empty              371105
                                                                             Highest block SCN              0 (0.0)

Ainda falta alguns aprimoramentos no código, pois este código não importamos para o banco informaçoes dos blocos corrompidos somente mostramos quantas falhas existem no datafile.

Em breve estarei finalizando…

Use usa imaginação….

Aproveite!!!

Advertisements


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s