quinta-feira, 16 de fevereiro de 2012

ORA-12640, ORA-21561: Falha na geração do OID

Erro ORA-12640 ou ORA-21561? Você já teve este problema no seu site?

No ambiente Windows, estávamos enfrentando um erro que impedia novas conexões no banco de dados. O erro era ORA-12640: "Authentication adapter initialization failed" - Falha na autenticação.

Nosso ambiente é complexo e com um eleavado número de conexões.

Após alguma pesquisa, descobri que bastava substituir o parâmetro SQLNET.AUTHENTICATION_SERVICES, no arquivo SQLNET.ORA, de NTS para NONE. Pronto! Nunca mais eu veria este erro, certo?

Na verdade eu troquei 6 por meia dúzia. Depois dessa mudança passei a receber o erro ORA-21561: Falha na geração do OID. Como resolver esta situação?

Veja as dicas abaixo:

Causa: O problema ocorre devido a um aumento no volume de conexões no banco de dados. O Windows estava com um valor baixo para o parâmetro SharedSection heap.

Solução:
1) Altere o parâmetro no arquivo sqlnet.ora no servidor do banco de dados
  • SQLNET.AUTHENTICATION_SERVICES=NONE
2) No servidor de aplicação vá para: Iniciar (Start) do Windows entre em executar (RUN) digite:
  • regedit 
3) No editor da registry do Windows vá para:
  • \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\
4) Clique com o botão direito na chave "windows" e altere o valor:
De:
  • %SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16
Para:
  •  %SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,1024 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16
Este terceiro valor do parâmetro SharedSection que estava em 512 representa o desktop heap para cada estação que conecta ao windows. No nosso caso o valor 1024 resolveu o problema, mas você deve fazer testes e ajustar conforme sua necessidade.
  Veja mais sobre o parâmetro SharedSection no site da Microsoft:
http://support.microsoft.com/kb/184802 


Sucesso!


Luis Adelson.

quarta-feira, 15 de fevereiro de 2012

Como Acessar um Banco de Dados Sem Senha


É possível acessar um banco de dados sem a password do esquema?

Podemos simplesmente alterar a senha do esquema. Contudo, podem existir aplicativos associados àquela antiga senha. Neste caso, você irá habilitar-se ao esquema temporariamente, executar a atividade que precisa e logo em seguida retornar a senha antiga.

Na sequência abaixo coloco dois exemplos de como fazer este procedimento.





SQL> CONNECT / as sysdba
Connected.

SQL> SELECT password FROM dba_users WHERE  username='SCOTT';
PASSWORD
--------------- ---------------
F894844C34402B67

 
SQL> ALTER USER scott IDENTIFIED BY anything;
User altered.

SQL> CONNECT scott/anything
Connected.

OK, we're in. Let's quickly change the password back before anybody notices.

SQL> ALTER USER scott IDENTIFIED BY VALUES 'F894844C34402B67';
User altered. 
 
Uma forma mais simples é usa a query que irá gerar o SQL do comando para retornar a senha antiga:
 
Script:
SQL> SELECT 'ALTER USER '||USERNAME||' IDENTIFIED BY VALUES '''||PASSWORD||''';'
  FROM DBA_USERS, GLOBAL_NAME
 where username in ('USR_PGEPLANO');
 
SQL> ALTER USER scott IDENTIFIED BY VALUES 'F894844C34402B67'
 
Para descontrair...
 
 
Sucesso!
 
Luis Adelson 

segunda-feira, 13 de fevereiro de 2012

Como habilitar ARCHIVE no Oracle RAC

  1. Entre em um dos nós (por exemplo: racnode1) e desabilite a opção de cluster da instância, isto é, altere o atributo cluster_database para FALSE:

    $ sqlplus "/ as sysdba"
    SQL> alter system set cluster_database=false scope=spfile sid='racdb1';
  2. Tire todo mundo do ar (Shutdown all instances):

    $ srvctl stop database -d racdb
  3. Volte novamente a sua instância que você alterou o atributo de cluster e inicie o banco em MOUNT:

    $ sqlplus "/ as sysdba"
    SQL> startup mount
  4. Agora habilite o modo archive:

    SQL> alter database archivelog;
  5. Volte novamente o atributo de cluster para verdadeiro:
    SQL> alter system set cluster_database=true scope=spfile sid='racdb1';
  6. Tire a instância do ar:

    SQL> shutdown immediate
  7. Agora pode por tudo no ar usando o comando srvctl:

    $ srvctl start database -d racdb
  8. Se o serviço estiver fora do ar, use o comando srvctl para por novamente ativo:

    $ srvctl start service -d racdb

  9. Entre na instância local e veja se o banco está em modo archive:


    $ sqlplus "/ as sysdba"
    SQL> archive log list
    Database log mode              Archive Mode
    Automatic archival             Enabled
    Archive destination            USE_DB_RECOVERY_FILE_DEST
    Oldest online log sequence     83
    Next log sequence to archive   84
    Current log sequence           84

Após estes procedimentos, cada instância do RAC poderá arquivar seus redologs!


Abraços e Sucesso!


Luis Adelson

Como mover uma TABLESPACE num ambiente Oracle RAC ASM

Usar comandos ASM num ambiente RAC é uma coisa muito chatinha... (pra dizer o mínimo). Não podemos reclamar, afinal é isso que nos mantem empregados ;-).

Bom, depois de suar muito, descobri como copiar arquivos entre diskgroups num ambiente Oracle RAC ASM. Vejam estas dicas muito fáceis!

Como mover datafiles entre diskgroups:
1) Coloque a tablespace offline (indisponível para uso):
     SQL> ALTER TABLESPACE exemplo OFFLINE;
2) Entre na ferramenta RMAN do Oracle:
     [oracle@rac1 racdb]$ rman target / nocatalog
3) Copie os datafiles para o diskgroup desejado:
     copy datafile '+DG_DISK3/sysdb/datafile/datafile1.dbf' to '+DG_DISK1'; (estamos movendo do diskgroup 3 para o diskgroup 1)
4) Anote o nome que será gerado para o datafile no diskgroup de destino (ver passo3)
5) Renomeie o datafile para o nome que o RMAN gerou no passo 3
     alter database rename file '+DG_DISK3/sysdb/datafile/datafile1.dbf' to 'nome do rman passo 3';
6) Repita os passos acima para copiar outros datafiles, se for preciso;
7) Coloque as tablespaces online:
     SQL> ALTER TABLESPACE exemplo ONLINE;

Simples, não é mesmo? Mas e se você quiser mover a tablespace SYSTEM ou a SYSAUX? Aqui é que a porca torce o rabo...

Nada de muito complicado, mas será preciso tirar o banco de dados do ar e somente funcionará se seu banco estiver no modo archive. Veja como fazer:

Como mover tablespace SYSTEM e SYSAUX para outro DISKGROUP (RAC com ASM)

1) Identifique a localização da tablespace SYSTEM e do seu respectivo datafile:
    SQL> select ts.name,df.name from v$datafile df,v$tablespace ts where ts.ts#=df.ts# and ts.name='SYSTEM';
2) Entre na ferramenta RMAN do Oracle:
     [oracle@rac1 racdb]$ rman target / nocatalog
3) Copie o datafile para o novo diskgroup:
     RMAN> backup as copy tablespace system format '+DG_DISK1';
4) Tire o banco de dados do ar:
     RMAN> shutdown immediate;
5) Reinicie o banco com a opção MOUNT:
    RMAN> startup mount;
6) Informe a nova localização do datafile:
    RMAN> switch tablespace system to copy;
7) Execute a recuperação do banco de dados:
    RMAN> recover database;
8) Abra o banco:
    RMAN> alter database open;

Para a tablespace SYSAUX a sequencia é a mesma, ok?

Felizmente na versão 11g já existe um opção para copiar arquivos dentro do próprio ASM. A coisa tá melhorando...


Abraços e Sucesso!

Luis Adelson
PS. As vezes fico sem escrever porque acho que alguns artigos são simples demais. Vocês poderiam sugerir algum assunto para ser dismitificado aqui?

quarta-feira, 19 de janeiro de 2011

Como adicionar o terceiro nó no Oracle RAC

Voltando de uma longas férias... Que nada eu estava mesmo é envolvido em outros projetos.

O roteiro a seguir descreve de forma bastante simples "Como adicionar o terceiro nó no Oracle RAC". Qualquer dúvida, entre em contato!

----


#1 - Configure o Sistema Operacional do terceiro nó

Instale o sistema operacional com as mesmas opções configurados nos outros nós do cluster

Modifique o arquivo /etc/hosts para incluir este novo servidor por exemplo: rac1, rac1-priv, rac1-vip, rac2, ...

Faça ajustes nas configurações de rede

A partir da versão 9i, a Oracle passou a usar o protocolo UDP no sistema operacional Linux para comunicação IPC (inter-process communication), ou seja, a comunicação entre caches das instâncias dentro do RAC (cache fusion). A Oracle recomenda que se façam ajustes nos parâmetros padrões (default e máximo) do tamanho do buffer de recepção e de envio para 256 KB. Estes buffers são usados pelos protocolos TCP e UDP para armazenar os dados até serem lidos pela aplicação.

Modifique os seguintes parâmetros no arquivo /etc/sysctl.conf :

# Default setting in bytes of the socket receive buffer
net.core.rmem_default=262144

# Default setting in bytes of the socket send buffer
net.core.wmem_default=262144

# Maximum socket receive buffer size which may be set by using
# the SO_RCVBUF socket option
net.core.rmem_max=262144

# Maximum socket send buffer size which may be set by using
# the SO_SNDBUF socket option
net.core.wmem_max=262144

Confirme a alteração executando o comando:

# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144



Crie o usuário oracle e o grupo dba com os mesmos uid e gid dos outros nós configurados no cluster.

# groupadd -g 501 oinstall
# groupadd -g 502 dba
# useradd -m -u 501 -g oinstall -G dba -d /home/oracle -s /bin/bash -c "usuario Oracle" oracle
# id oracle uid=501(oracle) gid=501(oinstall) groups=501(oinstall),502(dba)

Crie CRS_HOME e ORACLE_HOME e conceda os mesmos privilégios dos outros nós.

# mkdir -p /u01/app/oracle
# chown -R oracle:oinstall /u01/app/oracle
# chmod -R 775 /u01/app/oracle

Configure os parâmetros do kernel e hancheck-timer.

Configure os nós do RAC para permitir acesso remoto (ssh ou rsh)

#2 - Adicione o nó ao cluster
execute o script: addNode.sh a partir do diretório: $ORA_CRS_HOME/oui/bin em um dos servidores que participa do RAC.

Clique em NEXT

Especifique o nó que está sendo adicionado. Será apresentada a tela "Cluster Node Addition Progress". Em seguida, deve-se executar os scripts rootaddnode.sh, orainstRoot.sh, root.sh logado com o usuário root.

Siga o processo de execução dos scripts em cada servidor, conforme orientação.

#3 - Instale o software RAC no novo nó da rede

Exceute o script em um dos nós já configurados no RAC:
$ORACLE_HOME/oui/bin/addNode.sh

Clique em NEXT

Na tela "Specify Cluster Nodes to Add to Installation", informe o nó que você prentende instalar e clique em NEXT.

Na tela "Cluster Node Addition Summary", clique next

Será apresentada a tela "Cluster Node Addition Progress" e você será solicitado a executar o script logado com o usuário root:
run root.sh

Será apresentada a tela "End of Installation" para sair da instalação.

Execute no prompt:
$ORACLE_HOME/bin/vipca -nodelist <novo nó> (por exemplo rac3)

A tela de boas vindas VIPCA aparecerá, clique em NEXT

Adicione o IP virtual do novo nó e clique em NEXT.

A tela "Summary" será mostrada, clique em Install.

Aparecerá a tela de progresso da instalação criando e iniciando o recurso de CRS. Após o término, Clique OK, veja os resultados da configuração e clique em EXIT.

Veja se a informação sobre o Interconnect está corret com o comando:

oifcfg getif

Se for preciso mudá-la use o comando:

oifcfg setif <nome da interface>/<ssubrede>:<interconnect|publica>


Exemplo:

oifcfg setif -global eth1/10.10.10.0:cluster_interconnect
ou
oifcfg setif -node <nome do nó> eth1/10.10.10.0:cluster_interconnect

#4 - Reconfigure o LISTENER para o novo nó

Execute NETCA no novo nó

Escolha "Cluster Configuration", clicque em NEXT

Selecione o nó que está instalando o listener, clique em NEXT

Escolha "Listener configuration", clique NEXT.

Selecione "Reconfigure", clique NEXT.

Escolha o listener que deseja reconfigurar, clique NEXT.

Selecione o protocolo, clique NEXT.

Selecione o port, clique NEXT.

Escolha a opção de não configurar outro listener para sair.

Se aparecer a mensagem: "The information provided for this listener is currently in use by another listener...". Clique YES para aceitar.

Aparecerá então a tela "Listener Configuration Complete", clique NEXT.

Clique "Finish" para deixar o aplicativo NETCA

Execute o comando crs_stat para ver se o listener do recurso CRS foi criado.

Examplo: cd $ORA_CRS_HOME/bin ./crs_stat

O novo listener provavelmente estará OFFLINE. Inicie o serviço com o comando:

srvctl start nodeapps -n <novo nó>

Uso comando crs_stat para confirmar se os serviços VIP's, GSD's, ONS's, e listeners estão ONLINE.

#5 - Crie a instância via DBCA

Execute o comando DBCA de um dos nós existentes

Na tela de boas vindas escolha "Oracle Real Application Clusters", clique NEXT.

Selecione "Instance Management", clique NEXT.

Selecione "add an instance", clique NEXT.

Escolha o banco de dados ao qual será adicionada a instância e especifique um usuário com privilégios SYSDBA. clique NEXT duas vezes.

Selecione o nome correto para instância e nó do cluster, clique NEXT.

Confira as configurações de storage, clique NEXT.

Confira a tela com o resumo da instalação e clique OK.

Após término da instalação, quando perguntado se deseja executar outra operação escolha “NO” para sair do aplicativo DBCA

Para conferir se a instalação terminou corretamente, entre em um dos servidores e consulte a view gv$instance, deverão aparecer todos os nós configurados.

Inicie o novo serviço de banco de dados:

$ srvctl start service -s <servico> -d <banco> -i <instancia nova>


Parabéns, Você adicionou mais uma instância ao seu banco de dados RAC!

terça-feira, 23 de novembro de 2010

Como converter uma instância simples (Single Instance) para Oracle RAC?

Neste artigo veremos um passo-a-passo sobre um método manual para converter um instância Simples (single instance) para Oracle database RAC

Informações sobre a instância:

    ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1   
    ORACLE_SID=prod

Localização dos datafiles = /u03/oradata/prod — /u03 está em formato de arquivo OCFS.

Se seus arquivos estão em sistema de arquivo diferente e não compartilhado, você deve compia-los e renomeá-los quando for o caso.

Versão do banco de dados = 10g R2 (10.2.0.1.0)

Passos para conversão dem uma instância simples "single instance" para RAC

Passo 1) Instale o software clusterware em todos os nós que você usará o RAC

Para detalhes de como instalar o software clusterware, veja o link: http://www.viniciusdba.com.br/blog/?p=316 (sempre em português!). As nomenclaturas de diretórios e detalhes de instalação estarão diferentes, informarei sempre as que estou usando.

Basicamente você precisa configurar o endereço IP e outros arquivos do sistema operacional e variáveis de ambiente, antes de instalar o clusterware. Veja o que o blog apresenta uma solução completa.

Importante: A versão do software clusterware deve ser igual a do banco de dados, nunca misture as versões!!

Detalhes da instalação do software clusterware:

    Nome do Cluster : crs
    Diretório de instalação do Cluster : /u01/app/oracle/product/10.2.0/crs
    Diretório do OCR  : /u03/oracrs/ocr.ora
    Diretório do Voting disk : /u03/oracrs/vote.crs

Passo 2) instale o banco de dados Oracle RAC em cluster 10g

Novamente siga as dicas excelentes deste blog: http://www.viniciusdba.com.br/blog/?p=396

Lembrando agora outro fato importante, a versão deste ambiente em RAC deve ser obrigatoriamente a mesma que você estava usando quando tinha uma só instância.

Detalhes da instalação:

    RAC ORACLE_HOME=/u01/app/oracle/product/10.2.0/db
    Número de instâncias = 2
    Nome dos nós para as 2 instãncias = ocvmrh2103, ocvmrh2190

/u01 não está sendo compartilhado entre os nós do cluster.

Passo 3) Faça um backup da sua instância e recupere este backup na partição que está sendo compartilhada (BACKUP/RESTORE).

    Se você estiver usando usando ASM, esta é a forma mais rápida:
        a) Monte os discos usando o caminho do diretório dos datafiles: 
        mkdir /mnt/datafile
        mount /hostdobancooriginal/diretorio/datafile /mnt/datafile -o user=usuario
        >>>informe a senha

        b) Faça o backup (cópia) do seu banco direto para os discos ASM usando o rman
        rman target system/system123@sid
        convert datafile '/mnt/datafile/system01.dbf' format '+disk/datafile/system01.dbf' ;

Passo 4) Faça uma cópia do seu init.ora e adicione os parâmetros para o RAC:

    bash-3.00$ cp initprod.ora /tmp/initprod.ora

    Parâmetros novos no arquivo /tmp/initprod.ora, perceba que as instância agora são numeradas 1 e 2, ok?

    *.cluster_database = TRUE
    *.cluster_database_instances = 2
    *.undo_management=AUTO
    prod1.undo_tablespace=UNDOTBS1
    prod1.instance_name=prod1
    prod1.instance_number=1
    prod1.thread=1
    prod1.local_listener=listener_ocvmrh2103
    prod2.instance_name=prod2
    prod2.instance_number=2
    prod2.local_listener=listener_ocvmrh2190
    prod2.thread=2
    prod2.undo_tablespace=UNDOTBS2

Passo 5) Altere a informação sobre a nova localização do arquivo de controle (controlfile), no arquivo  /tmp/initprod.ora

Passo 6) Cria seu SPFILE
    SQL> create spfile='/u03/oradata/prod/spfileprod.ora' from pfile='/tmp/initprod.ora';

Passo 7) Copie o spfile criado para o diretório : ORACLE_HOME/dbs e crie um novo pfile a partir dele.

    bash-3.00$ cp spfileprod.ora /u01/app/oracle/product/10.2.0/db/dbs/spfileprod.ora
    bash-3.00$ pwd
        /u01/app/oracle/product/10.2.0/db/dbs
    bash-3.00$ cat initprod1.ora
        spfile='/u01/app/oracle/product/10.2.0/db/dbs/spfileprod.ora'

Passo 8) Cria um novo arquivo de senha (password) para a instância prod1 embaixo do Oracle_home do RAC

    bash-3.00$ orapwd file=orapwprod1 password=welcome1

Passo 9) inicialize o banco de dados no modo "MOUNT" e troque os nomes dos datafile e redo log para sua nova localização.

----->>>>Antes confirme se sua varável de ambiente ORACLE_HOME está configurada corretamente:

    bash-3.00$ echo $ORACLE_HOME
    /u01/app/oracle/product/10.2.0/db   
    bash-3.00$ echo $ORACLE_SID
    prod1
   
    SQL> startup mount pfile=initprod1.ora
    ORACLE instance started.

    Total System Global Area  838860800 bytes
    Fixed Size                  1222168 bytes
    Variable Size             213912040 bytes
    Database Buffers          620756992 bytes
    Redo Buffers                2969600 bytes
    Database mounted.

Passo 10) Adicione a sugunda partição do RAC (thread) que irá atender a instância 2

    SQL> alter database add logfile thread 2 group 4 ('/u03/oradata/prod/redo2_01.dbf') size 50M, group 5 ('/u03/oradata/prod/redo2_02.dbf') size 50M, group 6     ('/u03/oradata/prod/redo2_03.dbf') size 50M;
    Database altered.

    SQL> ALTER DATABASE OPEN;
    Database altered.

    SQL> alter database enable public thread 2;
    Database altered.

Passo 11) Crie UNDO tablespace para a instância 2

O nome desta tablespace deve ser o mremos que você especificou no arquivo init.ora no passo 4.

    QL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '/u03/oradata/prod/undotbs2_01.dbf' size 25M;
    ablespace created.

Passo 12) Crie as visões (views) específicas para cluster na instância 1

    QL> @?/rdbms/admin/catclust.sql

Passo 13) No segundo nó do cluster:

Configure o ORACLE_HOME e o SID

    bash-3.00$ export ORACLE_HOME=/u01/app/oracle/product/10.2.0/db
    bash-3.00$ export ORACLE_SID=prod2

Crie o arquivo initprod2.ora igual ao initprod1.ora (da primeira instância). Lembre de copiar também o arquivo spfile para este segundo nó de cluster.

    bash-3.00$ pwd
    /u01/app/oracle/product/10.2.0/db/dbs
    bash-3.00$ ls -lrt spfileprod.ora
    -rw-r-----  1 oracle oinstall 3584 Feb 19 12:36 spfileprod.ora
    bash-3.00$ cat initprod2.ora
    spfile='/u01/app/oracle/product/10.2.0/db/dbs/spfileprod.ora'

Passo 14) Crie um novo arquivo de senhas (password) para esta instância

    bash-3.00$ orapwd file=orapwprod2 password=welcome1

Passo 15) Crie os diretórios (mkdir) para os arquivos, conforme informado no init.ora,  abaixo:
    audit_file_dest
    background_dump_dest
    user_dump_dest
    core_dump_dest


Passo 16) Inicialize a segunda instância

    SQL> startup pfile=initprod2.ora
    ORACLE instance started.

    Total System Global Area  838860800 bytes
    Fixed Size                  1222168 bytes
    Variable Size             213912040 bytes
    Database Buffers          620756992 bytes
    Redo Buffers                2969600 bytes
    Database mounted.
    Database opened.


Passo 17) Agora é só adicionar os serviços do cluster

    bash-3.00$ srvctl add database -d prod -o /u01/app/oracle/product/10.2.0/db -p /u03/oradata/prod/spfileprod.ora
    bash-3.00$ srvctl add instance -d prod -i prod1 -n OCVMRH2103
    bash-3.00$ srvctl add instance -d prod -i prod2 -n OCVMRH2190


Referência:
Metalink Note ID : 747457.1


Fique à vontade para tirar dúvidas comigo. Espero que você tenha Sucesso!


Luis Adelson.

sábado, 13 de novembro de 2010

ORA-600 erro genérico

Já tive problemas com ORA-600 que demorou dias para o suporte Oracle resolver, aliás ainda tenho um chamado aberto no Metalink aguardando solução.

O que a Oracle fez? Mandou que nós alterássemos o modo de conexão do banco de shared para dedicated. Ou seja, não podemos mais usar pool de conexões. Parece engraçado, mas não é tanto assim. Pois deram uma solução paliativa, ou solução quebra-galho, fazer o quê?


No entanto, encontrei este artigo muito bom do Rodrigo Almeida e gostaria de compartilhar aqui. Aproveitem que esse cara manja do assunto.

http://www.rodrigoalmeida.net/blog/achei-um-ora-600-o-que-faco

Parabéns mais uma vez Rodrigo!


Adelson Luniere.