terça-feira, 6 de setembro de 2016

ERRO ORACLE ORA-1033


O erro ORA-1033, conforme descrito abaixo ocorre de forma intermitente no ambiente RAC 12c com pluggable database.

Em diversas tentativas de conexão, algumas ocorrem com sucesso e outras apresentam o erro abaixo:

ORA-01033: ORACLE initialization or shutdown in progress
ID do Processo: 0
ID da Sess o: 0 N mero de s rie: 0


Esse problema pode ocorrer devido a 2 fatores:


1 - O banco de dados pluggable (PDB) pode não estar "aberto" em todas as instâncias do RAC;
2 - O service name usado para conectar no PDB possui o mesmo nome do próprio PDB.

Obs.:

Usar o mesmo nome do PDB para o service name que fará a conexão ao banco (PDB) não é uma prática recomendável pela Oracle, pois poderá causar o erro ORA-1033


Para solucionar o problema podemos:

1 - Abrir o PDB em todas as instâncias do RAC

Para abir o PDB em todas as intâncias de um ambiente RAC, podemos utilizar o comando abaixo:

SQL> alter pluggable database PDB01 open;



2 - Criar um service name com um nome diferente do PDB

Para isso, devemos:

a) Criar um novo service

$ORACLE_HOME/bin/srvctl add service -database <nome_do_banco_de_dados> -pdb <nome_do_pdb> -s <nome_do_serviço> -r '<Instâncias_do_banco_1>,<Instâncias_do_banco_2>,<Instâncias_do_banco_3>'

Ex.:

$ORACLE_HOME/bin/srvctl add service -database cdb1 -pdb pdb_01 -s pdb_acesso -r 'cdb11,cdb12,cdb13'



b) Iniciar o serviço no ambiente

$ORACLE_HOME/bin/srvctl start service -database <nome_do_banco_de_dados> -service <nome_do_serviço>

Ex.:

$ORACLE_HOME/bin/srvctl start service -database cdb1 -service pdb_acesso


c) Verificar se o serviço está ativo

$ srvctl status service -d <nome_do_banco_de_dados>

Ex.:

$ srvctl status service -d cdb1

Service pdb_acesso is running on instance(s) cdb11,cdb12,cdb13



d) Alterar o arquivo tnsnames.ora

Após a criação do serviço no ambiente do banco de dados, é necessário incluir a entrada desse serviço no arquivo tnsnames.ora

cd $ORACLE_HOME/network/admin

Editar o arquivo tnsnames.ora

vi tnsnames.ora

Exemplo de entrada no arquivo tnsnames.ora


pdb_acesso=
(description=
(load_balance=on)
         (failover=on)
           (address=
             (protocol=tcp)
               (host=10.12.123.12)
               (port=1521)
           )
           (address=
             (protocol=tcp)
             (host=10.12.123.21)
             (port=1521)
           )
           (connect_data=
             (server=dedicated)
             (service_name=pdb_acesso)
           )
          )



Podemos ainda testar a entrada configurada no arquivo tnsnames.ora com o comando tnsping

$ tnsping pdb_acesso

Se a configuração estiver correta, teremos uma resposta semelhante a descrita abaixo:

TNS Ping Utility for IBM/AIX RISC System/6000: Version 12.1.0.2.0 - Production on 15-JUL-2016 08:50:46

Copyright (c) 1997, 2014, Oracle.  All rights reserved.

Used parameter files:
$ORACLE_HOME/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (description=(load_balance=on)(failover=on)(address=(protocol=tcp)(host=10.12.123.12)(port=1521))(address=(protocol=tcp)(host=10.12.123.21)(port=1521))(connect_data=(server=dedicated)(service_name=pdb_acesso)))
OK (0 msec)




e) Verificar dentro do banco de dados se o serviço está criado

Podemos também verificar por dentro do banco de dados se o serviço que criamos está realmente sendo reconhecido.

Para isso, devemos executar:

$ sqlplus / as sysdba

Set lines 200

SQL> select name, pdb, inst_id from gv$services;

NAME                                                             PDB                               INST_ID
----------------------------------------------------- ------------------------------ ----------
pdb_acesso                                                          PDB                                  1
pdb                                                                      PDB                                  1
cdb1XDB                                                         CDB$ROOT                        1
cdb1.world                                                       CDB$ROOT                        1
SYS$BACKGROUND                                    CDB$ROOT                        1
SYS$USERS                                                    CDB$ROOT                        1
pdb_acesso                                                          PDB                                  2
pdb                                                                      PDB                                  2
cdb1XDB                                                         CDB$ROOT                        2
cdb1.world                                                       CDB$ROOT                        2
SYS$BACKGROUND                                    CDB$ROOT                        2
SYS$USERS                                                    CDB$ROOT                        2



Podemos perceber que o serviço criado está na lista de serviços do banco de dados.




Referências:

https://en.wikibooks.org/wiki/RAC_Attack_-_Oracle_Cluster_Database_at_Home/RAC_Attack_12c/Service_Failover

Connecting To A 12c RAC Pluggable Database Intermittently Fails With ORA-1033 (Doc ID 1998112.1)