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?