Este post demonstra como criar um DB Link no Autonomous Database usando a package DBMS_CLOUD_ADMIN, usando um exemplo de conexão para outro banco de dados que está na mesma VCN que o Autonomous.
Esse tipo de conexão é possível quando o Autonomous está configurado como Private Endpoint, sendo essa uma configuração ideal para manter a conectividade do ADB com os outros servidores na mesma VCN, ou até mesmo com o OnPremise, através de uma VPN ou conexão FastConnect.
Quando configurado desta forma, a console apresenta o IP e o hostname privado do Autonomous:

Eu explico um pouco mais sobre a configuração de Private Endpoint no post:
Opções de Controle de Acesso do Autonomous Database na Oracle Cloud Infrastructure (OCI).
Regra de Saída no NSG
Antes de criar o DBLINK no Autonomous, precisamos garantir que existe uma regra de “Egress” na NSG (Network Security Group) vinculada ao Autonomous. Esta regra é necessária para permitir que o Autonomous se conecte com outro servidor na porta do Listener (exemplo, 1521).

Neste exemplo, criei uma regra mais abrangente, permitindo que o Autonomous se conecte na porta 1521 de qualquer servidor.

Criação do DBLINK com DBMS_CLOUD_ADMIN
O Autonomous Database não permite a criação de DBLINK diretamente com o comando “CREATE DATABASE LINK”, como estamos acostumados. Para realizar essa tarefa, precisamos usar a package DBMS_CLOUD_ADMIN.
Informações que serão usadas na criação do DBLINK:
| Nome do servidor de destino: | ocisrv01.emdb.emcc.oraclevcn.com |
| Porta do Listener: | 1521 |
| Service Name do BD de destino: | orclpdb |
| Nome do Usuário: | MAICON |
| Senha do Usuário: | dibiei |
1) Criando uma CREDENTIAL com a package DBMS_CLOUD para armazenar a senha do usuário do DBLINK:
SQL> BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'MAICON_DBLINK_CRED',
username => 'MAICON',
password => 'dibiei'
);
END;
/
PL/SQL procedure successfully completed.
2) Criando o DBLINK com a package DBMS_CLOUD_ADMIN.
Note que passamos o nome da CREDENTIAL criada anteriormente, ao invés de passar o nome e a senha do usuário explicitamente.
SQL> BEGIN
DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
db_link_name => 'LK_ADB_TO_IAAS',
hostname => 'ocisrv01.emdb.emcc.oraclevcn.com',
port => '1521',
service_name => 'orclpdb',
ssl_server_cert_dn => NULL,
credential_name => 'MAICON_DBLINK_CRED',
directory_name => NULL,
private_target => TRUE);
END;
/
PL/SQL procedure successfully completed.
4) Testando a conexão do DBLINK:
SQL> select * from dual@LK_ADB_TO_IAAS;
D
-
X
Atualizando a Senha do Usuário do DBLINK
Caso a senha do usuário tenha sido alterada no banco de destino, usamos esse comando para atualizar a CREDENTIAL dele no Autonomous:
BEGIN
DBMS_CLOUD.UPDATE_CREDENTIAL(
credential_name => 'MAICON_DBLINK_CRED',
attribute => 'password',
value => 'novaSenha'
);
END;
/
Dropando DBLINK
Para dropar o DBLINK, também usamos a package DBMS_CLOUD_ADMIN:
EXEC DBMS_CLOUD_ADMIN.DROP_DATABASE_LINK(db_Link_name => 'LK_ADB_TO_IAAS');
Senão for recriar o DBLINK, podemos dropar a CREDENTIAL:
EXEC DBMS_CLOUD.DROP_CREDENTIAL(credential_name => 'MAICON_DBLINK_CRED');
Erros comuns
No Autonomous é mandatório usar o hostname ao invés do IP do servidor quando criamos um DBLINK. A criação do DBLINK com a DBMS_CLOUD_ADMIN não apresentará erro, mas a tentativa de usar o DBLINK sim:
ORA-28864: SSL connection closed gracefully
Se o hostname não puder ser resolvido ou redirecionado pelo DNS Resolver da VCN do Autonomous, você recebe esse erro ao tentar usar o DBLINK:
ORA-12545: Connect failed because target host or object does not exist
Nos DBLINKs que conectam em um banco sem usar wallet, o parâmetro “directory_name” precisa ser passado como NULL, senão a tentativa de usar o DBLINK retorna o erro:
ORA-28759: failure to open file
Se receber o seguinte erro e tiver confirmado que o banco de destino está ativo, revise toda a parte de NSG, Security List e qualquer Firewall envolvido:
ORA-12170: TNS:Connect timeout occurred