segunda-feira, 16 de dezembro de 2013

Alterando valores de uma sequência


As sequências ou “sequences” são objetos do banco de dados onde vários usuários podem gerar números inteiros únicos. As gerações dos números sequenciais ajudam na geração das chaves primárias.


Sem as sequências, os valores sequenciais só podem ser produzidos através de uma programação. Um novo valor de chave primária pode ser obtido selecionando uma sequência, que uma vez fornecido ao usuário, incrementa seu valor automaticamente.

 

Neste artigo vamos apresentar como alterar valores de uma sequência sem a necessadade de recriá-la. Em versões anteriores do Oracle para reinicializar uma sequência era necessário recriá-la.

 

A seguir vamos demonstrar os passos:

 

Criando uma sequência usaremos o comando abaixo.

 

SQL> CREATE SEQUENCE SEQ_TEST

      INCREMENT BY 1

      START WITH 1

      NOMAXVALUE

      NOCYCLE

      CACHE 10;

 

Sequence created.

Para ver o valor atual da sequência utilizamos os comandos abaixo:

SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;

 

   NEXTVAL

----------

         1

 

SQL> SELECT SEQ_TEST.CURRVAL FROM DUAL;

 

   CURRVAL

----------

         1

Em seguida, para incrementar valores na sequência executaremos os comandos abaixo:

SQL>  SELECT SEQ_TEST.NEXTVAL FROM DUAL;

 

   NEXTVAL

----------

         2

 

SQL>  SELECT SEQ_TEST.NEXTVAL FROM DUAL;

 

   NEXTVAL

----------

         3

 

SQL>  SELECT SEQ_TEST.NEXTVAL FROM DUAL;

 

   NEXTVAL

----------

         4

 

SQL>  SELECT SEQ_TEST.NEXTVAL FROM DUAL;

 

   NEXTVAL

----------

         5

 

SQL> SELECT SEQ_TEST.CURRVAL FROM DUAL;

 

   CURRVAL

----------

         5

Neste exemplo geramos 5 incrementos para a sequência.

Para reinicializar a sequência, deve-se utilizar o comando “alter sequence” com a opção "increment by", adicionando o valor que se deseja inicializar ou mesmo diminuir, conforme o exemplo abaixo:

 

SQL> ALTER SEQUENCE SEQ_TEST INCREMENT BY -5 MINVALUE 0;

 

Sequence altered.

 

 

O comando acima irá zerar a sequência, pois a mesma possuía 5 valores e no comando é subtraído 5,  conforme resultado demonstrado abaixo.

 

 

SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;

 

   NEXTVAL

----------

         0

 

SQL> SELECT SEQ_TEST.CURRVAL FROM DUAL;

 

   CURRVAL

----------

         0

 

Também é possível incrementar valores, substituindo pelo valor desejado, conforme apresentado abaixo:

 

SQL> ALTER SEQUENCE SEQ_TEST INCREMENT BY 3 MINVALUE 0;

 

Sequence altered.

 

 

SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;

 

   NEXTVAL

----------

         3

 

SQL> SELECT SEQ_TEST.CURRVAL FROM DUAL;

 

   CURRVAL

----------

         3

 

 

Referências: Oracle® Database SQL Language Reference 11gR2 (11.2)
         Oracle® Database Administrator´s Guide 11gR2 (11.2)




MSc. Rubens Oliveira
DBA Oracle Consultor

segunda-feira, 2 de dezembro de 2013

Package DBMS_HM – Health Monitor



A partir da versão 11g a Oracle disponibilizou uma “package” que permite realizar testes e diagnosticar problemas no banco de dados, seu nome é DBMS_HM. Neste artigo vamos demonstrar o uso da DBMS_HM.

 


NOTA: Neste artigo será abordada somente a execução manual utilizando o SQL*Plus. Para a ativação ou execução via Enterprise Manager, favor verificar o manual (Oracle® Database Administrator´s Guide 11gR2).

 

A “package” DBMS_HM, permite examinar várias camadas e componentes do banco de dados. Com ela é possível detectar corrupções de “datafiles”, corrupções de blocos lógicos e físicos, corrupção de segmentos de “undo” ou de “redo” e corrupções no dicionário de dados. As análises geram relatórios e em muitos casos, a DBMS_HM faz recomendações para resolver os problemas encontrados.

 

As verificações podem ser executadas de duas formas:


Reativa: O diagnóstico pode ser executado de modo automático em resposta a um erro crítico ocorrido.

 

Manual: O DBA pode executar manualmente verificações utilizando a “package” DBMS_HM ou a interface do Enterprise Manager.

 

As verificações podem ser executadas com o banco “online” ou em “offline” (modo NOMOUNT).


Somente a verificação “Integrity Check Redo e o DB Structure Integrity Check”, não pode ser realizada no modo “online”, as demais todas podem ser executadas.

 

Tipos de verificações:

 

DB Structure Integrity Check: Verifica a integridade dos “datafiles” e gera relatórios de falhas se esses arquivos estiverem inacessíveis, corrompidos ou inconsistentes. Se o banco de dados estiver “online” verifica os arquivos de “redolog”, “datafiles” e “controlfile”. Se o banco de dados estiver “offline” verifica apenas os arquivos de “controlfiles”.

 

Data Block Integrity Check: Verifica e detecta corrupções nos blocos dos discos, tais como falhas de checksum, incompatibilidades com os “headers e tails” e inconsistências lógicas dentro do bloco.


Redo Integrity Check: Verifica se o conteúdo do “redolog” não está corrompido.

 

Undo Segment Integrity Check: Verifica se o segmento de “undo” possui corrupções. Ao localizar uma corrupção no segmento de “undo”, essa verificação usa os processos de “PMON” e “SMON” para tentar recuperar a transação corrompida. Se esta recuperação falhar, então a package DBMS_HM armazena as informações sobre a corrupção na visão V$CORRUPT_XID_LIST.

 

Transaction Integrity Check: Verificação identica a “Undo Segment Integrity Check” exceto que é verifica apenas uma transação específica.


Dicionário Integrity Check: Verificação que examina a integridade dos objetos do dicionário de dados.

 

 

A seguir serão apresentados os passos para a execução da verificação da base de dados, utilizando a “package” DBMS_HM.

 

Conectar-se ao SQL*Plus com o usuário SYS.

 

SQL> conn / as sysdba

 

Connected.

Verificar quais são as opções disponíveis para o “check” no banco de dados, consultar a visão V$HM_CHECK:


SQL> SELECT name FROM v$hm_check WHERE internal_check='N';

NAME
----------------------------------------------------------------
DB Structure Integrity Check
CF Block Integrity Check
Data Block Integrity Check
Redo Integrity Check
Transaction Integrity Check
Undo Segment Integrity Check
Dictionary Integrity Check
ASM Allocation Check

8 rows selected.

A maioria das verficações do banco de dados são apresentadas através da visão V$HM_CHECK_PARAM.

SQL> SET LINESIZE 200
SQL> SET PAGES 200
SQL> COLUMN CHECK_NAME     FORMAT A30 HEADING "NOME"
SQL> COLUMN PARAMETER_NAME FORMAT A20 HEADING "PARAMETROS"
SQL> COLUMN TYPE           FORMAT A15 HEADING "TIPOS"
SQL> COLUMN DEFAULT_VALUE  FORMAT A15 HEADING "VALORES DEFAULT"
SQL> COLUMN DESCRIPTION    FORMAT A40 HEADING "DESCRICAO"
SQL>
SQL> SELECT C.NAME CHECK_NAME, P.NAME PARAMETER_NAME, P.TYPE, P.DEFAULT_VALUE, P.DESCRIPTION
  2  FROM   V$HM_CHECK_PARAM P, V$HM_CHECK C
  3  WHERE  P.CHECK_ID = C.ID
  4  AND    C.INTERNAL_CHECK = 'N'
  5  ORDER BY C.NAME;

NOME                         PARAMETROS        TIPOS           VALORES DEFAULT DESCRICAO
---------------------------- ----------------- --------------- --------------- ---------------------
ASM Allocation Check         ASM_DISK_GRP_NAME DBKH_PARAM_TEXT                 ASM group name
CF Block Integrity Check     CF_BL_NUM         DBKH_PARAM_UB4                  Control file block
                                                                               number
Data Block Integrity Check   BLC_DF_NUM        DBKH_PARAM_UB4                  File number
Data Block Integrity Check   BLC_BL_NUM        DBKH_PARAM_UB4                  Block number
Dictionary Integrity Check   CHECK_MASK        DBKH_PARAM_TEXT ALL             Check mask
Dictionary Integrity Check   TABLE_NAME        DBKH_PARAM_TEXT ALL_CORE_TABLES Table name
Redo Integrity Check         SCN_TEXT          DBKH_PARAM_TEXT 0               SCN of the latest
                                                                               good redo (if known)
Transaction Integrity Check  TXN_ID            DBKH_PARAM_TEXT                 Transaction ID
Undo Segment Integrity Check USN_NUMBER        DBKH_PARAM_TEXT                 Undo segment number

9 rows selected.

A procedure utilizada para executar uma verficação no banco de dados é a “DBMS_HM.RUN_CHECK”.

SQL> BEGIN
  DBMS_HM.run_check (
    check_name   => 'DB Structure Integrity Check',
    run_name     => 'TESTE_VERIF');
END;
/

PL/SQL procedure successfully completed.


Os resultados da verificação podem ser apresentados usando alguns dos recursos descrito abaixo:

Através da execução da função DBMS_HM.GET_RUN_REPORT, que retorna um relatório dos resultados em formato texto, HTML ou XML.
Os resultados também podem ser consultados diretamente nas visões V$HM_RUN, V$HM_FINDING e na V$HM_RECOMMENDATION.
      O Oracle Enterprise Manager permite utilizar o “Health Monitor”. 

Abaixo é apresentada a saída da verificação, utilizando a função DBMS_HM.GET_RUN_REPORT. 

SQL> SET LONG 100000
SET LONGCHUNKSIZE 1000
SET PAGESIZE 1000
SET LINESIZE 512
SELECT DBMS_HM.get_run_report('TESTE_VERIF') FROM dual;

DBMS_HM.GET_RUN_REPORT('TESTE_VERIF')
------------------------------------------------------------------
Basic Run Information
 Run Name                     : TESTE_VERIF
 Run Id                       : 1
 Check Name                   : DB Structure Integrity Check
 Mode                         : MANUAL
 Status                       : COMPLETED
 Start Time                   : 2013-11-19 10:02:10.037605 -02:00
 End Time                     : 2013-11-19 10:02:10.228833 -02:00
 Error Encountered            : 0
 Source Incident Id           : 0
 Number of Incidents Created  : 0

Input Paramters for the Run
Run Findings And Recommendations

Para esse exemplo não foram encontrados problemas na base de dados, porém abaixo segue um exemplo de onde foi encontrado um problema.

SQL> SET LONG 100000
SET LONGCHUNKSIZE 1000
SET PAGESIZE 1000
SET LINESIZE 512
SELECT DBMS_HM.get_run_report('TESTE_VERIF_2') FROM dual;

DBMS_HM.GET_RUN_REPORT('TESTE_VERIF_2')
------------------------------------------------------------------------------
Basic Run Information
 Run Name                     : teste_verif_2
 Run Id                       : 2
 Check Name                   : DB Structure Integrity Check
 Mode                         : MANUAL
 Status                       : COMPLETED
 Start Time                   : 2013-11-19 10:02:10.037605 -02:00
 End Time                     : 2013-11-19 10:02:10.228833 -02:00
 Error Encountered            : 0
 Source Incident Id           : 0
 Number of Incidents Created  : 0

Input Paramters for the Run
Run Findings And Recommendations
 Finding
 Finding Name  : Corrupt Datafile
 Finding ID    : 334
 Type          : FAILURE
 Status        : OPEN
 Priority      : HIGH
 Message       : Datafile 10: '/app/oracle/oradata/test01.dbf' is corrupt
 Message       : Some objects in tablespace TEST might be unavailable

Para o exemplo acima será necessário corrigir a corrupção do “datafile” da tablespace TESTE.

Concluímos portanto que o “Health Monitor” dá mais um mecanismo para o DBA garantir o pleno funcionamento do banco de dados.


Referências: Oracle® Database Administrator´s Guide 11gR2 (11.2)
        Oracle® Database PL/SQL Packages and Types Reference 11gR2 (11.2)




MSc. Rubens Oliveira
DBA Oracle Consultor