External Database é um recurso da Oracle Cloud Infrastructure que permite monitorar um banco de dados Oracle On-Premises através da Console OCI. Isso é possível graças a um agente instalado no servidor on-premises, responsável por fazer a conexão entre o banco de dados e a Cloud Oracle. O processo é bem similar ao de instalar um agente do Enterprise Manager Cloud Control.
Um detalhe interessante é que não é necessário configurar nenhum tipo de VPN, Gateway ou abertura de portas em Firewall para que a Cloud Oracle se conecte ao servidor de banco de dados. O agente é instalado de forma offline através de um pacote RPM e em seguida, o agente é configurado com uma chave que permite o mesmo se conectar a Cloud da Oracle diretamente ao nosso Tenancy. Dessa forma, é o agente que abre uma conexão com a OCI e não o contrário.
Neste post, demonstrarei como configurar um External Database, procedimento que terá os seguintes passos:
- Configurar os pré-requisitos no Tenancy / Compartment
- Instalar e configurar o agente
- Configurar a conexão com o Database (equivalente a “adicionar um alvo” no EMCC)
- Habilitar o serviço Management Database
Configurar Pré Requisitos
Precisamos criar explicitamente uma Policy que conceda a permissão para os agentes acessarem o Tenancy, pode ser para um grupo de usuários existente, mas neste exemplo criei um grupo específico para controlar quais usuários na conta OCI poderão administrar os agentes.

Dynamic Group
A Policy que iremos criar também precisa um Dynamic Group vinculando todos os recursos do tipo “managementagent” para um Compartment específico.
A seguir criarei um Dynamic Group chamado “dg_external_agents” para o OCID do compartment “dibiei”.
Crie um Dynamic Group:

Informe uma regra nesse formato:
ALL {resource.type='managementagent', resource.compartment.id='<OCID do Compartment>'}

Dynamic Group criado:

Policy
Nesta etapa criamos uma policy com as permissões necessárias para os agents comunicarem com o nosso Tenancy.
Crie uma nova Policy

ALLOW GROUP <nome do grupo> TO MANAGE management-agents IN COMPARTMENT <nome do compartment>
ALLOW GROUP <nome do grupo> TO MANAGE management-agent-install-keys IN COMPARTMENT <nome do compartment>
ALLOW GROUP <nome do grupo> TO READ METRICS IN COMPARTMENT <nome do compartment>
ALLOW GROUP <nome do grupo> TO READ USERS IN TENANCY
ALLOW DYNAMIC-GROUP <nome do dynamic group> TO MANAGE management-agents IN COMPARTMENT <nome do compartment>
ALLOW DYNAMIC-GROUP <nome do dynamic group> TO USE METRICS IN COMPARTMENT <nome do compartment>
ALLOW DYNAMIC-GROUP <nome do dynamic group> TO USE tag-namespaces in compartment <nome do compartment>
Abaixo estou criando a policy “policy_external_agents”, usando o grupo “agent_admin” e dynamic group “dg_external_agents”:

Policy criada:

Instalação do Agent
Abra a tela dos agents:

Na etapa de configuração do agente, precisamos informar uma chave que identifica e permite acesso ao Tenancy. Essa chave é usada somente durante a configuração, por isso podemos criar com um prazo de validade, por questões de segurança.
Crie uma nova chave:

Faça download do agente (pacote rpm) e copie para o servidor de banco de dados:


ManagementAgentInstallKey = <Chave Gerada na Console OCI> CredentialWalletPassword = <Uma senha alfanumérica de 8 caracteres>
Exemplo:

Neste exemplo, o pacote RPM foi copiado para o diretório /tmp:
[root@lab02 ~]# ls -l /tmp total 51788 -rw-r--r-- 1 root root 398 Sep 2 21:12 oci_agent.rsp -rw-r--r-- 1 oracle oinstall 53025492 Sep 2 21:14 oracle.mgmt_agent.rpm [root@lab02 ~]#
O agente requer o JDK 8 com versão mínima 8u281:
# java -version -bash: java: command not found
Optei por instalar o Open JDK via yum:
# yum install java -y Loaded plugins: ulninfo Resolving Dependencies --> Running transaction check ---> Package java-1.8.0-openjdk.x86_64 1:1.8.0.302.b08-0.el7_9 will be installed --> Processing Dependency: java-1.8.0-openjdk-headless(x86-64) = 1:1.8.0.302.b08-0.el7_9 for package: 1:java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64 --> Processing Dependency: fontconfig(x86-64) for package: 1:java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64 --> Processing Dependency: gtk2(x86-64) for package: 1:java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64 --> Processing Dependency: libXcomposite(x86-64) for package: 1:java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64 --> Processing Dependency: libjava.so(SUNWprivate_1.1)(64bit) for package: 1:java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64 ........ python-javapackages.noarch 0:3.4.1-11.el7 python-lxml.x86_64 0:3.2.1-4.el7 ttmkfdir.x86_64 0:3.0.9-42.el7 tzdata-java.noarch 0:2021a-1.el7 xorg-x11-font-utils.x86_64 1:7.5-21.el7 xorg-x11-fonts-Type1.noarch 0:7.5-9.el7 Complete!
JDK instalado:
# java -version

Instale o pacote rpm:
# rpm -Uvh /tmp/oracle.mgmt_agent.rpm

Agora execute a configuração do agente usando o arquivo de resposta criado anteriormente:
# /opt/oracle/mgmt_agent/agent_inst/bin/setup.sh opts=/tmp/oci_agent.rsp

Na console OCI, o agente já deve aparecer como Active:

Configurar Conexão com Database
Primeiro precisamos criar um recurso para ser apresentado como um Database na console OCI e servir como interface de gerenciamento para o database hospeado externamente (esse recurso é referenciado como “handle” na documentação):
Se o banco for 12c ou superior, verifique se é um Container Database:
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> SELECT NAME, CDB FROM V$DATABASE;
NAME CDB
--------- ---
DB12C NO
Neste caso é um non-CDB.
Desbloqueie o usuário DBSNMP para ser usado pelo agente da OCI:
SQL> ALTER USER DBSNMP IDENTIFIED BY "Abc#2021" ACCOUNT UNLOCK;
User altered.
Conceda os seguintes GRANTs para o usuário DBSNMP:
-- se for um non-CDB, execute esses:
GRANT CREATE PROCEDURE to dbsnmp;
GRANT SELECT ANY DICTIONARY, SELECT_CATALOG_ROLE to dbsnmp;
GRANT ALTER SYSTEM to dbsnmp;
GRANT ADVISOR to dbsnmp;
GRANT EXECUTE ON DBMS_WORKLOAD_REPOSITORY to dbsnmp;
-- se for um CDB, execute esses
GRANT CREATE PROCEDURE to dbsnmp CONTAINER=ALL;
GRANT SELECT ANY DICTIONARY, SELECT_CATALOG_ROLE to dbsnmp CONTAINER=ALL;
GRANT ALTER SYSTEM to dbsnmp CONTAINER=ALL;
GRANT ADVISOR to dbsnmp CONTAINER=ALL;
GRANT EXECUTE ON DBMS_WORKLOAD_REPOSITORY to dbsnmp CONTAINER=ALL;
Na console OCI, acesse a tela de External Databases:

Selecione a opção de acordo com tipo de banco de dados sendo configurado (non-CDB ou CDB/PDB). Neste exemplo, é um non-CDB:

Informe um Display Name, não precisa ser igual ao nome do banco de dados, mas é uma boa ideia usar um nome igual para facilitar a identificação do database na console.

O recurso é criado instantaneamente e fica com status NOT CONNECTED. Clique em “Connect to External Non-CDB” para configurar a conexão entre o agente e o banco de dados:

Nessa etapa é onde configuramos os dados de acesso ao banco de dado, como IP/Porta, Service Name e credenciais de acesso.
Em “Connector display name“, informe qualquer nome que desejar. Estou usando o padrão con_<nome do banco>:

Informe o IP, nome do servidor ou nome do SCAN (se for RAC). Note que a conexão é originada a partir do agente instalado no servidor de banco de dados e não a partir da OCI, então usamos o IP interno como em qualquer outra conexão normal para o banco.
Neste exemplo estou usando o IP:

Por fim, informe o usuário e senha do banco de dados. No prefixo do nome da credential que ficará salva no agente, pode ser qualquer valor, estou usando o nome do database apenas por padronização:

Nota: Se optar conectar com o usuário SYS, selecione a role SYSDBA
Aguarde o agente configurar a conexão com o banco de dados:

Habilitar o Serviço Management Database
O serviço de Management Database é que permite monitorar o banco de dados através da OCI, usando as métricas nativas da OCI e também a visão do Active Session History (ASH).
A partir daqui o serviço tem um custo e devemos escolher o tipo de licença do banco de dados.
Volte para a tela principal do database:

Clique em “Enable” na opção Database Management:

Selecione o conector criado anteriormente, selecione o tipo de licença para esse database e clique em Enable:

Aguarde o procedimento concluir:

Visão Geral dos Gráficos Disponíveis
Clique em Performance Hub:


Selecione “Database” na opção do Time Zone para o gráfico ser apresentado de acordo ao horário do banco de dados:

Aproveite os gráficos do ASH, no mesmo padrão do Enterprise Manager Cloud Control:

SQL e Sessões mais custosas para o banco de dados:

SQL em execução a mais de 5 segundos:

É possível gerar relatórios do AWR e ASH:

Gerando um relatório AWR:
A seleção do intervalo de análise é realizada por data e horário, não pelo número de snapshot (ele pega o snapshot mais próximo do horário selecionado). Por padrão, ele seleciona automaticamente os dois últimos snapshots:

Após selecionar o período, clique em download.
Um relatório no formato HTML será baixado na sua máquina local:

Para relatórios ASH:

Voltando a tela principal do database, também temos a visão das métricas padrão da console OCI:


Adicionando um Container Database
Para adicionar um Container Database e Pluggable Database é praticamente o mesmo processo de um non-CDB, apenas atentar ao detalhe de que para adicionar um PDB, o CDB deve ser adicionado antes. Também, o fato de adicionar um CDB não traz todos os PDBs automaticamente, precisamos configurar a conexão manualmente para cada PDB (Isso em 02/09/2021).
Neste exemplo, vou adicionar um CDB na versão 19c, contendo apenas 1 PDB com nome SALES.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> SELECT NAME, CDB FROM V$DATABASE;
NAME CDB
--------- ---
CDB19C YES
SQL> SHOW PDBS;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 SALES READ WRITE NO
SQL>
Desbloqueando o usuário DBSNMP e concedendo os GRANTS:
SQL> ALTER USER DBSNMP IDENTIFIED BY "Abc#2021" ACCOUNT UNLOCK;
User altered.
SQL> GRANT CREATE PROCEDURE to dbsnmp CONTAINER=ALL;
Grant succeeded.
SQL> GRANT SELECT ANY DICTIONARY, SELECT_CATALOG_ROLE to dbsnmp CONTAINER=ALL;
Grant succeeded.
SQL> GRANT ALTER SYSTEM to dbsnmp CONTAINER=ALL;
Grant succeeded.
SQL> GRANT ADVISOR to dbsnmp CONTAINER=ALL;
Grant succeeded.
SQL> GRANT EXECUTE ON DBMS_WORKLOAD_REPOSITORY to dbsnmp CONTAINER=ALL;
Grant succeeded.
Na console OCI, acesse novamente a página de External Databases e selecione a opção Container Databases:

Sigas os mesmos passos demonstrados com um non-CDB.
Após configurar o Container Database, volte a tela principal do database recém adicionado e clique em Register Pluggable Databases:

Defina o Display Name, não precisa ser igual ao nome do PDB, mas recomendo seguir esse padrão:

O PDB também fica com status NOT CONNECTED e precisamos criar um conector, assim como foi feito para o CDB:

Use os mesmos dados de conexão que foram utilizados para o CDB, alterando apenas o SERVICE_NAME que é o nome do PDB:

Após concluir a configuração da conexão, volte a tela do PDB e siga os passos para habilitar o Database Management (assume-se que já habilitou no CDB):

Na etapa de selecionar o tipo de licença, o PDB herda a licença do CDB:

Note que Database Management deve ser habilitado no CDB antes de habilitar no PDB para evitar o erro a seguir:
Database Management must be enabled for the associated external container database before it can be enabled for the external pluggable database.
Scan Pluggable Database
Você pode descobrir quais PDBs ainda não foram configurados na console OCI clicando em Scan for Pluggable Databases, mas esse processo não configura os PDBs automaticamente, apenas lista os nomes.
Os nomes dos PDBs são listados nas mensagens de log da Work Request gerada pela operação de Scan:

Conclusão
O recurso de External Databases se apresenta como uma solução interessante para consolidar a visão e gerenciamento dos bancos de dados Oracle em um ambiente híbrido (Cloud + On-premises). Apesar de atualmente os recursos serem mais voltados a monitoramento de status e de performance, é de se esperar que futuramente possamos gerenciar o ciclo de vida das instâncias e consultar outras informações, como status dos backups, replicação, etc.
Em adicional, ainda é possível usar outros serviços da OCI, como Operation insights e Fleet Summary+Database Groups.