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

segunda-feira, 18 de novembro de 2013

Recriando o repositório do AWR manualmente


O repositório do AWR (Automatic Workload Repository) é gerado automaticamente durante a criação do banco de dados, porém algumas vezes o DBA pode ter a necessidade de recriá-lo, neste artigo a demonstraremos os passos necessários.

 

1.   Conectar-se no SQL*Plus

 

$ sqlplus / as sysdba

 

SQL*Plus: Release 11.2.0.1.0 Production on Mon Nov 4 10:43:53 2013

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

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

Data Mining and Real Application Testing options

 

SQL>

 

2.   Verificar os seguintes parâmetros (cluster_database, statistics_level, sga_target),

 

SQL> show parameter cluster_database;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cluster_database                     boolean     TRUE
cluster_database_instances           integer     2

SQL> show parameter statistics_level

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
statistics_level                     string      TYPICAL

SQL> show parameter sga_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 8000M


Importante: Caso os valores sejam diferentes dos apresentados acima, deve-se alterar para os valores propostos para que o AWR funcione corretamente.

3.   “Restartar” o banco de dados em modo restrito.

SQL> shutdown immediate;

Database closed.
Database dismounted.
ORACLE instance shutdown.

SQL> startup restrict;

ORACLE instance started.

4.   Para remover o catálogo do AWR executar o script abaixo:

SQL> @$ORACLE_HOME/rdbms/admin/catnoawr.sql

5.   Para recriar o catálogo do AWR executar.

SQL> alter system flush shared_pool;

System altered.

SQL> @$ORACLE_HOME/rdbms/admin/catawrtb.sql
SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql
SQL> @$ORACLE_HOME/rdbms/admin/execsvrm.sql

6.   “Restartar” o banco de dados.

SQL> shutdown immediate;

Database closed.
Database dismounted.
ORACLE instance shutdown.

SQL> startup;

ORACLE instance started.

7.   Verificar objetos inválidos no banco de dados, caso você encontre deve-se recompilar os objetos.

SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql

8.   Verificar os “status” dos componentes do banco de dados, executar a consulta abaixo:

SQL> SET PAGESIZE 500
SQL> SET LINESIZE 100
SQL> SELECT SUBSTR(COMP_NAME,1,40) COMP_NAME, STATUS, SUBSTR(VERSION,1,10) VERSION
 FROM DBA_REGISTRY
ORDER BY COMP_NAME;

COMP_NAME                                STATUS      VERSION
---------------------------------------- ----------- ----------
JServer JAVA Virtual Machine             VALID       11.2.0.1.0
Oracle Database Catalog Views            VALID       11.2.0.1.0
Oracle Database Java Packages            VALID       11.2.0.1.0
Oracle Database Packages and Types       VALID       11.2.0.1.0
Oracle Enterprise Manager                VALID       11.2.0.1.0
Oracle Expression Filter                 VALID       11.2.0.1.0
Oracle Real Application Clusters         VALID       11.2.0.1.0
Oracle Rules Manager                     VALID       11.2.0.1.0
Oracle Text                              VALID       11.2.0.1.0
Oracle Workspace Manager                 VALID       11.2.0.1.0
Oracle XDK                               VALID       11.2.0.1.0
Oracle XML Database                      VALID       11.2.0.1.0

12 rows selected. 

SQL> SELECT SUBSTR(OBJECT_NAME,1,40) OBJECT_NAME, SUBSTR(OWNER,1,15) OWNER,OBJECT_TYPE
  FROM DBA_OBJECTS
 WHERE STATUS='INVALID'
 ORDER BY OWNER, OBJECT_TYPE;

no rows selected 

SQL> SELECT OWNER,OBJECT_TYPE,COUNT(*)
  FROM DBA_OBJECTS
 WHERE STATUS='INVALID'
 GROUP BY OWNER,OBJECT_TYPE
 ORDER BY OWNER,OBJECT_TYPE;

no rows selected

Importante: Caso algum componente ou objeto esteja inválido no banco de dados, deve-se providenciar a validação para o funcionamento adequado do AWR.

9.   Gerar o primeiro “snapshot” no AWR, usar:

SQL> exec dbms_workload_repository.create_snapshot;

PL/SQL procedure successfully completed.

Com o primeiro “snapshot” as tabelas do AWR irão armazenar as estatísticas do banco de dados.

10. Verificar a periodicidade de atualização do AWR, executar a consulta abaixo:

SQL> SET LINES 200
SQL> COL SNAP_INTERVAL FOR A20
SQL> COL RETENTION     FOR A20
SQL>
SQL> SELECT * FROM DBA_HIST_WR_CONTROL;

      DBID SNAP_INTERVAL        RETENTION            TOPNSQL
---------- -------------------- -------------------- ----------
9999000001 +00000 01:00:00.0    +00020 00:00:00.0    DEFAULT

O resultado da consulta mostra que o AWR será executado em intervalos de uma hora e a retenção dos dados é de vinte dias (em vermelho).


Referências: Oracle® Database Performance Tuning Guide 11gR2 (11.2)
                    Oracle® Database Concepts 11gR2 (11.2)




MSc. Rubens Oliveira
DBA Oracle Consultor