Configure uma base de dados Oracle do Amazon RDS para CDC

Esta página descreve como configurar a captura de dados de alterações (CDC) para transmitir dados de uma base de dados Oracle do Amazon RDS para um destino suportado, como o BigQuery ou o Cloud Storage.

Pode configurar a base de dados Oracle de origem para utilização com os seguintes métodos de CDC:

Para mais informações sobre o leitor de registos binários e a API LogMiner, consulte o artigo Trabalhe com ficheiros de registo de refazer da base de dados Oracle.

Para instruções detalhadas sobre como configurar a base de dados Oracle de origem para cada um destes métodos, consulte as secções que se seguem.

Configure a sua base de dados Oracle do Amazon RDS para o leitor de registos binários

Para origens do Amazon RDS, o Datastream suporta apenas objetos de diretório da base de dados como o método de acesso ao registo para o leitor de registos binários. Tem de criar os diretórios da base de dados que apontam para os ficheiros de registo de repetição online e os ficheiros de registo arquivados. Os nomes destes diretórios são estáticos e não podem ser alterados posteriormente. Tem de fornecer estes nomes ao Datastream quando cria a sua stream.

  1. Estabeleça a ligação à instância do Amazon RDS de origem.

  2. No terminal ou através do painel de controlo do Amazon RDS, execute os seguintes comandos:

    BEGIN
    rdsadmin.rdsadmin_master_util.create_archivelog_dir;
    END;
    BEGIN
    rdsadmin.rdsadmin_master_util.create_onlinelog_dir;
    END;
    COMMIT;
    GRANT READ ON DIRECTORY ONLINELOG_DIR TO USER_NAME;
    GRANT READ ON DIRECTORY ARCHIVELOG_DIR TO USER_NAME;
  3. Confirme se a base de dados está a ser executada no modo ARCHIVELOG. Para tal, inicie sessão na sua base de dados Oracle e execute o seguinte comando no comando SQL:

    SELECT LOG_MODE FROM V$DATABASE;

    1. Se o resultado for ARCHIVELOG, avance para o passo c.
    2. Se o resultado for NOARCHIVELOG, tem de ativar o modo ARCHIVELOG para a sua base de dados.
    3. Os ficheiros de registo arquivados consomem espaço em disco, pelo que deve configurar o parâmetro DB_RECOVERY_FILE_DEST_SIZE para a sua base de dados. Use este parâmetro para especificar (em bytes) o limite máximo do espaço total a ser usado pelos ficheiros de recuperação da base de dados de destino. Ao definir este parâmetro, pode gerir a compensação entre proteger a base de dados contra a falta de espaço em disco e a falha da stream devido à perda da posição do registo.
    4. Defina uma política de retenção de dados para a sua base de dados executando este comando:
      exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
      Recomendamos que mantenha as cópias de segurança e os registos de arquivo durante, pelo menos, 4 dias, sendo 7 dias o recomendado.
    5. Configure a política de rotação de ficheiros de registo do Oracle. Recomendamos que defina um tamanho máximo do ficheiro de registo para um valor inferior a 1 GB.
  4. Ative os dados de registo suplementares. Para tal, ative primeiro o registo suplementar mínimo ao nível da base de dados executando o seguinte comando:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');

    Em seguida, escolha se quer ativar o registo para tabelas específicas ou para toda a base de dados.

    Para registar alterações apenas para tabelas específicas, execute o seguinte comando para cada tabela que quer replicar:

    ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

    Substitua o seguinte:

    • SCHEMA: o nome do esquema que contém a tabela.
    • TABLE: o nome da tabela para a qual quer registar alterações.

    Para replicar a maioria ou todas as tabelas na sua base de dados, considere ativar o registo para toda a base de dados. Na linha de comandos SQL, execute o seguinte comando para ativar os dados de registo suplementares para toda a base de dados:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL');
  5. Conceda os seguintes privilégios ao utilizador da base de dados:

    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$LOGFILE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$ARCHIVED_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$INSTANCE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$STANDBY_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$INSTANCE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PDBS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$TRANSPORTABLE_PLATFORM','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('COL$','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ENCRYPTED_COLUMNS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_EXTENTS','USER_NAME','SELECT');
    GRANT CONNECT TO USER_NAME;
    GRANT CREATE SESSION TO USER_NAME;
    GRANT SELECT ANY TABLE TO USER_NAME;

    Substitua USER_NAME pelo nome da conta de utilizador que pretende usar para estabelecer ligação à sua base de dados.

Configure a sua base de dados Oracle do Amazon RDS para o LogMiner

  1. Confirme se a base de dados está a ser executada no modo ARCHIVELOG. Para o fazer, inicie sessão na base de dados Oracle e execute o seguinte comando na linha de comandos SQL:

    SELECT LOG_MODE FROM V$DATABASE;
    
    1. Se o resultado for ARCHIVELOG, avance para o passo c.
    2. Se o resultado for NOARCHIVELOG, tem de ativar o modo ARCHIVELOG para a sua base de dados.

      Ponto fundamental: para que a base de dados seja executada no modo ARCHIVELOG, tem de ativar as cópias de segurança da base de dados.

    3. Os ficheiros de registo arquivados consomem espaço em disco, pelo que deve configurar o parâmetro DB_RECOVERY_FILE_DEST_SIZE para a sua base de dados. Use este parâmetro para especificar (em bytes) o limite máximo do espaço total a ser usado pelos ficheiros de recuperação da base de dados de destino. Ao definir este parâmetro, pode gerir a compensação entre a proteção da base de dados contra a falta de espaço em disco e a falha da stream devido à perda da posição do registo.

    4. Defina uma política de retenção de dados para a sua base de dados executando este comando:

      exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
      

      Recomendamos que mantenha as cópias de segurança e os registos de arquivo durante, pelo menos, 4 dias, sendo 7 dias o recomendado.

  2. Ative os dados de registo suplementares. Para o fazer, primeiro, ative o registo suplementar mínimo ao nível da base de dados executando o seguinte comando:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
    

    Em seguida, escolha se quer ativar o registo para tabelas específicas ou para toda a base de dados.

    Para registar alterações apenas para tabelas específicas, execute o seguinte comando para cada tabela que quer replicar:

    ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
    

    Substitua o seguinte:

    • SCHEMA: o nome do esquema que contém a tabela.
    • TABLE: o nome da tabela para a qual quer registar alterações.

    Para replicar a maioria ou todas as tabelas na sua base de dados, considere ativar o registo para toda a base de dados.

    Na linha de comandos SQL, execute o seguinte comando para ativar os dados de registo suplementares para toda a base de dados:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL');
    
  3. Conceda os privilégios adequados à conta de utilizador que vai ser usada para estabelecer ligação à sua base de dados. Para o fazer, execute os seguintes comandos:

    GRANT EXECUTE_CATALOG_ROLE TO USER_NAME;
    GRANT CONNECT TO USER_NAME;
    GRANT CREATE SESSION TO USER_NAME;
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVED_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG','USER_NAME','SELECT'); -- for primary databases
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$STANDBY_LOG','USER_NAME','SELECT'); -- for standby databases
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGFILE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_LOGS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_CONTENTS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR','USER_NAME','EXECUTE');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR_D','USER_NAME','EXECUTE');
    GRANT SELECT ANY TRANSACTION TO USER_NAME;
    GRANT SELECT ANY TABLE TO USER_NAME;

    Se a sua base de dados usar a encriptação de dados transparente (TDE), conceda as seguintes autorizações:

    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ENCRYPTED_COLUMNS','USER_NAME','SELECT');

    Se a sua organização não permitir a concessão da autorização GRANT SELECT ANY TABLE, use a solução descrita na secção Captura de dados de alterações (CDC) da Oracle da página de Perguntas frequentes do Datastream.

    Se a sua base de dados de origem for o Oracle 12c ou mais recente, conceda o seguinte privilégio adicional:

    GRANT LOGMINING TO USER_NAME;
  4. Conceda à conta de utilizador SELECT acesso à vista DBA_EXTENTS na sua base de dados. Este privilégio permite-lhe usar o preenchimento baseado em ROWID para a sua origem Oracle:

    GRANT SELECT ON DBA_EXTENTS TO USER_NAME;

O que se segue?