Aplica-se a:
Banco de dados Oracle – Oracle 12cR1 12.1.0.1.0 Enterprise Edition
Sistemas operacionais – Oracle Linux 6.4 com kernel 2.6.39-400.109.17.1.el6uek.x86-64 e
Red Hat Enterprise Linux com kernel 2.6.32-431.el6.x86_64
Plataformas de armazenamento – Dell EqualLogic PS 5000 e Dell EqualLogic PS 6110
Problema:
Como se conectar a bancos de dados conectáveis no Oracle RAC 12cR1?
Solução:
Há quatro maneiras possíveis de estabelecer uma conexão com bancos de dados conectáveis (PDBs).
- Usando o serviço padrão com o mesmo nome do nome da PDB, que é criado automaticamente pelo software da base de dados.
- Usando serviços definidos pelo usuário, criados com a propriedade PDB pelo utilitário SRVCTL que associa o serviço a bases de dados conectáveis
- Usando o comando ‘session’ e configurando o contêiner para o contêiner desejado
- Usando o Enterprise Manager Express
1. Usando o serviço padrão para estabelecer conexão com o PDB
Para estabelecer uma conexão com o PDB usando o serviço padrão, realize o seguinte procedimento.
- Deve-se fazer uma entrada no arquivo tnsnames.ora que defina os endereços de bases de dados para permitir estabelecer uma conexão com a base de dados.
- O status da PDB precisa ser alterado de “montado” para o modo de gravação e leitura.
Entrada a ser feita no arquivo tnsnames.ora:
No caso do Oracle RAC 12c, embora um serviço padrão com o mesmo nome do banco de dados conectável seja automaticamente criado pelo software do banco de dados, o arquivo tnsnames.ora é gerado apenas com uma única entrada, pertencente ao banco de dados global. Por exemplo, no caso do Oracle RAC 12c de dois nós, em que cpdb é o banco de dados global, pdb1 e pdb2 são dois bancos de dados conectáveis criados e cpdb1 e cpdb2 são duas instâncias, a entrada padrão no arquivo tnsnames.ora é igual à exibida abaixo:-
CPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cpdb.dbase.lab)
)
)
Dessa forma, as entradas relevantes precisam ser criadas para o nome de serviço padrão dos bancos de dados conectáveis no arquivo tnsnames.ora, conforme mostrado abaixo:
PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP) (HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1.dbase.lab)
)
)
PDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP) (HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb2.dbase.lab)
)
)
Alterando o status do banco de dados conectável:
Quado os pdbs são criados, o open_mode só pode ser "Mounted", por padrão. Isso pode ser verificado da seguinte forma:
SQL> select name, open_mode from v$pdbs;
NAME OPEN_MODE
PDB$SEED READ ONLY
PDB1 MOUNTED
PDB2 MOUNTED
O seguinte comando abre todos os bancos de dados conectáveis em um modo de leitura e gravação.
SQL> Alter pluggable database all open;
Depois, essa
conexão pode ser estabelecida com o banco de dados usando sqlplus da seguinte maneira:
[oracle@node1 bin]$ sqlplus sys/oracle@pdb1 as sysdba
SQL*Plus: Versão: 12.1.0.1.0 – Produção: terça-feira, 8 de outubro, 11:23:32 de 2013
Copyright (c) 1982, 2013, Oracle. Todos os direitos reservados.
Conectado a:
Oracle Database 12c Enterprise Edition versão 12.1.0.1.0 – Produção de 64 bits. Com as opções Particionamento, Real Application Clusters, Automatic Storage Management, OLAP, Lógica analítica avançada e Teste de aplicativos reais
2. Usando o serviço definido pelo usuário para estabelecer conexão com o PDB
O serviço padrão descrito acima deve ser usado apenas para fins administrativos e não deve ser usado para aplicativos. Os serviços sempre definidos pelo usuário precisam ser utilizados para aplicativos, pois os serviços definidos pelo usuário podem ser personalizados para atender aos requisitos dos aplicativos. Para estabelecer uma conexão usando os serviços definidos pelo usuário, deve-se realizar as seguintes etapas:
- Crie um serviço de base de dados com a propriedade PDB usando o utilitário SRVCTL
- Crie uma entrada no arquivo tnsnames.ora para o serviço criado
- Iniciar o serviço
- Conecte-se à base de dados usando o serviço com a propriedade PDB, criada na etapa A
a. Crie um serviço de banco de dados com a propriedade PDB usando o utilitário SRVCTL
Os seguintes comandos que usam o utilitário SRVCTL criam dois serviços de banco de dados, hr1 e sales1, os quais serão associados ao banco de dados conectável pdb1:
[[oracle@node1 bin]$ srvctl add service -db cpdb -service hr1 -pdb pdb1 -preferred cpdb1 -available cpdb2
[oracle@node1 bin]$ srvctl add service -db cpdb -service sales1 -pdb pdb1 -preferred cpdb1 -available cpdb2
A propriedade PDB pode ser visualizada na exibição do dicionário de dados all_services.
SQL> SELECT NAME, PDB FROM all_services;
NAME PDB
pdb1.dbase.lab PDB1
hr1 PDB1
sales1 PDB1
O comando $ srvctl config service –db <databasename> também relaciona os serviços disponíveis.
b. Crie uma entrada no arquivo tnsnames.ora para o serviço de banco de dados criado
Podemos criar HR_PDB1 e SALES_PDB1, nomes de serviços de rede que o aplicativo hr e o aplicativo sales podem usar, respectivamente, para estabelecer conexão com o banco de dados conectável, pdb1, da seguinte maneira:
HR_PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = hr1.dbase.lab)
)
)
SALES_PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales1.dbase.lab)
)
)
c. Inicie o serviço
[oracle@nsnode1 bin]$ srvctl status service -db cpdb -service hr1
Service hr1 is not running
[oracle@nsnode1 bin]$ srvctl start service -db cpdb -service hr1
Iniciar o serviço associado a um PDB abre automaticamente o PDB em um modo de leitura e gravação.
d. Estabeleça conexão com o serviço de banco de dados
Um usuário se conecta ao PDB usando um serviço de banco de dados com a propriedade PDB.
Por exemplo, o usuário SYS pode se conectar ao pdb1 usando o serviço de banco de dados HR_PDB1 associado ao pdb1, da seguinte maneira:
SQL> connect sys/oracle@HR_PDB1 AS SYSDBA
Connected.
SQL> SHOW CON_ID;
CON_ID
3
SQL> SHOW CON_NAME;
CON_NAME
PDB1
3. Usando o comando Alter Session para estabelecer conexão com o PDB
Por padrão, ao estabelecer conexão com a instância RAC, você se conecta a CDB$ROOT. Cada instância de RAC abre a PDB como um todo, e uma única imagem do sistema é disponibilizada. Quando você quiser alterar a sessão para uma PDB, pode fazer isso alterando a sessão e definindo o contêiner para o contêiner desejado. A consulta, show con_name, pode ser usada para verificar o nome do contêiner atual.
[oracle@node1 bin]$ sqlplus / as sysdba
SQL*Plus: Versão: 12.1.0.1.0 – Produção: quarta-feira, 9 de outubro, 13:56:27 de 2013
Copyright (c) 1982, 2013, Oracle. Todos os direitos reservados.
Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 – Produção de 64 bits
Com as opções Particionamento, Real Application Clusters, Automatic Storage Management, OLAP,
Lógica analítica avançada e Teste de aplicativos reais
SQL> show con_name;
CON_NAME
CDB$ROOT
SQL> ALTER SESSION SET CONTAINER = PDB1;
Session altered.
SQL> SHOW CON_NAME;
CON_NAME
PDB1
SQL> ALTER SESSION SET CONTAINER = PDB2;
Session altered.
SQL> SHOW CON_ID;
CON_ID
4
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;
Session altered.
SQL> SHOW CON_NAME;
CON_NAME
CDB$ROOT
As descrições de ID do contêiner são as seguintes:
ID do contêiner |
Descrição |
0 |
CDB completa |
1 |
CDB$ROOT |
2 |
PDB$SEED |
3 a 254 |
PDBs |
Tabela 1: Descrições do ID do contêiner
Neste exemplo específico, con_id 3 representa o pdb1 e con_id 4 representa o pdb2.
[grid@node1 bin]$ echo $ORACLE_HOME
/u01/app/12.1.0/grid
[grid@node1 bin]$ echo $ORACLE_SID
+ASM1
[grid@node1 bin]$ sqlplus / as sysdba
SQL*Plus: Versão: 12.1.0.1.0 – Produção: quarta-feira, 9 de outubro, 13:51:39 de 2013
Copyright (c) 1982, 2013, Oracle. Todos os direitos reservados.
Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 – Produção de 64 bits
Com as opções Real Application Clusters e Automatic Storage Management
SQL> show con_id;
CON_ID
0
SQL> show con_name;
CON_NAME
Non Consolidated
4. Usando o Enterprise Manager (EM) Express para estabelecer conexão com o PDB
Quando o banco de dados é criado com o Database Configuration Assistant (DBCA), no momento da conclusão, a URL do EM Express é fornecida pelo DBCA. A URL tem o formato http://<hostname>:portnumber/em com 5500 como o ID de porta padrão.
Antes de usar a URL para acessar o EM Express, é preciso emitir a seguinte declaração SQL para confirmar a porta para o EM Express:
SQL> SELECT dbms_xdb_config.gethttpsport from dual;
GETHTTPSPORT
5500
Se o resultado for conforme mostrado acima, será possível se conectar à URL exibida pelo DBCA.
No entanto, se a saída for nula, como
GETHTTPSPORT
será preciso executar o procedimento PL/SQL, DBMS_XDB_CONFIG.SETHTTPSPORT para definir a porta HTTPS para no EM Express. Por exemplo:
SQL> exec dbms_xdb_config.sethttpsport(5500);
PL/SQL procedure successfully completed.
Depois desse comando, tente acessar o EM Express usando a URL.
Uma porta HTTP também pode ser configurada para o EM Express, conforme mostrado abaixo:
SQL> select dbms_xdb_config.gethttpport from dual;
SQL> exec dbms_xdb_config.sethttpport(8080);
Para definir a porta EM Express para o pdbs, é preciso alterar o contêiner para o respectivo pdbs e executar o procedimento PL /SQL para definir a porta para o contêiner.
Depois de fazer isso, é possível verificar a porta HTTP para o cpdb, pdb1 e pdb2, da seguinte maneira:
SQL> select dbms_xdb_config.gethttpport from dual;
GETHTTPPORT
8080
SQL> alter session set container = pdb1;
Session altered.
SQL> select dbms_xdb_config.gethttpport from dual;
GETHTTPPORT
8081
SQL> alter session set container = pdb2;
Session altered.
SQL> select dbms_xdb_config.gethttpport from dual;
GETHTTPPORT
8082
NOTA: Se você ainda não conseguir se conectar à URL do EM Express, recarregue o controle de escuta como um usuário de grade e tente novamente.