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)