

# Migrar com visualizações materializadas do Oracle
<a name="Oracle.Procedural.Importing.Materialized"></a>

Para migrar conjuntos de dados grandes de forma eficiente, use a replicação de visualizações materializadas do Oracle. Com a replicação, você pode manter as tabelas de destino sincronizadas com as tabelas de origem. Assim, você pode mudar para o Amazon RDS posteriormente, se necessário. 

Antes de poder migrar usando visualizações materializadas, cumpra os seguintes requisitos:
+ Configure o acesso do banco de dados de destino ao banco de dados de origem. No exemplo a seguir, as regras de acesso foram habilitadas no banco de dados de origem para permitir que o banco de dados de destino do RDS para Oracle se conecte à origem via SQL\$1Net. 
+ Crie um link de banco de dados entre a instância de banco de dados do RDS para Oracle e o banco de dados de origem.

**Como migrar dados usando visualizações materializadas**

1. Crie uma conta de usuário na instância de origem e na instância de destino do RDS para Oracle que podem se autenticar com a mesma senha. O exemplo a seguir cria um usuário denominado `dblink_user`.

   ```
   CREATE USER dblink_user IDENTIFIED BY my-password
     DEFAULT TABLESPACE users
     TEMPORARY TABLESPACE temp;
      
   GRANT CREATE SESSION TO dblink_user;
   
   GRANT SELECT ANY TABLE TO dblink_user;
   
   GRANT SELECT ANY DICTIONARY TO dblink_user;
   ```
**nota**  
Especifique uma senha diferente do prompt mostrado aqui como prática recomendada de segurança.

1. Crie um link de banco de dados da instância de destino do RDS para Oracle com a instância de origem usando o usuário recém-criado.

   ```
   CREATE DATABASE LINK remote_site
     CONNECT TO dblink_user IDENTIFIED BY my-password
     USING '(description=(address=(protocol=tcp) (host=my-host) 
       (port=my-listener-port)) (connect_data=(sid=my-source-db-sid)))';
   ```
**nota**  
Especifique uma senha diferente do prompt mostrado aqui como prática recomendada de segurança.

1. Teste o link:

   ```
   SELECT * FROM V$INSTANCE@remote_site;
   ```

1. Crie uma tabela de exemplo com uma chave primária e um log de visualização materializada na instância de origem.

   ```
   CREATE TABLE customer_0 TABLESPACE users 
     AS (SELECT ROWNUM id, o.* 
         FROM   ALL_OBJECTS o, ALL_OBJECTS x
         WHERE  ROWNUM <= 1000000);
   
   ALTER TABLE customer_0 ADD CONSTRAINT pk_customer_0 PRIMARY KEY (id) USING INDEX;
   
   CREATE MATERIALIZED VIEW LOG ON customer_0;
   ```

1. Na instância de banco de dados de destino do RDS para Oracle, crie uma visualização materializada. 

   ```
   CREATE MATERIALIZED VIEW customer_0 
     BUILD IMMEDIATE REFRESH FAST 
     AS (SELECT * 
         FROM   cust_dba.customer_0@remote_site);
   ```

1. Na instância de banco de dados de destino do RDS para Oracle, atualize a visualização materializada.

   ```
   EXEC DBMS_MVIEW.REFRESH('CUSTOMER_0', 'f');
   ```

1. Elimine a visualização materializada e inclua a cláusula `PRESERVE TABLE` para reter a tabela de contêineres de visualização materializada e seus conteúdos.

   ```
   DROP MATERIALIZED VIEW customer_0 PRESERVE TABLE;
   ```

   A tabela retida tem o mesmo nome que a visualização materializada que foi eliminada.