Mostrando postagens com marcador Windows. Mostrar todas as postagens
Mostrando postagens com marcador Windows. Mostrar todas as postagens

quinta-feira, 10 de novembro de 2016

ILOM - Erros no "Launch Remote Console"

Recentemente precisei acessar a ILOM (Integrated Lights Out Manager) de um ODA para iniciar a console remota - "Launch Remote Console", contudo veio o primeiro erro:

java.lang.SecurityException: Missing required Permissions manifest attribute in main jar


Pesquisando um pouco encontrei a solução para este erro, conforme passos a seguir:


  • Acessar painel de controle;
  • "Encontrar" o Java e clicar sobre para abrir o Painel de Controle Java (para facilitar a localização escreva java na caixa de pesquisa);

  • Acessar a aba Segurança;
  • Clicar sobre "Editar Lista de Sites..."

  • Clicar sobre "Adicionar";

  • Inserir o IP e porta da ILOM conforme dados do erro;
  • OK; OK ..

Feito isto fui abrir novamente a console remota da ILOM.

Agora a console abriu com sucesso, mas como podemos ver abaixo, tive outro erro sendo reportado:

No appropriate protocol (protocol is disabledor cipher suites are inappropriate)


Fazendo mais algumas pesquisas, identifiquei que na CVE-2014-3566 - "SSL V3.0 "Poodle" Vulnerability" o algoritmo SSLv3, por padrão, foi desabilitado a partir da JDK 8u31. Nas versões 7u75 e 6u91 também foram ajustadas.

Conforme nota da versão, habilitei novamente o SSLv3 editando o arquivo <JRE_HOME>/lib/security/java.security

Como estou utilizando um sistema operacional Windows, o arquivo foi localizado em "C:\Program Files\Java\jre1.8.0_91\lib\security" conforme imagem abaixo.


Ao abrir o arquivo com o editor bloco de notas, localizei a entrada jdk.tls.disabledAlgorithms, comentei a linha e salvei o arquivo. 

OBS: retirando apenas a entrada SSLv3 não funcionou comigo

de:

jdk.tls.disabledAlgorithms= SSLv3, RC4, MD5withRSA, DH keySize < 768

para:

#jdk.tls.disabledAlgorithms= SSLv3, RC4, MD5withRSA, DH keySize < 768

Mesmo com o ajuste, ao abrir a console fui submetido a um novo erro:

java.security.cert.CertificateException: Certificates does not conform to algorithm constraints


Voltando as pesquisas... encontrei um novo parâmetro, também dentro do java.security 

Abri novamente o arquivo java.security, localizei o jdk.certpath.disabledAlgorithms e comentei a linha.

de:

jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024

para:

#jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024

Tentando novamente abrir a console remota.. 



Bingo!

Console remota abrindo com sucesso, basta inserir o usuário e senha.

Espero ter ajudado!

Referências:

http://stackoverflow.com/questions/21404830/securityexception-during-executing-jnlp-file-missing-required-permissions-manif
http://www.oracle.com/technetwork/topics/security/poodlecve-2014-3566-2339408.html
http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html
http://www.oracle.com/technetwork/java/javase/8u31-relnotes-2389094.html
https://www.richardnichols.net/2012/08/arrrggh-java-security-cert-certificateexception-certificates-does-not-conform-to-algorithm-constraints/
Mais informações →

segunda-feira, 22 de setembro de 2014

Verificando a consistência dos instaladores Oracle

Certamente você já fez o download de algum instalador Oracle e ao descompactar e/ou mesmo durante o processo de instalação obteve erros em função do arquivo estar corrompido. Legal mesmo é quando nossas atividades possuem horas determinadas para início e fim pois impactam diretamente no trabalho da organização e descobrimos que o arquivo esta corrompido bem quando vamos utiliza-lo. Complicado não é?

Apesar de não termos culpa se ocorreu alguma queda na Internet ou problemas na copia do arquivo, ainda assim podemos nos sentir culpados pois poderíamos ter evitado este fator de forma muito simples e rápida.

Através da OTN (oracle.com) podemos encontrar um valor cksum para cada arquivo baixado. Quando verificado o numero de retorno deve ser igual ao especificado ao lado do arquivo na OTN, caso contrário o download deve ser refeito.




Via MOS (My Oracle Support) a Oracle disponibiliza o SHA-1 e MD5, ambos utilizados para garantir a consistência de cada arquivo sendo aplicado o mesmo critério acima. Se o retorno for igual ao do MOS o arquivo esta integro caso contrario o download deve ser refeito.

Para que o SHA-1 e MD5 seja apresentado junto aos links de download deve-se clicar em “View Digest Details” conforme demonstrado abaixo:



Verificando a integridade via MD5:


Verificando a integridade via SHA-1:




No Doc Id 549617.1 a Oracle também disponibiliza um vídeo demonstrando a utilização:


Acesse o vídeo, clicando aqui.


Mais informações sobre a verificação de integridade dos arquivos em outras plataformas pode ser acessado através da nota:


Mais informações →

quarta-feira, 31 de julho de 2013

12c new feature: Move datafile online

O Oracle 12c chegou! e com ele inúmeras melhorias e novas features surgiram. Confira no Oracle® Database New Features Guide 12c Release 1 (12.1).
Uma destas novas features (1.5.5.6 Move a Data File Online) realmente chama a atenção, pois agora nos permite mover os datafiles de forma online totalmente transparente para os usuários, com o banco OPEN e os usuários acessando o datafile, com isso resolver problemas de área livre ou distribuir os datafiles entre dispositivos de armazenamento conforme carga de I/O (para melhorar a performance) se tornou muito prático e rápido.

C:\Users\Anderson Graf>sqlplus sys as sysdba
 
SQL*Plus: Release 12.1.0.1.0 Production on Sex Jul 26 09:36:24 2013
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
Informe a senha:
 
Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
SQL> col file_name for a70
SQL> select file_name from dba_data_files where tablespace_name='USERS';
 
FILE_NAME
----------------------------------------------------------------------
D:\ORACLE\ORADATA\ORCL\DATAFILE\O1_MF_USERS_8Z4SMH74_.DBF
 
SQL> alter database move datafile 'D:\ORACLE\ORADATA\ORCL\DATAFILE\O1_MF_USERS_8Z4SMH74_.DBF' to 'C:\USERS01.DBF';
 
Banco de dados alterado.
 
SQL> select file_name from dba_data_files where tablespace_name='USERS';
 
FILE_NAME
----------------------------------------------------------------------
C:\USERS01.DBF

Continue lendo mais em oraclehome.com.br
Mais informações →

quinta-feira, 14 de fevereiro de 2013

OERR Utility

Não muito conhecido, porém útil, o Oracle Error(OERR) é um utilitário que compõe a instalação do produto Oracle nas plataformas Linux e Unix. É um shell script localizado no diretório $ORACLE_HOME/bin que permite pesquisar nos arquivos Oracle messages (.msg) e exibir a causa e a ação para os erros pesquisados, como neste exemplo:

[oracle@orcl ~]$ export ORACLE_HOME=/u02/app/oracle/product/10.2/db_1
[oracle@orcl ~]$ oerr ora 1555
01555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" too small"
// *Cause: rollback records needed by a reader for consistent read are
//         overwritten by other writers
// *Action: If in Automatic Undo Management mode, increase undo_retention
//          setting. Otherwise, use larger rollback segments
[oracle@orcl ~]$
Sua syntaxe é composta pelo facility(digamos “código”) e error(número do erro):
[oracle@orcl ~]$ oerr
Usage: oerr facility error
 
Facility is identified by the prefix string in the error message.
For example, if you get ORA-7300, "ora" is the facility and "7300"
is the error.  So you should type "oerr ora 7300".
 
If you get LCD-111, type "oerr lcd 111", and so on.
O facility econtrado no $ORACLE_HOME/lib/facility.lis nada mais é que um arquivo texto que aponta a localização dos messages(.msg) para o componente especificado, vejamos:
[oracle@orcl ~]$ cat $ORACLE_HOME/lib/facility.lis | grep -i rman
rman:rdbms:*:
ou seja, o arquivo de mensagem do RMAN está em:


 $ORACLE_HOME/$Component/mesg/${Facility}us.msg)

[oracle@orcl ~]$ ll $ORACLE_HOME/rdbms/mesg/rmanus.msg
-rw-r--r-- 1 oracle dba 334691 Abr 19  2010 /u02/app/oracle/product/10.2/db_1/rdbms/mesg/rmanus.msg
Lista dos facility disponíveis no facility.lis:

AMD AUD AV BBED BRW CLSR CLSS CLST CPY CRS DA DAC DAH DAL DBV DGM DRG DS DS2 DSP DSW DSZ EBU EVM EXP FMC FMD FMF FMG FMM IAC IAD IAG IAP ILF IMG IMP KFED KFOD KGP KOP KUP LCD LDAP LDT LEM LFI LHT LMM LPM LPX LRM LSF LSX LTM LXCNV LXE LXI MD MGR MIG NAUK NCI NCIDL NCIERR NCR NCX NET NID NIQ NL NLT NMC NMCPI NMO NMP NMR NMS NMXECM NMXW NMZ NNC NNF NNL NNO NPL NZ O2 O2F O2I O2U OAE OAO OBK OCI OFC OMA OMAPI OMB OMD OMGUT OMKT OMU OMV OPW ORA OSN OSNQ PCB PCBE PCC PCF PCG PCI PCM PCP PCS PG2 PGO PGP PLS PLW PM PMX PPE PR2 PRC PRCO PRIF PRO PROC PROT PX PXU QSM RMAN SBT SCH SDO SMAMP SMG SMPSLR SNL SP1 SP2 SP3 SPW SQL SRW SRW2 SVPXNT SVPXOS TIX TLEM TNL TNPL TNS TS TXR TXU TYP UDE UDI UL VID VIR VPP VPXDBA VPXECM VPXOAFND VPXODB VPXSAPR3 WA XOQ 

 E nos arquivos de mensagem (.msg) temos a causa e a ação para o erro pesquisado:
[oracle@orcl ~]$ cat $ORACLE_HOME/rdbms/mesg/rmanus.msg | grep -A 5 -n -i 0574
769:0574, 1, "rman aborting due to errors read/writing dbms_pipe"
770-// *Cause:  RMAN was run with input/output being sent to dbms_pipe.  An
771-//          error was encountered while reading from or writing to the pipe.
772-//          This error should be preceeded by information describing the error.
773-// *Action: RMAN terminates.  Refer to the cause/action for the preceding
774-//          errors.
[oracle@orcl ~]$ oerr rman 0574
0574, 1, "rman aborting due to errors read/writing dbms_pipe"
// *Cause:  RMAN was run with input/output being sent to dbms_pipe.  An
//          error was encountered while reading from or writing to the pipe.
//          This error should be preceeded by information describing the error.
// *Action: RMAN terminates.  Refer to the cause/action for the preceding
//          errors.

Para a plataforma Windows a Oracle não disponibilizou o utiliátio OERR, contudo podemos encontrar na Internet varios batchs que disponibilizam a mesma funcionalidade que o OERR Linux & Unix.

Encontrei um muito bom, desenvolvido por John Barrenechea que pode ser baixado clicando aqui.

Basta decompactar o arquivo “Oerr.rar” e executar o Oerr.exe, como na imagem abaixo:


Ou atraves do prompt ( executar >> cmd ):



REFERÊNCIAS:

http://www.oracleutilities.com/OSUtil/oerr.html
http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/TDT1/Default.aspx
Mais informações →

domingo, 15 de julho de 2012

Boa prática: Adicionando comentário nos parâmetros alterados

Na vida de um DBA ajustar parâmetros do banco de dados é algo rotineiro, mas como bem sabemos nem sempre somos os únicos a fazer os ajustes.

Muitas vezes um banco de dados é alterado por varias pessoas (DBA, desenvolvimento, usuário…) e mesmo que estas alterações sejam justificadas internamente a longo prazo podemos necessitar identificar o motivo pelo qual o parâmetro foi alterado.

E agora que “NINGUÉM” alterou como descobrimos o motivo do ajuste?

Pois bem, muitas vezes não descobrimos! Isto acontece pelo fato da alteração não ser realizada mediante a um comentário que pode ser adicionado ao parâmetro alterado.

O objetivo deste artigo é justamente apontar esta boa prática que podemos adotar sempre que um parâmetro for alterado e desta forma minimizar muitas dores de cabeça que podes surgir.

Para adicionar um comentário na alteração do parâmetro é simples, vejamos como:

SQL> alter system set undo_retention=10800 comment='Alterado por Anderson em 11/07. Motivo: ORA-01555 snapshot too old';
 
Sistema alterado.

E para identificar o motivo do ajuste:

SQL> select name, value, update_comment from v$parameter where name='undo_retention';
 
NAME                 VALUE                UPDATE_COMMENT
-------------------- -------------------- ----------------------------------------------------------------------
undo_retention       10800                Alterado por Anderson em 11/07. Motivo: ORA-01555 snapshot too old

Apenas lembre-se que se você não estiver utilizando o SPFILE, o comentário assim como o ajuste de um parâmetro dinâmico deve ser feito também no PFILE e não apenas em memória.

Exemplo da alteração/comentário no PFILE (init.ora)

[oracle@teste dbs]$ cat initorcl11g.ora | grep undo_retention
*.undo_retention=10800#Alterado por Anderson em 11/07. Motivo: ORA-01555 snapshot too old
Mais informações →

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 →

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 →

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 →

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 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