

# Oracle マテリアライズドビューを使用した移行
<a name="Oracle.Procedural.Importing.Materialized"></a>

大規模なデータセットを効率的に移行するために、Oracle マテリアライズドビューのレプリケーションを使用することができます。レプリケーションを使用すると、移行先テーブルと移行元テーブルとの同期を継続的に維持できます。このため、必要に応じて、後から Amazon RDS に切り替えることができます。

マテリアライズドビューを使用して移行する前に、以下の前提条件を満たしていることを確認してください。
+ 移行先のデータベースから移行元のデータベースへのアクセスを設定します。次の例では、移行元データベースでアクセスルールが有効になっており、移行先の RDS for Oracle データベースが SQL\$1Net を経由して移行元にアクセスすることが許可されています。
+ RDS for Oracle DB インスタンスから移行元のデータベースへのデータベースリンクを作成します。

**マテリアライズドビューを使用してデータを移行するには**

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 DB インスタンスで、マテリアライズドビューを作成します。

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

1. 移行先の RDS for Oracle DB インスタンスで、マテリアライズドビューを更新します。

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

1. マテリアライズドビューを削除し、`PRESERVE TABLE` 句を含めて、マテリアライズドビューコンテナテーブルとその内容を保持します。

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

   保持したテーブル名は、削除したマテリアライズドビューと同じです。