sexta-feira, 24 de fevereiro de 2012

Conectando na SGA usando uma conexão SQL*Plus Preliminar

Diversas vezes encontramos ambientes onde o numero de processos permitidos estourou (ORA-00020: maximum number of processes (%s) exceeded), e agora qual a solução? Reiniciar o database ou começar a matar sessões? 

Estas ações muitas vezes podem mascarar o problema ou não serem permitidas pois podem significar mais trabalho.. 

Uma “solução” introduzida na versão 10G é a conexão preliminar, onde permite a conexão diretamente com a SGA sem abrir uma sessão no bando de dados. 

Como não temos nenhuma sessão aberta no database não conseguimos realizar nenhuma consulta pois retorna erro conforme demonstrado abaixo, contudo, atraves da conexão preliminar (sqlplus -prelim) conseguimos executar qualquer comando ORADEBUG, logo, podemos apontar e analisar o que esta causando esta contenção no ambiente seja lock ou qualquer outro fator. 

Abrindo uma conexão preliminar e tentando executar um select (erro):

[oracle@orcl ~]$ sql -prelim / as sysdba
 
SQL*Plus: Release 11.1.0.6.0 - Production on Wed Feb 22 12:18:22 2012
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
SQL> select * from tab;
select * from tab
*
ERROR at line 1:
ORA-01012: not logged on
Process ID: 0
Session ID: 0 Serial number: 0

Outra forma de iniciarmos a conexão preliminar é:

[oracle@orcl ~]$ sql /nolog
 
SQL*Plus: Release 11.1.0.6.0 - Production on Fri Feb 24 13:36:58 2012
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
SQL> set _prelim on
SQL> conn / as sysdba
Prelim connection established

Através do comando ORADEBUG podemos rastrear qualquer processo ou sessão gerando assim um arquivo trace para dentro do diretório configurado no parâmetro background_dump_dest.

[oracle@orcl ~]$ ps -ef| grep -i ora_dbw| grep -v grep
oracle   11749     1  0 13:29 ?        00:00:00 ora_dbw0_orcl11g
[oracle@orcl ~]$
[oracle@orcl ~]$ sql -prelim / as sysdba
 
SQL*Plus: Release 11.1.0.6.0 - Production on Fri Feb 24 13:44:46 2012
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
SQL> oradebug setorapname DBW0
Oracle pid: 10, Unix process pid: 11749, image: oracle@orcl.anderson (DBW0)
SQL> oradebug unlimit;
Statement processed.
SQL> oradebug event 10046 trace name context forever, level 12
Statement processed.
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/orcl11g/orcl11g/trace/orcl11g_dbw0_11749.trc

SQL> !tail -f /u01/app/oracle/diag/rdbms/orcl11g/orcl11g/trace/orcl11g_dbw0_11749.trc
 
*** 2012-02-24 13:46:49.252
Finished processing ORADEBUG command (#6) 'tracefile_name'
WAIT #0: nam='rdbms ipc message' ela= 995049 timeout=300 p2=0 p3=0 obj#=-1 tim=1330102009264004
 
*** 2012-02-24 13:46:51.275
WAIT #0: nam='rdbms ipc message' ela= 2010785 timeout=201 p2=0 p3=0 obj#=-1 tim=1330102011274975
 
*** 2012-02-24 13:46:54.276
WAIT #0: nam='rdbms ipc message' ela= 3001026 timeout=300 p2=0 p3=0 obj#=-1 tim=1330102014276241
 
*** 2012-02-24 13:46:57.277
WAIT #0: nam='rdbms ipc message' ela= 3000305 timeout=300 p2=0 p3=0 obj#=-1 tim=1330102017277006

Um case muito interessante utilizando a conexão preliminar foi publicado pelo Arup Nanda em seu blog, vale a pena conferir! Diagnosing Library Cache Latch Contention: A Real Case Study 

Para obtermos mais detalhes e formas de utilizar o ORADEBUG seguem NOTES relacionadas no Metalink:

How To Connect Using A sql Preliminary Connection [ID 986640.1]

Interpreting HANGANALYZE trace files to diagnose hanging and performance problems [ID 215858.1]

ORA-7445 [kgllkd] With -prelim Option When Running System State Dump [ID 417879.1]
Mais informações →

domingo, 19 de fevereiro de 2012

Personalizando o SQL*Plus / SQL*Plusw

Algo que estamos acostumados a fazer em cada nova conexão atraves do SQL*Plus é ajustar varias definições como linesize, pagesize, tamanho e cabeçalho de colunas entre inúmeras outras possibilidades para que possamos visualizar e trabalhar com as informações da melhor forma possível.

SQL> set linesize 200
SQL> set pagesize 60
SQL> col name for a40 heading nome
SQL> ....

Mas você já pensou em ajustar o SQL*Plus para carregar estas definições personalizadas sempre que for aberto de forma automática? Ainda não?.. 

Então vamos conferir mais esta dica. 

Dentro do $ORACLE_HOME/sqlplus/admin possuímos o arquivo glogin.sql onde podemos especificar as definições e comandos a serem executados automaticamente quando o SQL*plus for aberto, vejamos: 

Vamos conectar no sqplus e verificar como estão definidos a linesize e pagesize atualmente.

maquina-de-teste > sqlplus / as sysdba
 
SQL*Plus: Release 11.2.0.1.0 Production on Tue Feb 14 15:49:54 2012
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL> show linesize
linesize 80
SQL> show pagesize
pagesize 14

OBS: Podemos também verificar todos os comandos definidos atraves do “show all”

Agora vamos editar o arquivo glogin.sql e definir novos valores adicionando a linhas “set linesize 200, set pagesize 60 e set time on”:

maquina-de-teste > vi glogin.sql
--
-- Copyright (c) 1988, 2005, Oracle.  All Rights Reserved.
--
-- NAME
--   glogin.sql
--
-- DESCRIPTION
--   SQL*Plus global login "site profile" file
--
--   Add any SQL*Plus commands here that are to be executed when a
--   user starts SQL*Plus, or uses the SQL*Plus CONNECT command.
--
-- USAGE
--   This script is automatically run
--
set linesize 200
set pagesize 60
set time on
~
: x
maquina-de-teste >

Vamos reconectar no SQL*Plus e verificar como ficou:

maquina-de-teste > sqlplus / as sysdba
 
SQL*Plus: Release 11.2.0.1.0 Production on Tue Feb 14 15:55:41 2012
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
15:55:41 SQL> show linesize
linesize 200
15:56:07 SQL> show pagesize
pagesize 60
15:56:11 SQL>

Observe que agora o linesize e pagesize foram ajustados automaticamente assim como tambem temos o horário antes do SQL> 

Algo bem interessante de ser configurado é de export na tela o nome do usuário conectado e SID (ORACLE_SID) para que não venhamos a cometer erros na base de dados errada… 

OBS: Este parâmetro é para a versão 10G ou superior.

maquina-de-teste > vi glogin.sql
--
-- Copyright (c) 1988, 2005, Oracle.  All Rights Reserved.
--
-- NAME
--   glogin.sql
--
-- DESCRIPTION
--   SQL*Plus global login "site profile" file
--
--   Add any SQL*Plus commands here that are to be executed when a
--   user starts SQL*Plus, or uses the SQL*Plus CONNECT command.
--
-- USAGE
--   This script is automatically run
--
SET sqlprompt '&_user:&_connect_identifier > '
~
: x
maquina-de-teste >

..

maquina-de-teste > sqlplus / as sysdba
 
SQL*Plus: Release 11.2.0.1.0 Production on Tue Feb 14 16:13:32 2012
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SYS:teste >
Mais informações →

Uso e gerenciamento dos ocupantes da SYXAUX

Hoje verificando um database 11GR2 constatei que a tablespace SYSAUX estava ocupando cerca de 17GB, mas porque? Quem está utilizando este espaço? 

Creio que a resposta que veio a sua cabeça é AWR! É sempre ele o culpado?… 

Vamos dar inicio identificando quem são os ocupantes da tablespace SYSAUX que mais consomem espaço, para isto vamos utilizar a view v$sysaux_occupants

SQL> set linesize 120
SQL> set pagesize 100
SQL> COLUMN "Item" FORMAT A25
SQL> COLUMN "Space Used (GB)" FORMAT 999.99
SQL> COLUMN "Schema" FORMAT A25
SQL> COLUMN "Move Procedure" FORMAT A40
SQL>
SQL> SELECT  occupant_name "Item",
  2  space_usage_kbytes/1048576 "Space Used (GB)",
  3  schema_name "Schema"
  4  FROM v$sysaux_occupants
  5  ORDER BY 1
  6  /
 
Item                      Space Used (GB) Schema
------------------------- --------------- -------------------------
AO                                    .00 SYS
AUDIT_TABLES                          .00 SYS
AUTO_TASK                             .00 SYS
EM                                    .50 SYSMAN
EM_MONITORING_USER                    .00 DBSNMP
EXPRESSION_FILTER                     .00 EXFSYS
JOB_SCHEDULER                         .00 SYS
LOGMNR                                .01 SYSTEM
LOGSTDBY                              .00 SYSTEM
ORDIM                                 .00 ORDSYS
ORDIM/ORDDATA                         .00 ORDDATA
ORDIM/ORDPLUGINS                      .00 ORDPLUGINS
ORDIM/SI_INFORMTN_SCHEMA              .00 SI_INFORMTN_SCHEMA
PL/SCOPE                              .00 SYS
SDO                                   .00 MDSYS
SM/ADVISOR                            .10 SYS
SM/AWR                               9.44 SYS
SM/OPTSTAT                           5.86 SYS
SM/OTHER                              .01 SYS
SMON_SCN_TIME                         .00 SYS
SQL_MANAGEMENT_BASE                   .00 SYS
STATSPACK                             .00 PERFSTAT
STREAMS                               .00 SYS
TEXT                                  .00 CTXSYS
TSM                                   .00 TSMSYS
ULTRASEARCH                           .00 WKSYS
ULTRASEARCH_DEMO_USER                 .00 WK_TEST
WM                                    .01 WMSYS
XDB                                   .06 XDB
XSAMD                                 .00 OLAPSYS
XSOQHIST                              .00 SYS
 
31 rows selected.

Observe que temos 2 “ocupantes” que consomem bastante espaço, o SM/AWR e o SM/OPTSTAT. 

Antes de prosseguirmos vamos lembrar que na versão 10.2.0.3 existe um BUG com a limpeza do AWR (Bug 6522103 : WRH$_SQL_PLAN AND WRH$_SQLTEXT ARE NOT PURGED WHEN PURGING AWR SNAPSHOTS), nas demais versões este BUG já foi reparado! 

Prosseguindo.. vamos entender quem são estes ocupantes e como podemos limpar estes espaços:

SM/OPTSTAT: 

Armazena versões mais velhas do otimizador de estatísticas, a partir do 10G ele permite que seja restaurada as estatísticas caso seja encontrada alguma agressão com o novo plano quando as estatísticas são atualizadas. 

Sua retenção default(padrão) é 31 dias, vale lembrar que ele não faz parte do AWR e portanto não é controlado pelo parâmetro de retenção do AWR como veremos mais a frente. 

Identificando o tempo de retenção atual:

SQL> select dbms_stats.get_stats_history_retention from dual;
 
GET_STATS_HISTORY_RETENTION
---------------------------
                         31

Agora vamos ajustar a retenção para apenas 10 dias e remover as estatisticas mais antigas que 10 dias (fazer em etapas reduzindo gradativamente a quantidade de dias, 30,25,20..):

SQL> exec dbms_stats.alter_stats_history_retention(5);
 
SQL> exec DBMS_STATS.PURGE_STATS(SYSDATE-5);
 
PL/SQL procedure successfully completed.

NOTA:Este processo consome muito recurso do database/servidor e deve ser executado fora do horário de "pico"/workload elevada (demorado…)

SM/AWR: 

O Automatic Workload Repository conhecido basicamente por AWR é uma feature introduzida no Oracle 10G que em intervalos regulares gera um snapshot(foto) de todas as estatisticas e informações vitais do database para o repositório de carga de trabalho, AWR com o objetivo de permitir análise e investigações de momentos passados o atuais. 

Vamos verificar o intervalo de snapshot e retenção:

SQL> set lines 190
SQL> col SNAP_INTERVAL for a40
SQL> col RETENTION for a40
SQL> select * from dba_hist_wr_control;
 
      DBID SNAP_INTERVAL                            RETENTION                                TOPNSQL
---------- ---------------------------------------- ---------------------------------------- ----------
 847901981 +00000 01:00:00.0                        +00008 00:00:00.0                        DEFAULT

Temos 8 dias de retenção e um intervalo de coleta a cada 1 hora, vamos diminuir esta retenção visto que não é necessário esta quantidade de dias de armazenamento. A retenção do AWR de cada database deve ser analisada conforme sua necessidade. 

Alterando a retenção X intervalo:

interval = minutes
retention = seconds ( 60*24*3 dias)

SQL> exec dbms_workload_repository.modify_snapshot_settings ( interval => 60, retention => 4320);
 
PL/SQL procedure successfully completed.

Após o ajuste de retenção do AWR basta aguardarmos o database realizar o gerenciamento conforme novas políticas implementadas removendo assim os snpahosts antigos.

Dia seguinte..Confirmando se os snaphosts já estão conforme retenção ajustada:

SQL> set lines 190
SQL> select snap_id, begin_interval_time, end_interval_time from dba_hist_snapshot order by 1;
 
   SNAP_ID BEGIN_INTERVAL_TIME                                                         END_INTERVAL_TIME
---------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
      7038 07-FEB-12 02.00.15.335 AM                                                   07-FEB-12 03.00.02.927 AM
      7038 07-FEB-12 02.00.15.434 AM                                                   07-FEB-12 03.00.03.023 AM
      7039 07-FEB-12 03.00.02.927 AM                                                   07-FEB-12 04.00.56.232 AM
      7039 07-FEB-12 03.00.03.023 AM                                                   07-FEB-12 04.00.56.351 AM
 
...
   SNAP_ID BEGIN_INTERVAL_TIME                                                         END_INTERVAL_TIME
---------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
      7117 10-FEB-12 08.00.00.169 AM                                                   10-FEB-12 09.00.07.137 AM
      7118 10-FEB-12 09.00.07.137 AM                                                   10-FEB-12 10.00.04.696 AM
      7118 10-FEB-12 09.00.07.170 AM                                                   10-FEB-12 10.00.04.835 AM

Feito estas duas atividades sobre o AWR e OPTSTAT basta realizarmos um move e rebuild das tabelas e indices da SYSAUX que agora apresentam fragmentação devido as remoções ocorridas. 

Para verificar a fragmentação/objetos fragmentados devemos executar um segment advisor utilizando o Enterprise Manager ou via SQL conforme artigo – Segment Advisor via SQL

Agora vejamos como ficou os ocupantes da tablespace SYSAUX: Observem que liberamos praticamente 13GB de espaço.

SQL> set linesize 120
SQL> set pagesize 100
SQL> COLUMN "Item" FORMAT A25
SQL> COLUMN "Space Used (GB)" FORMAT 999.99
SQL> COLUMN "Schema" FORMAT A25
SQL> COLUMN "Move Procedure" FORMAT A40
SQL>
SQL> SELECT  occupant_name "Item",
  2  space_usage_kbytes/1048576 "Space Used (GB)",
  3  schema_name "Schema"
  4  FROM v$sysaux_occupants
  5  ORDER BY 1;
 
Item                      Space Used (GB) Schema
------------------------- --------------- -------------------------
AO                                    .00 SYS
AUDIT_TABLES                          .00 SYS
AUTO_TASK                             .00 SYS
EM                                    .50 SYSMAN
EM_MONITORING_USER                    .00 DBSNMP
EXPRESSION_FILTER                     .00 EXFSYS
JOB_SCHEDULER                         .00 SYS
LOGMNR                                .01 SYSTEM
LOGSTDBY                              .00 SYSTEM
ORDIM                                 .00 ORDSYS
ORDIM/ORDDATA                         .00 ORDDATA
ORDIM/ORDPLUGINS                      .00 ORDPLUGINS
ORDIM/SI_INFORMTN_SCHEMA              .00 SI_INFORMTN_SCHEMA
PL/SCOPE                              .00 SYS
SDO                                   .00 MDSYS
SM/ADVISOR                            .10 SYS
SM/AWR                               2.40 SYS
SM/OPTSTAT                            .21 SYS
SM/OTHER                              .01 SYS
SMON_SCN_TIME                         .00 SYS
SQL_MANAGEMENT_BASE                   .00 SYS
STATSPACK                             .00 PERFSTAT
STREAMS                               .00 SYS
TEXT                                  .00 CTXSYS
TSM                                   .00 TSMSYS
ULTRASEARCH                           .00 WKSYS
ULTRASEARCH_DEMO_USER                 .00 WK_TEST
WM                                    .01 WMSYS
XDB                                   .06 XDB
XSAMD                                 .00 OLAPSYS
XSOQHIST                              .00 SYS
 
31 rows selected.

Outras informações sobre o gerenciamento de espaço na SYSAUX podem ser encontrados no MOS (My Oracle Support):

Usage and Storage Management of SYSAUX tablespace occupants SM/AWR, SM/ADVISOR, SM/OPTSTAT and SM/OTHER [ID 329984.1]
Mais informações →

Escrevendo no Alert log

O arquivo de log de alerta do Oracle conhecido basicamente por alert.log é um log de mensagens e erros escritos pelo banco de dados que registra informações como desligamento e inicialização do banco, alterações de parâmetros, erros/alertas, entre outros. 

Como sabemos este arquivo deve ser constantemente monitorado para detectar mensagens de alertas e erros, mas como podemos testar se nosso monitoramento esta realmente funcionando sem gerar um erro ou esperar que um aconteça? 

Pois bem, a Oracle oferece uma package para podermos “escrever” no alertlog e arquivos de trace, vejamos: 

O primeiro valor informado na chamada tem como objetivo:

1 – Gravar o erro em um arquivo de trace (trace file);
2 – Gravar o erro no alertlog;
3 – Gravar o erro no alertlog e em um arquivo trace.

O segundo é a mensagem ou texto a ser escrito:

SQL> EXEC SYS.DBMS_SYSTEM.KSDWRT(2,'ORA-00600: TESTE ANDERSON');
 
PL/SQL procedure successfully completed.
 
SQL> EXEC SYS.DBMS_SYSTEM.KSDWRT(2,'ORA-00600: internal error code, arguments: [ANDERSON], [12345], [], [], [], [], []');
 
PL/SQL procedure successfully completed.

Verificando o alert log podemos constatar que a simulação foi realizada com sucesso.

maquina-de-teste > tail -n 10 alert_teste.log
  Current log# 2 seq# 17929 mem# 0: /oraprd01/app/oracle/oradata/teste/redo02a.log
  Current log# 2 seq# 17929 mem# 1: /oraprd02/oradata/teste/redo02b.log
Mon Feb 06 18:08:50 2012
Archived Log entry 26302 added for thread 1 sequence 17928 ID 0x341cf6e dest 1:
Archived Log entry 26303 added for thread 1 sequence 17928 ID 0x341cf6e dest 2:
Mon Feb 06 18:12:19 2012
Mon Feb 06 18:13:36 2012
ORA-00600: TESTE ANDERSON
Mon Feb 06 18:14:34 2012
ORA-00600: internal error code, arguments: [ANDERSON], [12345], [], [], [], [], []

Uma boa prática que podemos adotar é utilizar esta package para registrar o DBID do database no alertlog(via trigger, scheduler, etc..), visto que é fundamental também matermos registrado em outros locais assim como uma copia dos backups pois nunca sabemos quando um desastre pode ocorrer…

SQL> declare
  dbid number;
begin
  select dbid into dbid from v$database;
  dbms_system.ksdwrt(2,'DBID = '||dbid);
end; 
/

PL/SQL procedure successfully completed.

Alert log do banco de dados:

maquina-de-teste > tail -n 10 alert_teste.log
Mon Feb 06 18:08:50 2012
Archived Log entry 26302 added for thread 1 sequence 17928 ID 0x341cf6e dest 1:
Archived Log entry 26303 added for thread 1 sequence 17928 ID 0x341cf6e dest 2:
Mon Feb 06 18:12:19 2012
Mon Feb 06 18:13:36 2012
ORA-00600: TESTE ANDERSON
Mon Feb 06 18:14:34 2012
ORA-00600: internal error code, arguments: [ANDERSON], [12345], [], [], [], [], []
Mon Feb 06 18:22:50 2012
DBID = 54669934
Mais informações →

Erro ORA-39212 durante execução na DBMS_METADATA.GET_DDL


Hoje estava precisando recriar uma tabela na base de dados e para isto fui capturar os metadados da tabela utilizando a package DBMS_METADATA, porém ao executar o comando foi gerado o seguinte erro:

SQL> select dbms_metadata.get_ddl('TABLE','TESTE','ANDERSON') from dual;
ERROR:
ORA-39212: installation error: XSL stylesheets not loaded correctly
ORA-06512: at "SYS.DBMS_METADATA", line 4018
ORA-06512: at "SYS.DBMS_METADATA", line 5843
ORA-06512: at line 1

Buscando maiores informações no Metalink econtrei a NOTE ID 1316223.1 que oferece a solução para o problema causado por um mal carregamento da XSL stylesheets na base de dados.

Basta carregarmos novamente o stylesheets na base de dados, como SYSDBA.

[oracle@orcl ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 11.1.0.6.0 - Production on Thu Jan 5 16:55:41 2012
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
 
Conectado a:
Oracle Database 11g Release 11.1.0.6.0 - Production
 
SQL> exec dbms_metadata_util.load_stylesheets;
 
PL/SQL procedure successfully completed.

Pronto! XSL stylesheets carregado com sucesso, vamos tentar novamente:

SQL> set lines 190
SQL> set long 20000
SQL> select dbms_metadata.get_ddl('TABLE','TESTE','ANDERSON') from dual;
 
DBMS_METADATA.GET_DDL('TABLE','TESTE','ANDERSON')
--------------------------------------------------------------------------------
 
  CREATE TABLE "ANDERSON"."TESTE"
   (    "COD" NUMBER(2,0),
        "VAL" VARCHAR2(10)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "TESTES"
Mais informações →

Implementando e utilizando o PL/SQL Profiler

O Oracle Profiler é uma feature presente desde a versão 8i e através de sua utilização é possível verificar quais os objetos do banco de dados foram invocados e o tempo de duração de cada um durante a execução de um objeto PL/SQL. 

O Profiler é um recurso muito útil quando necessitamos realizar uma análise de desempenho, pois conseguimos analisar todos os processos que estão sendo executados em paralelo ao processo principal. 

Vamos descobrir mais deste ótimo recurso? 

Primeiramente vamos criar a estrutura necessária para o Oracle Profiler através da exeução de dois srcipts que estão em $ORACLE_HOME/rdbms/admin, observe que utilizamos o “?” apos o "@" pois representa o ORACLE_HOME.

SQL> @?/rdbms/admin/profload.sql
Pacote criado.
Concess?o bem-sucedida.
Sinonimo criado.
Biblioteca criada.
Corpo de Pacote criado.
Testing for correct installation
SYS.DBMS_PROFILER successfully loaded.
Procedimento PL/SQL concluido com sucesso.

segundo script a ser executado:

SQL> @?/rdbms/admin/proftab.sql
drop table plsql_profiler_data cascade constraints
           *
ERRO na linha 1:
ORA-00942: a tabela ou view n?o existe
drop table plsql_profiler_units cascade constraints
           *
ERRO na linha 1:
ORA-00942: a tabela ou view n?o existe
drop table plsql_profiler_runs cascade constraints
           *
ERRO na linha 1:
ORA-00942: a tabela ou view n?o existe
drop sequence plsql_profiler_runnumber
              *
ERRO na linha 1:
ORA-02289: a sequencia n?o existe
Tabela criada.
Comentario criado.
Tabela criada.
Comentario criado.
Tabela criada.
Comentario criado.
Sequencia criada.

Observe que no segundo script houve alguns erros na remoção dos objetos pelo fato destes ainda não existirem na nossa base de dados e que podem ser ignorados. 

Agora que já realizamos a implementação desta feature, vamos testar sua utilização primeiramente criando alguns objetos que servirão de apoio ao exemplo.

SQL> create table funcionario(cod number, nome varchar2(50));

Tabela criada.

SQL> create table empresa (cod number, fantasia varchar(100));

Tabela criada.

SQL> begin
        for x in 1..100 loop
                insert into funcionario values (x,'FUNCIONARIO '||x);
                DBMS_OUTPUT.put_line('Funcionario '||x||' cadastrado');
        end loop;
end;
/
Procedimento PL/SQL concluido com sucesso.

SQL> create or replace procedure insert_emp is
begin
        insert into empresa values (1,'ORACLE HOME');
        DBMS_OUTPUT.put_line('Empresa cadastrada');
end;
/
Procedimento criado.

SQL> create or replace procedure cadastrar is
begin
        insert_emp;
        insert_func;
end;
/

Procedimento criado.

Para iniciarmos e interrompermos a coleta basta executarmos os seguintes comandos antes e após a execução da nossa procedure. 

DBMS_PROFILER.START_PROFILER(‘qualquer comentário para identificar esta execução’); 
… 
DBMS_PROFILER.STOP_PROFILER; 

Vejamos,

SQL> execute DBMS_PROFILER.START_PROFILER('Exemplo Profiler Oracle Home');
Procedimento PL/SQL concluido com sucesso.
SQL> execute SYS.cadastrar;
Procedimento PL/SQL concluido com sucesso.
SQL> execute DBMS_PROFILER.STOP_PROFILER;
Procedimento PL/SQL concluido com sucesso.

O Profiler populou três tabelas com informações relacionadas.

PLSQL_PROFILER_RUNS contém as informações sobre cada vez que o profiler foi iniciado, incluindo o comentário passado na execução para identificação. 
PLSQL_PROFILE_UNITS contém informações sobre o código PL/SQL executado. Cada procedimento, função, pacote terá sua própria linha nesta tabela. 
PLSQL_PROFILE_DATA contém as linhas do código executado, o tempo de execução do código, entre outros. 

Primeiramente vamos identificar o RUNID da nossa execução:

SQL> set lines 190
SQL> col RUN_COMMENT for a70
SQL> select runid, run_owner, run_date, run_comment from plsql_profiler_runs;
     RUNID RUN_OWNER                        RUN_DATE RUN_COMMENT
---------- -------------------------------- -------- ----------------------------------------------------------------------
         2 SYS                              19/12/11 Exemplo Profiler Oracle Home

Realizando um select na plsql_profiler_units especificando o RUNID da coleta desejada podemos identificar varias outras informações como objetos envolvidos, tipo do objeto e o UNIT_NUMBER, a partir do qual será possível aprofundar a análise.

SQL> select runid, unit_number, unit_type, unit_owner, unit_name, unit_timestamp
  2  from plsql_profiler_units
  3  where runid = &runid
  4  order by unit_number;
Informe o valor para runid: 2
antigo   3: where runid = &runid
novo   3: where runid = 2
     RUNID UNIT_NUMBER UNIT_TYPE                        UNIT_OWNER                       UNIT_NAME                        UNIT_TIM
---------- ----------- -------------------------------- -------------------------------- -------------------------------- --------
         2           1 PACKAGE BODY                     SYS                              DBMS_PROFILER                    03/08/07
         2           2 ANONYMOUS BLOCK                                                              00/00/00
         2           3 ANONYMOUS BLOCK                                                              00/00/00
         2           4 PROCEDURE                        SYS                              CADASTRAR                        19/12/11
         2           5 PROCEDURE                        SYS                              INSERT_EMP                       19/12/11
         2           6 PACKAGE BODY                     SYS                              DBMS_OUTPUT                      03/08/07
         2           7 PROCEDURE                        SYS                              INSERT_FUNC                      19/12/11
         2           8 ANONYMOUS BLOCK                                                              00/00/00
8 linhas selecionadas.

Note que nem todos os registro retornados nos interessam como os de UNIT_OWNER = , estes podem ser removidos da consulta ( AND UNIT_OWNER ” ). Para iniciarmos a análise, partimos da procedure que executamos no início das atividades (UNIT_NUMBER=4) – (RUNID=2).

SQL> set lines 190
SQL> col TEXT for a70
SQL> select pu.unit_name, pd.line#, pd.total_occur passes, round(pd.total_time / 1000000000,5) total_time, us.text text
  2  from plsql_profiler_data pd, plsql_profiler_units pu, user_source us
  3  where pd.runid = &runid
  4  and pd.unit_number = &unit_number
  5  and pd.runid = pu.runid
  6  and pd.unit_number = pu.unit_number
  7  and us.name = pu.unit_name
  8  and us.line = pd.line#
  9  and us.type in ('PACKAGE BODY','PROCEDURE','FUNCTION');
Informe o valor para runid: 2
antigo   3: where pd.runid = &runid
novo   3: where pd.runid = 2
Informe o valor para unit_number: 4
antigo   4: and pd.unit_number = &unit_number
novo   4: and pd.unit_number = 4
UNIT_NAME                             LINE#     PASSES TOTAL_TIME TEXT
-------------------------------- ---------- ---------- ---------- ----------------------------------------------------------------------
CADASTRAR                                 1          0          0 procedure cadastrar is
CADASTRAR                                 5          2     ,00001       insert_emp;
CADASTRAR                                 6          2     ,00004       insert_func;
CADASTRAR                                 8          1          0 end;

Podemos verificar que a procedure CADASTRAR chama 2 novas procedures, já listadas na consulta acima, incluindo o tempo de execução destas onde temos a INSERT_FUNC como mais demorada ,00004 Agora analisando a procedure mais custosa (INSERT_FUNC), cujo UNIT_NUMBER é 7 podemos identificar a causa desta demora e partirmos em busca de uma solução.

SQL> select pu.unit_name, pd.line#, pd.total_occur passes, round(pd.total_time / 1000000000,5) total_time, us.text text
  2  from plsql_profiler_data pd, plsql_profiler_units pu, user_source us
  3  where pd.runid = &runid
  4  and pd.unit_number = &unit_number
  5  and pd.runid = pu.runid
  6  and pd.unit_number = pu.unit_number
  7  and us.name = pu.unit_name
  8  and us.line = pd.line#
  9  and us.type in ('PACKAGE BODY','PROCEDURE','FUNCTION');
Informe o valor para runid: 2
antigo   3: where pd.runid = &runid
novo   3: where pd.runid = 2
Informe o valor para unit_number: 7
antigo   4: and pd.unit_number = &unit_number
novo   4: and pd.unit_number = 7
UNIT_NAME                             LINE#     PASSES TOTAL_TIME TEXT
-------------------------------- ---------- ---------- ---------- ----------------------------------------------------------------------
INSERT_FUNC                               1          0          0 procedure insert_func is
INSERT_FUNC                               5        101     ,00026       for x in 1..100 loop
INSERT_FUNC                               6        100     ,01423               insert into funcionario values (x,'FUNCIONARIO '||x);
INSERT_FUNC                               7        100     ,00084               DBMS_OUTPUT.put_line('Funcionario '||x||' cadastrado');
INSERT_FUNC                              10          1          0 end;

Para efetuarmos a limpeza das tabelas do profiler basta executarmos:

SQL> delete from plsql_profiler_data;
234 linhas deletadas.
SQL> delete from plsql_profiler_units;
8 linhas deletadas.
SQL> delete from plsql_profiler_runs;
1 linha deletada.
SQL> commit;
Commit concluido.
Mais informações →

Instalando o Oracle Text – 10/11g

O Oracle Text, nem sempre conhecido por este nome, é uma feature existente desde a versão 8/8i e chamada ate então como Oracle Intermedia ou Oracle Context, após o lançamento da versão 9i este passou a ser chamado de Oracle Text e assegura este nome até a atual versão 11g. 

Esta feature utiliza a linguagem SQL para indexar, pesquisar e analisar textos ou documentos armazenados no banco de dados, tornando-se indispensável para quem busca uma solução que permita filtrar e extrair dados de diferentes formatos de arquivos, incluindo os mais populares como documentos do Microsoft Office, PDF, HTML, XML entre muitos outros. 

Agora que já conhecemos um pouco sobre esta feature, vamos aprender a instalar O Oracle Text. Lembrando que você também pode instalar o Oracle Text quando está instalando o produto Oracle(imagem abaixo). 


Vamos identificar o que temos instalado. Notem que o Oracle Text não está!

SQL> set lines 200
SQL> col Component for a70
SQL> select comp_name "Component", status from dba_registry;
 
Component                                                              STATUS
---------------------------------------------------------------------- ----------
Oracle XML Database                                                    VALID
OWB                                                                    VALID
Oracle Application Express                                             VALID
Oracle Enterprise Manager                                              VALID
OLAP Catalog                                                           VALID
Spatial                                                                VALID
Oracle Multimedia                                                      VALID
Oracle Expression Filter                                               VALID
Oracle Rules Manager                                                   VALID
Oracle Workspace Manager                                               VALID
 
Component                                                              STATUS
---------------------------------------------------------------------- ----------
Oracle Database Catalog Views                                          VALID
Oracle Database Packages and Types                                     VALID
JServer JAVA Virtual Machine                                           VALID
Oracle XDK                                                             VALID
Oracle Database Java Packages                                          VALID
OLAP Analytic Workspace                                                VALID
Oracle OLAP API                                                        VALID
 
17 rows selected.

Agora iremos executar dois scripts fornecidos pela Oracle e que estão localizados dentro do $ORACLE_HOME/rdbms/admin. (Devem ser executados na sequencia apresentada) 

O primeiro script, catctx.sql deve ser executado como SYSDBA e é responsável por criar os objetos e o schema CTXSYS necessários para o Oracle Text, na sua execução devemos fornecer alguns parâmetros conforme vemos abaixo: 

SYNTAXE: 

SQL> @?/ctx/admin/catctx.sql A B C D

A = Senha da conta CTXSYS que será criada
B = Default tablespace para o CTXSYS
C = Tablespace temporária para o CTXSYS
D = Se a conta deve ficar bloqueada ou não (LOCK|NOLOCK)

Execução:

SQL> conn / as sysdba
Connected.
SQL> @?/ctx/admin/catctx.sql pwdtext SYSAUX TEMP NOLOCK
 
SQL> ...
SQL> ...
SQL> ...

O segundo script, dr0defin.sql deve ser executado com o usuário CTXSYS pois irá definir o idioma padrão a ser utilizado pelo Oracle Text, devemos passar como parâmetro a languague desejada.No exemplo abaixo passamos o padrão americano porem o Oracle Text ainda suporta outras languages, como Inglês (EUA), Dinamarquês (DK), Holandês (NL), Finlandês (SF), Francês (F), Alemão (D), Italiano (IT), Português (PT), Espanhol (E) e Sueco (S).

SQL> conn ctxsys/pwdtext
Connected.
SQL> @?/ctx/admin/defaults/dr0defin.sql "AMERICAN";
old   1: SELECT DECODE('&nls_language',
new   1: SELECT DECODE('AMERICAN',
 
LA
--
us
 
Creating lexer preference...
 
PL/SQL procedure successfully completed.
 
Creating wordlist preference...
 
PL/SQL procedure successfully completed.
 
Creating stoplist...
 
PL/SQL procedure successfully completed.
 
 
PL/SQL procedure successfully completed.
 
Creating default policy...
 
PL/SQL procedure successfully completed.

Definida a linguagem preferencial, vamos bloquear a conta do CTXSYS como medida de segurança.

SQL> conn / as sysdba
Connected.
SQL> alter user ctxsys account lock password expire;
 
User altered.

Agora vamos verificar se o Oracle Text está instalado e Válido:

SQL> set lines 200
SQL> col Component for a70
SQL> select comp_name "Component", status from dba_registry;
 
Component                                                              STATUS
---------------------------------------------------------------------- ----------
Oracle Text                                                            VALID
Oracle XML Database                                                    VALID
OWB                                                                    VALID
Oracle Application Express                                             VALID
Oracle Enterprise Manager                                              VALID
OLAP Catalog                                                           VALID
Spatial                                                                VALID
Oracle Multimedia                                                      VALID
Oracle Expression Filter                                               VALID
Oracle Rules Manager                                                   VALID
Oracle Workspace Manager                                               VALID
 
Component                                                              STATUS
---------------------------------------------------------------------- ----------
Oracle Database Catalog Views                                          VALID
Oracle Database Packages and Types                                     VALID
JServer JAVA Virtual Machine                                           VALID
Oracle XDK                                                             VALID
Oracle Database Java Packages                                          VALID
OLAP Analytic Workspace                                                VALID
Oracle OLAP API                                                        VALID
 
18 rows selected.

Caso seja necessário desinstalar o mesmo basta seguir os passos abaixo, !! lembrando que isto pode provocar a invalidação de vários objetos dependentes !!

SQL> connect SYS/password as SYSDBA
SQL> @?/ctx/admin/catnoctx.sql
SQL> drop procedure sys.validate_context;
Mais informações →

Objetos do SYS inválidos após remoção do XMLDB 11g

Como já abordado em outro artigo Instalando o Oracle XML DB 11g, a remoção do Oracle XMLDB é simples, basta executarmos o script catnoqm fornecido pela própria Oracle e pronto. 

Contudo, podemos observar que após sua desinstalação varios objetos do SYS se tornam inválidos no 11.2.0.1 e 11.2.0.2, isto em função do BUG 9892139 (já resolvido na versão 11.2.0.3) onde varios objetos do SYS são marcados como inválidos devido dependencias perdidas com o XDB. 

Para podermos reparar estes objetos a Oracle disponibilizou alguns scripts que devem ser executados manualmente com o SYS, conforme veremos abaixo:

SQL> set lines 200
SQL> col Component for a70
SQL> select comp_name "Component", status from dba_registry where comp_name like '%XML%';
 
Component                                                              STATUS
---------------------------------------------------------------------- --------------------------------------------
Oracle XML Database                                                    VALID
 
SQL> select owner, count(1) from dba_objects where status <> 'VALID' group by owner;
 
no rows selected

Podemos ver que o XML está instalado e nenhum objeto está inválido, vejamos após executarmos o script para desinstalar o XMLDB.

SQL> @?/rdbms/admin/catnoqm
....
 
SQL> select comp_name "Component", status from dba_registry where comp_name like '%XML%';
 
no rows selected
 
SQL> select owner, count(1) from dba_objects where status <> 'VALID' group by owner;
 
OWNER                            COUNT(1)
------------------------------ ----------
SYS                                    29

Maravilha, XML desinstalado porem ganhamos alguns objetos inválidos…

vamos ver quais são:

SQL> col object_name for a30
SQL> select OWNER, OBJECT_NAME, OBJECT_TYPE from dba_objects where status = 'INVALID';
 
OWNER                          OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SYS                            ALL_XML_SCHEMAS                VIEW
SYS                            ALL_XML_SCHEMAS2               VIEW
SYS                            KU$_XMLSCHEMA_VIEW             VIEW
SYS                            KU$_XMLSCHEMA_ELMT_VIEW        VIEW
SYS                            KU$_OPQTYPE_VIEW               VIEW
SYS                            KU$_COLUMN_VIEW                VIEW
SYS                            KU$_PCOLUMN_VIEW               VIEW
SYS                            KU$_NT_PARENT_VIEW             VIEW
SYS                            KU$_FHTABLE_VIEW               VIEW
SYS                            KU$_10_1_FHTABLE_VIEW          VIEW
SYS                            KU$_PFHTABLE_VIEW              VIEW
 
OWNER                          OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SYS                            KU$_10_1_PFHTABLE_VIEW         VIEW
SYS                            KU$_ACPTABLE_VIEW              VIEW
SYS                            KU$_IOTABLE_VIEW               VIEW
SYS                            KU$_10_1_IOTABLE_VIEW          VIEW
SYS                            KU$_PIOTABLE_VIEW              VIEW
SYS                            KU$_10_1_PIOTABLE_VIEW         VIEW
SYS                            KU$_VIEW_VIEW                  VIEW
SYS                            KU$_M_VIEW_FH_VIEW             VIEW
SYS                            KU$_M_VIEW_PFH_VIEW            VIEW
SYS                            KU$_M_VIEW_IOT_VIEW            VIEW
SYS                            KU$_M_VIEW_PIOT_VIEW           VIEW
 
OWNER                          OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SYS                            KU$_M_VIEW_LOG_FH_VIEW         VIEW
SYS                            KU$_M_VIEW_LOG_PFH_VIEW        VIEW
SYS                            KU$_CLUSTER_VIEW               VIEW
SYS                            DBMS_METADATA_INT              PACKAGE BODY
SYS                            DBMS_METADATA_UTIL             PACKAGE BODY
SYS                            VALIDATE_ORDIM                 PROCEDURE
SYS                            AWM_CREATEXDSFOLDER            FUNCTION
 
29 rows selected.

Como descrito acima, os objetos se tornaram inválidos devido dependências perdidas com o XDB, e a correção é a execução do seguintes scripts:

SQL> connect / as sysdba
 
-- Make XDB Dummy views
start ?/rdbms/admin/catxdbdv.sql
 
-- update Data Pump related objects and KU$_ views
 
start ?/rdbms/admin/dbmsmeta.sql
start ?/rdbms/admin/dbmsmeti.sql
start ?/rdbms/admin/dbmsmetu.sql
start ?/rdbms/admin/dbmsmetb.sql
start ?/rdbms/admin/dbmsmetd.sql
start ?/rdbms/admin/dbmsmet2.sql
start ?/rdbms/admin/catmeta.sql
start ?/rdbms/admin/prvtmeta.plb
start ?/rdbms/admin/prvtmeti.plb
start ?/rdbms/admin/prvtmetu.plb
start ?/rdbms/admin/prvtmetb.plb
start ?/rdbms/admin/prvtmetd.plb
start ?/rdbms/admin/prvtmet2.plb
start ?/rdbms/admin/catmet2.sql
 
SQL> select owner, count(1) from dba_objects where status <> 'VALID' group by owner;
 
no rows selected

Pronto, nenhum objeto inválido.! Solução descrita na NOTE 1269470.1 (MOS)
Mais informações →

PL/SQL: ORA-00947: not enough values


Hoje um cliente solicitou apoio para identificar o que estava gerando erro na criação de sua procedure e a deixando inválida na base de dados, pois bem, para identificarmos o que estava acontecendo bastou uma simples verificação:

SQL> show error procedure teste
Errors for PROCEDURE TESTE:
 
LINE/COL ERROR
-------- -----------------------------------------------------------------
60/12    PL/SQL: SQL Statement ignored
60/24    PL/SQL: ORA-00947: not enough values
97/12    PL/SQL: SQL Statement ignored
97/24    PL/SQL: ORA-00947: not enough values

Maravilha, identificamos que o erro é “PL/SQL: ORA-00947: not enough values” mas o que isto quer dizer?

Significa que “Não há valores suficientes”, ou seja, no INSERT está sendo passado uma quantidade inferior de valores do que é necessário ou foi especificado na instrução DML.

Vejamos:

SQL> insert into academico (codigo, nome, telefone) values (1,'ANDERSON');
insert into academico (codigo, nome, telefone) values (1,'ANDERSON')
                                               *
ERROR at line 1:
ORA-00947: not enough values

Neste exemplo podemos verificar que foi especificado 3 colunas porém apenas 2 valores foram passados no values, o mesmo erro também ocorre com instruções INSERT SELECT conforme abaixo:

SQL> insert into academico (codigo, nome, telefone) select codigo, nome from academico_tmp;
insert into academico (codigo, nome, telefone) select codigo, nome from academico_tmp
            *
ERROR at line 1:
ORA-00947: not enough values

Para resolvermos este ERRO basta especificarmos a quantidade correta de valores ou eliminar a coluna desnecessária.

SQL> insert into academico (codigo, nome, telefone) values (1,'ANDERSON',99811456);
 
1 row created.

Ou

SQL> insert into academico (codigo, nome) select codigo, nome from academico_tmp;
 
1 row created.
Mais informações →

Flashback Database 11gR2 – On & Off com instance OPEN

Hoje não veremos como utilizar o flashback database mais sim iremos compartilhar mais um conhecimento que muitos ainda não sabem, o flashback database é uma feature que surgiu na versão 10g e que acompanha as novas versões do Oracle, porém agora na versão 11gR2, diferentemente de seus antecessores que era necessário parar o banco para poder habilitar ou desabilitar o flashback, agora podemos realizar este procedimento com a base de dados aberta (OPEN). 

Mas para que isso é util? 

Imagine que você está prestes a realizar uma operação crítica no banco de dados e você quer ter a possibilidade de voltar atras caso ocorra problemas, simples, agora no 11gR2 podemos habilitar o flashback sem a necessidade de causar a indisponibilidade do banco de dados. 

Vejamos,

SQL> select * from v$version;
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
 
SQL> select log_mode,flashback_on from v$database;
 
LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   NO
 
SQL> select status from v$instance;
 
STATUS
------------
OPEN

Agora vamos habilitar e desabilitar o flashback database com a instance OPEN.

SQL> alter database flashback on;
 
Database altered.
 
SQL> select log_mode,flashback_on from v$database;
 
LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   YES
 
SQL> alter database flashback off;
 
Database altered.
 
SQL> select log_mode,flashback_on from v$database;
 
LOG_MODE     FLASHBACK_ON
------------ ------------------
ARCHIVELOG   NO
Mais informações →

Oracle Inventory directory (oraInventory)

Esta semana estava realizando uma nova instalação do Oracle em um cliente onde o mesmo havia removido o filesystem(unidade) em que estava instalado o Oracle e ao iniciar a instalação recebi uma mensagem de erro indicando problemas no acesso ao diretório do Oracle Inventory, cujo diretório já não existia mais (removido)! 


Antes de apontarmos a solução, que é bem simples, vamos primeiro entender o que é armazenado neste diretório ‘oraInventory’. 

No diretório Oracle Inventory (oraInventory) o Oracle armazena um inventário de todos os softwares instalados no sistema, este diretório é necessário e compartilhado por todas as instalações de produtos Oracle realizadas no sistema e quando temos um caminho definido para este invetário, o Oracle Universal Installer sempre continua a utilizar este destino de armazenamento (oraInventory). 

Pois bem, agora ficou facil! Se já havia uma instalação do Oracle no servidor, um destino para o inventario dos produtos Oracle já foi definido, porém como o filesystem para o qual aponta foi removido recebemos a mensagem de erro demonstrada acima. 

Para resolvermos este problema e prosseguir com a instalação, basta editarmos o arquivo /etc/oraInst.loc (com root) e ajustarmos o inventory_loc para um caminho válido.


[root@orcl ~]# vi /etc/oraInst.loc
inventory_loc=/oraprd01/app/oraInventory
inst_group=dba
 
[root@orcl ~]# cat /etc/oraInst.loc
inventory_loc=/u01/app/oraInventory
inst_group=dba
[root@orcl ~]#


Pronto! Uma nova localização foi apontada para o oraInventory e a instalação já pode processeguir, se o destino for válido é claro…


Mais informações →

Verificando corrupção física – DBV

Para quem não conhece, o DBVerify, mais conhecido apenas por DBV é um utilitário externo via linha de comando oferecido pela Oracle para a verificação da integridade física dos arquivos de dados (datafiles). Verificação de arquivos como controlfile e redo não são suportados. 

O DBV pode ser realizado tanto com o banco de dados offline como online, a grande diferença está no tempo de execução onde a verificação offline se destaca sendo significantemente mais rápida. Esta verificação se torna muito importante quando precisamos verificar a integridade de um backup (copia-imagem) antes de ser restaurado, ou como auxílio diagnóstico quando ocorrer problemas de corrupção de dados. 

Existem duas interfaces de linha de comando para o DBV, uma especifica o arquivo de dados/blocos e outra onde podemos especificar um segmento para verificação, ambas serão abordadas. 

Quando realizamos uma verificação dos arquivos de dados/blocos o DBV inicia um scanneamento sobre o arquivo executando validações e oferecendo a saida das verificações para diagnósticos, este processo tambem pode ser realizado sobre arquivos gerenciados pelo ASM apenas sendo necessário fornecer um USERID válido para o DBV se conectar na instance ASM. 

Quando executamos uma verificação sobre um segmento, este também fornece informações para diagnóstico, no entanto vale certa cautela nesta execução pois o segmento que está sendo verificado se torna bloqueado até que a operação seja concluida, isto porque as informações são recuperadas a partir do banco de dados corrente. Necessário informar USERID com privilégios SYSDBA. 

Antes de abordarmos alguns exemplos de utilização, vamos identificar as opções (parâmetros) que podem ser informados ao DBV. 

Observe que o DBVerify é iniciado pelo próprio comando dbv

[oracle@orcl ~]$ dbv help=yes
 
DBVERIFY: Release 11.1.0.6.0 - Production on Thu Nov 3 09:11:26 2011
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
Keyword     Description                    (Default)
----------- ------------------------------ -----------
FILE        File to Verify                 (NONE)
START       Start Block                    (First Block of File)
END         End Block                      (Last Block of File)
BLOCKSIZE   Logical Block Size             (8192)
LOGFILE     Output Log                     (NONE)
FEEDBACK    Display Progress               (0)
PARFILE     Parameter File                 (NONE)
USERID      Username/Password              (NONE)
SEGMENT_ID  Segment ID (tsn.relfile.block) (NONE)
HIGH_SCN    Highest Block SCN To Verify    (NONE)
            (scn_wrap.scn_base OR scn)

Note que todos os parâmetros foram listados, tanto para verificação de arquivo como de segmento. 

PARÂMETRO    DESCRIÇÃO/ENTRADA
FILENome do datafile da base de dados.
STARTBloco de inicio da verificação. Se não for especificado, por default o DBV inicia a verificação a partir do primeiro bloco do arquivo.
ENDBloco de termino da verificação. Se não for especificado, por default o DBV verifica até o ultimo bloco do arquivo.
BLOCKSIZETamanho do bloco do arquivo, pode ser verificado atraves do comando show parameter db_block_size.
LOGFILEAponta o arquivo onde será gerado a saida da verificação, por default a saida é no display do terminal.
FEEDBACKIndica o progresso da verificação (…), se for especificado 0 nenhum indicador de progresso é mostrado.
PARFILEEspecifica o nome do arquivo de parâmetros a ser utilizado.
USERIDUsuário e senha, necessário apenas quando o arquivo a ser verificado é um arquivo ASM ou uma verificação de segmento.
SEGMENT_IDNúmero de identificação do segmento a ser verificado. AS informações podem ser coletadas na SYS_USER_SEGS. (Necessário conectar como SYSDBA)
HIGH_SCNQuando um valor for especificado o DBV escreve mensagens de diagnóstico para cada bloco, cujo nível de bloco SCN exceder o valor especificado.


Verificação de arquivos de dados: 

  dbv [ USERID=username/password ]
    FILE = filename
  | { START = block_address | END = block_address }
  | BLOCKSIZE = integer
  | LOGFILE = filename
  | FEEDBACK = integer
  | HELP  = { Y | N } 
  | PARFILE = filename

Verificando um arquivo de dados non-ASM:

[oracle@orcl ~]$ dbv file=/u02/oradata/orcl11g/new_point01.dbf
 
DBVERIFY: Release 11.1.0.6.0 - Production on Thu Nov 3 09:54:36 2011
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
DBVERIFY - Verification starting : FILE = /u02/oradata/orcl11g/new_point01.dbf
 
 
DBVERIFY - Verification complete
 
Total Pages Examined         : 12800
Total Pages Processed (Data) : 42
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 6
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 47
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 12705
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 2981584 (0.2981584)

NOTA:

• Pages = Blocos • Total Pages Examined = Número de blocos no arquivo
• Total Pages Processed = Número de blocos que foram verificados (blocos formatados)
• Total Pages Failing = Número de blocos que falharam na verificação
• Total Pages Empty = Número de blocos vazios
• Total Pages Marked Corrupt = Número de blocos em que o cabeçado é inválido. Blocos corrompidos!
• Total Pages Influx = Número de blocos que estão sendo lidos e gravados ao mesmo tempo. Ocorre quando o banco de dados está aberto e o DBV não pode obter uma imagem consistente dos blocos que estão em fluxo.

Verificando um arquivo de dados ASM: Necessário informar um USERID para o dbv se conectarna instance ASM.

[oracle@orcl ~]$ dbv USERID=SYS/***** file=+DGDADOS/datafiles/users01.dbf logfile=/usr/tmp/dbv.log
 
DBVERIFY: Release 11.1.0.6.0 - Production on Thu Nov 3 10:19:15 2011
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.

[oracle@orcl ~]$ cat /usr/tmp/dbv.log
 
DBVERIFY: Release 11.1.0.6.0 - Production on Thu Nov 3 10:19:15 2011
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
 
DBVERIFY - Verification starting : FILE = +DGDADOS/datafiles/users01.dbf
 
DBVERIFY - Verification complete
 
Total Pages Examined         : 13376
Total Pages Processed (Data) : 9240
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 290
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 2548
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 1298
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 0 (0.0)


Verificação de Segmento:

Syntax:

  dbv USERID = username/password 
  | SEGMENT_ID = tsn.segfile.segblock
  | LOGFILE = filename
  | FEEDBACK = integer
  | HELP  = { Y | N }
  | PARFILE = filename


[oracle@orcl ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 11.1.0.6.0 - Production on Thu Nov 3 10:22:39 2011
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
 
Conectado a:
Oracle Database 11g Release 11.1.0.6.0 - Production
 
SQL> select us.TABLESPACE_ID, us.HEADER_FILE, us.HEADER_BLOCK
  2  from SYS_USER_SEGS us, DBA_SEGMENTS s
  3  where us.segment_name=s.segment_name
  4  and s.owner='ANDERSON'
  5  and s.segment_name='TESTE';
 
TABLESPACE_ID HEADER_FILE HEADER_BLOCK
------------- ----------- ------------
            6           5           11
SQL> exit
Desconectado de Oracle Database 11g Release 11.1.0.6.0 - Production

Executando..:

[oracle@orcl ~]$ dbv USERID=ANDERSON/****** segment_id=6.5.11
 
DBVERIFY: Release 11.1.0.6.0 - Production on Thu Nov 3 10:35:35 2011
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
DBVERIFY - Verification starting : SEGMENT_ID = 6.5.11
 
 
DBVERIFY - Verification complete
 
Total Pages Examined         : 3
Total Pages Processed (Data) : 0
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 2
Total Pages Processed (Seg)  : 1
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 0
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 0 (0.0)
Mais informações →

Movendo o SPFILE em RAC

Alguns meses atrás fui envolvido em uma atividade onde era necessário remover alguns diskgroups do ASM, isto porque um disco do storage iria ser substituído por outro com capacidade de armazenamento superior, pois bem, além dos datafiles possuíamos também o SPFILE abaixo do diskgroup. E agora, como podemos movimentá-lo e garantir que a instance suba corretamente utilizando o SPFILE localizado em outro diskgroup? 

Não se trata de uma atividade complicada, pelo contrário, muito simples, porém muitos desconhecem como fazer! 

Primeiramente vamos verificar a localização do SPFILE que as instances do RAC foram iniciadas:

SQL> set lines 200
SQL> col PARAMETRO for a30
SQL> col LOCALIZACAO for a70
SQL> select i.INSTANCE_NAME "INSTANCE", NAME "PARAMETRO", VALUE "LOCALIZACAO" from gv$instance i, gv$parameter p where i.inst_id=p.inst_id and upper(p.name)='SPFILE';
 
INSTANCE         PARAMETRO                      LOCALIZACAO
---------------- ------------------------------ ----------------------------------------------------------------------
orcl1            spfile                         +DGDICT/orcl/spfileorcl.ora
orcl2            spfile                         +DGDICT/orcl/spfileorcl.ora

Agora iremos verificar o spfile registrado no OCR, para isto utilizaremos o comando “srvctl config database -d DATABASE_NAME -a”, que terá como saída:

[oracle@rac1 ~]$ $ORA_CRS_HOME/bin/srvctl config database -d orcl -a
rac1 orcl1 /u01/app/oracle/product/10.2.0/db_1
rac2 orcl2 /u01/app/oracle/product/10.2.0/db_1
DB_NAME: orcl
ORACLE_HOME: /u01/app/oracle/product/10.2.0/db_1
SPFILE: +DGDICT/orcl/spfileorcl.ora
DOMAIN: null
DB_ROLE: null
START_OPTIONS: null
POLICY:  AUTOMATIC
ENABLE FLAG: DB ENABLED

Podemos ver que o SPFILE que será utilizado em um restart se mantem o mesmo já utilizado pelas instances no startup, vamos então copiar este SPFILE para outro diskgroup ASM e ajustar a localização do SPFILE registrado no OCR: 

Note que para efetuar a copia, primeiramente foi gerado um pfile para disco e posteriormente um spfile a partir do pfile para o ASM, isto porque: 

* O ASM não suporta arquivos de sistema operacional e o PFILE por ser arquivo texto acaba por não ser suportado. 
* Não é possível criar um spfile from spfile, porém se o ambiente for 11g pode ser utilizada a new feature “create spfile=’localizacao/spfile.ora’ from memory” (entenda mais sobre a feature se for utiliza-la!)

SQL> select instance_name from v$instance;
 
INSTANCE_NAME
----------------
orcl1
 
SQL> create pfile='/usr/tmp/pfile.ora' from spfile='+DGDICT/orcl/spfileorcl.ora';
 
File created.
 
SQL> create spfile='+DGB/orcl/spfileorcl.ora' from pfile='/usr/tmp/pfile.ora';
 
File created.
 
SQL> exit

– Modificando a localização do SPFILE registrado no OCR

[oracle@rac1 ~]$ $ORA_CRS_HOME/bin/srvctl modify database -d orcl -p +DGB/orcl/spfileorcl.ora

Efetuado estes dois passos, vamos realizar uma nova verificação no OCR para certificar que está sendo apontado para o novo SPFILE.

[oracle@rac1 ~]$ $ORA_CRS_HOME/bin/srvctl config database -d orcl -a
rac1 orcl1 /u01/app/oracle/product/10.2.0/db_1
rac2 orcl2 /u01/app/oracle/product/10.2.0/db_1
DB_NAME: orcl
ORACLE_HOME: /u01/app/oracle/product/10.2.0/db_1
SPFILE: +DGB/orcl/spfileorcl.ora
DOMAIN: null
DB_ROLE: null
START_OPTIONS: null
POLICY:  AUTOMATIC
ENABLE FLAG: DB ENABLED

Iremos ajustar o init*.ora ($ORACLE_HOME/dbs/) com a localização do novo SPFILE e replicamos para os demais nodes.

[oracle@rac1 ~]$ echo "SPFILE='+DGB/orcl/spfileorcl.ora'" > $ORACLE_HOME/dbs/initorcl1.ora
[oracle@rac1 ~]$ ssh rac2 "echo \"SPFILE='+DGB/orcl/spfileorcl.ora'\" > $ORACLE_HOME/dbs/initorcl2.ora"

Agora vamos restartar o database para que inicie com o novo spfile:

[oracle@rac1 ~]$ $ORA_CRS_HOME/bin/srvctl stop database -d orcl
[oracle@rac1 ~]$ $ORA_CRS_HOME/bin/srvctl start database -d orcl
SQL> set lines 200
SQL> col PARAMETRO for a30
SQL> col LOCALIZACAO for a70
SQL> select i.INSTANCE_NAME "INSTANCE", NAME "PARAMETRO", VALUE "LOCALIZACAO" from gv$instance i, gv$parameter p where i.inst_id=p.inst_id and upper(p.name)='SPFILE';
 
INSTANCE         PARAMETRO                      LOCALIZACAO
---------------- ------------------------------ ----------------------------------------------------------------------
orcl1            spfile                         +DGB/orcl/spfileorcl.ora
orcl2            spfile                         +DGB/orcl/spfileorcl.ora

Pronto, SPFILE também foi movimentado! Já podemos remover o antigo diskgroup.
Mais informações →

Instalando o Oracle XML DB 11g

Hoje ao testar uma procedure de envio de e-mail utilizando a package UTL_MAIL no Oracle 11g obtive o seguinte erro: 

ORA-24248: XMLDB extensible security not installed 

Bom.. como descrito na mensagem precisamos instalar o Oracle XML DB, mas porque? 

Uma das melhorias propostas no Oracle 11g foi a de maior segurança no acesso aos pacotes de rede como UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP e UTL_INADDR, ou seja, uma execução de privilégio sobre estes pacotes não é mais suficiente para acessar um recurso de rede externa é necessário agora a configuração também de de uma ACL (Access Control List) que será descrita em um próximo artigo, mas ainda em nosso contexto, Essas ACLs são arquivos XML que são armazenados no repositório do banco de dados XML dentro do próprio banco de dados, o que significa que banco de dados XML devem ser instalado no banco de dados para podermos utilizar estes pacotes. 

Vamos verificar se o mesmo não está instalado:

SQL> set lines 200
SQL> col Component for a70
SQL> select comp_name "Component" from dba_registry;
 
Component
----------------------------------------------------------------------
OWB
Oracle Application Express
Oracle Enterprise Manager
Oracle Ultra Search
OLAP Catalog
Spatial
Oracle Multimedia
Oracle Text
Oracle Expression Filter
Oracle Rules Manager
Oracle Workspace Manager
Oracle Database Catalog Views
Oracle Database Packages and Types
JServer JAVA Virtual Machine
Oracle XDK
Oracle Database Java Packages
OLAP Analytic Workspace
Oracle OLAP API
 
18 linhas selecionadas.

Confirmado que não está instalado, vamos instalar o Oracle XML. Primeira precisamos criar uma tablespace para o XML DB:

SQL> create tablespace xmldb datafile '+DGDADOS/datafiles/xmldb01.dbf' size 100m autoextend on next 100m maxsize 3000m;
 
Tablespace criado.

Agora execumos o script catqm localizado dentro do $ORACLE_HOME/rdbms/admin passando os seguintes parâmetros:

SYNTAXE: 

SQL>@?/rdbms/admin/catqm.sql A B C D

onde:

A = XDB pwd
B = XDB default tablespace
C = XDB temporary tablespace
D = SecureFiles = YES/NO

Se o SecureFiles for especificado com YES (SIM), o repositório XDB usará armazenamento SecureFile. Se NO (NÃO), será utilizado LOBS. 
Para usar SecureFiles, a compatibilidade deve ser definida para 11.2. O tablespace especificado para o repositório XDB deve estar usando Automatic Segment Space Management (ASSM) para SecureFiles. 

 Execução:

SQL> @?/rdbms/admin/catqm.sql xml_password xmldb temp yes
 
SQL> ...
SQL> ...
SQL> ...

Vamos confirmar se agora está instalado:

SQL> set lines 200
SQL> col Component for a70
SQL> select comp_name "Component" from dba_registry;
 
Component
----------------------------------------------------------------------
Oracle XML Database
OWB
Oracle Application Express
Oracle Enterprise Manager
Oracle Ultra Search
OLAP Catalog
Spatial
Oracle Multimedia
Oracle Text
Oracle Expression Filter
Oracle Rules Manager
Oracle Workspace Manager
Oracle Database Catalog Views
Oracle Database Packages and Types
JServer JAVA Virtual Machine
Oracle XDK
Oracle Database Java Packages
OLAP Analytic Workspace
Oracle OLAP API
 
19 linhas selecionadas.

Pronto, Oracle XML DB instalado com sucesso e pronto para utilização, simples assim.

Para remover o mesmo basta executar:

SQL> @?/rdbms/admin/catnoqm
SQL> alter tablespace XMLDB offline;
SQL> drop tablespace XMLDB including contents;
Mais informações →

Alterando Banco de dados RAC para modo archivelog

Anteriormente no artigo “Alterando banco de dados single para modo archivelog” verificamos a importância da base de dados estar configurada em modo archivelog e aprendemos como efetuar esta alteração em um database single. 

Nosso objetivo hoje é aprender como efetuar este ajuste em um ambiente clusterizado (RAC). Mãos a obra! 

Primeiramente vamos confirmar se a base de dados está em modo NOARCHIVELOG:

SQL> select distinct NAME, i.INSTANCE_NAME, OPEN_MODE, LOG_MODE from gv$database, gv$instance i order by 2;
 
NAME      INSTANCE_NAME    OPEN_MODE  LOG_MODE
--------- ---------------- ---------- ------------
ORCL      orcl1            READ WRITE NOARCHIVELOG
ORCL      orcl2            READ WRITE NOARCHIVELOG
ou
SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /u01/app/oracle/product/10.2.0/db_1/dbs/arch
Oldest online log sequence     16
Current log sequence           17

Confirmado que a base está em modo NOARCHIVELOG, vamos ajustar um destino para os archives (redolog arquivados) que serão gerados. 

Neste momento é importante ficarmos atentos se o destino existe em todos os nós do cluster, ou então, também podemos configurá-los diferentemente para cada instance. 

* Ajustando um destino único para todas as instances:

Sintaxe: alter system set log_archive_dest_1=’LOCATION=’ scope=spfile sid=’*’;

SQL> alter system set log_archive_dest_1='LOCATION=/oraarchive/orcl' scope=spfile sid='*';
 
System altered.

Desta forma ajustamos o destino 1 dos archives para o local “/oraarchive/orcl”, note que antes do caminho de destino devemos especificar “LOCATION”. O scope será como spfile e o SID=’*’ (todos), caso seja necessário ajustar destinos diferentes devemos especificar o nome da instance no SID, como abaixo:

SQL> alter system set log_archive_dest_1='LOCATION=/oraarchive/orcl' scope=spfile sid='orcl1';
 
System altered.

OBS: Caso a opção SID não seja especificada no comando alter system ela recebe por default ‘*’ 

Ajustado o(s) destino(s), vamos agora ajustar o formato que os archives serão gerados.

Sintaxe: alter system set log_archive_format=’_%t_%s_%r.arc’ scope=spfile;

SQL> alter system set log_archive_format='orcl_%t_%s_%r.arc' scope=spfile;
 
System altered.

ORACLE_SID = Nome da instance;
%t = Número da thread;
%s = Número de sequencia do log;
%r = Resetlog ID.

Nosso próximo passo é alterar o parâmetro cluster_database para FALSE, desta forma desabilitamos “temporariamente” o Real Application Cluster.

Sintaxe: alter system set cluster_database=false scope=spfile;

SQL> alter system set cluster_database=false scope=spfile;
 
System altered.

Agora podemos parar o database: Sintaxe: srvctl stop database -d

[oracle@rac1 ~] cd $ORA_CRS_HOME
[oracle@rac1 bin]$ ./srvctl stop database -d orcl

Verificando se as instances orcl1 e orcl2 foram paradas:

[oracle@rac1 bin]$ ./crs_stat -t
Name           Type           Target    State     Host
------------------------------------------------------------
ora.orcl.db    application    OFFLINE   OFFLINE
ora....l1.inst application    OFFLINE   OFFLINE
ora....l2.inst application    OFFLINE   OFFLINE
ora....SM1.asm application    ONLINE    ONLINE    rac1
ora....C1.lsnr application    ONLINE    ONLINE    rac1
ora.rac1.gsd   application    ONLINE    ONLINE    rac1
ora.rac1.ons   application    ONLINE    ONLINE    rac1
ora.rac1.vip   application    ONLINE    ONLINE    rac1
ora....SM2.asm application    ONLINE    ONLINE    rac2
ora....C2.lsnr application    ONLINE    ONLINE    rac2
ora.rac2.gsd   application    ONLINE    ONLINE    rac2
ora.rac2.ons   application    ONLINE    ONLINE    rac2
ora.rac2.vip   application    ONLINE    ONLINE    rac2

Vamos iniciar agora a instance orcl1 para podermos alterar o ‘DATABASE’, para modo ARCHIVELOG.

[oracle@rac1 bin]$ export ORACLE_SID=orcl1
[oracle@rac1 bin]$ sqlplus / as sysdba
 
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 10 16:08:40 2011
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
Connected to an idle instance.
 
SQL> startup mount;
ORACLE instance started.
 
Total System Global Area  243269632 bytes
Fixed Size                  1218748 bytes
Variable Size             109053764 bytes
Database Buffers          130023424 bytes
Redo Buffers                2973696 bytes
Database mounted.
 
SQL> alter database archivelog;
 
Database altered.

Vamos alterar novamente o parâmetro cluster_database agora para TRUE e parar a instance para podermos iniciá-la atraves do serviço:

SQL> alter system set cluster_database=true scope=spfile;
 
System altered.
 
SQL> shutdown immediate;
ORA-01109: database not open
 
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 10g Release 10.2.0.1.0 - Production
With the Real Application Clusters option

iniciando:

[oracle@rac1 bin]$ ./srvctl start database -d orcl
 
[oracle@rac1 bin]$ ./crs_stat -t
Name           Type           Target    State     Host
------------------------------------------------------------
ora.orcl.db    application    ONLINE    ONLINE    rac2
ora....l1.inst application    ONLINE    ONLINE    rac1
ora....l2.inst application    ONLINE    ONLINE    rac2
ora....SM1.asm application    ONLINE    ONLINE    rac1
ora....C1.lsnr application    ONLINE    ONLINE    rac1
ora.rac1.gsd   application    ONLINE    ONLINE    rac1
ora.rac1.ons   application    ONLINE    ONLINE    rac1
ora.rac1.vip   application    ONLINE    ONLINE    rac1
ora....SM2.asm application    ONLINE    ONLINE    rac2
ora....C2.lsnr application    ONLINE    ONLINE    rac2
ora.rac2.gsd   application    ONLINE    ONLINE    rac2
ora.rac2.ons   application    ONLINE    ONLINE    rac2
ora.rac2.vip   application    ONLINE    ONLINE    rac2

Vamos verificar se nosso database está em modo ARCHIVELOG:

SQL> select distinct NAME, i.INSTANCE_NAME, OPEN_MODE, LOG_MODE from gv$database, gv$instance i order by 2;
 
NAME      INSTANCE_NAME    OPEN_MODE  LOG_MODE
--------- ---------------- ---------- ------------
ORCL      orcl1            READ WRITE ARCHIVELOG
ORCL      orcl2            READ WRITE ARCHIVELOG

Para certificarmos que os archives estão sendo gerados com sucesso podemos forçar um switch e verificar se foram criados abaixo do(s) destino(s) especificado(s).

SQL> select instance_name from v$instance;
 
INSTANCE_NAME
----------------
orcl1
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> exit
Disconnected from Oracle Database 10g Release 10.2.0.1.0 - Production
With the Real Application Clusters option

[oracle@rac1 bin]$ ll /oraarchive/orcl
total 29440
-rw-rw---- 1 oracle oinstall 30109696 Out 10 16:27 orcl_1_17_764169947.arc

node2:

SQL> select instance_name from v$instance;
 
INSTANCE_NAME
----------------
orcl2
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> exit
Disconnected from Oracle Database 10g Release 10.2.0.1.0 - Production
With the Real Application Clusters option

[oracle@rac2 orcl]$ ll /oraarchive/orcl
total 7184
-rw-rw---- 1 oracle oinstall 27804160 Out 10 16:28 orcl_2_1_764169947.arc
Mais informações →
Postagens mais recentes Postagens mais antigas Página inicial

Translate

# Suporte

# ACE Program

#Oracle

#Oracle
Disclaimer: The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.

#Blog reconhecido

#ARTICULISTA

Marcadores

Postagens populares