

# 使用 Oracle 实体化视图进行迁移
<a name="Oracle.Procedural.Importing.Materialized"></a>

要高效率地迁移大型数据集，您可以使用 Oracle 实体化视图复制功能。通过复制，您可以使目标表与源表保持同步。这样，如果需要，您可以稍后切换到 Amazon RDS。

在可以使用实体化视图进行迁移之前，请确保满足以下要求：
+ 配置从目标数据库到源数据库的访问权限。在以下示例中，在源数据库上启用了访问规则，以允许 RDS for Oracle 目标数据库通过 SQL\$1Net 与源数据库连接。
+ 创建从 RDS for Oracle 数据库实例到源数据库的数据库链接。

**使用实体化视图迁移数据**

1. 在源实例和 RDS for Oracle 目标实例上，创建可以使用同一密码进行身份验证的用户账户。下面的示例创建了一个名为 `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;
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

1. 使用新创建的用户创建从 RDS for Oracle 目标实例到源实例的数据库链接。

   ```
   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)))';
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

1. 测试链接：

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

1. 使用主键和源实例上的具体化视图日志创建示例表。

   ```
   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. 在目标 RDS for Oracle 数据库实例上，创建实体化视图。

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

1. 在目标 RDS for Oracle 实例上，刷新实体化视图。

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

1. 删除实体化视图并包括 `PRESERVE TABLE` 子句，以便保留实体化视图容器表及其内容。

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

   保留的表拥有与已删除具体化视图相同的名称。