【OCI クラウド移行ガイド】 Amazon RDS for Oracle を OCI Base Databaseへ移行してみた

<H1>【OCIクラウド移行ガイド】とは</h1>
オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニアによる、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。
まとめ記事は以下になります。

https://qiita.com/yama6/items/b197c0fe3ec75eb02637

<h1>今回移行するサービス：Amazon RDS for Oracle</h1>
今回、移行対象とするのはAmazon RDS for Oracleです。
Oracle Databaseの一般的な移行方式であるDataPumpを使用して移行します。DataPumpは汎用的で馴染みのある方法ですが、移行時にダウンタイムを要しますので、GoldenGateなど他の移行方式を検討する必要があります。その他の移行方式については、以下のページにまとめがあります。

https://blogs.oracle.com/oracle4engineer/post/minamin-cloud-023-basedbexadboracle-database

<h1>前提条件</h1>

下記のリソースを事前に用意しておく必要があります。
| Cloud | リソース              | 今回の環境 |
|:------|:--------------------|:------------|
| AWS   | RDS for Oracle  | ・Oracle Database 19c Standard Edition 2<br> ・今回使用しているデータベース名：**`database-1`**<br>・参考：[RDS for Oracle作成チュートリアル](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html#CHAP_GettingStarted.Creating.Oracle)|
| AWS   | S3              | ・今回使用しているバケット名：**`basedb2s3`**<br> ・Step0-1でバケットのARNが必要      |
| OCI   | Base Database   | ・OCI Base Database Standard Edition<br>・Private Subnetに配置<br> ・今回使用しているデータベース名：**`basedb1`**<br>・参考：[Base Database作成チュートリアル](https://oracle-japan.github.io/ocitutorials/basedb/dbcs101-create-db/)|
| OCI   | NAT Gateway  | ・データ取得のためにNAT Gatewayを利用<br>・参考：[NAT Gateway作成方法](https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/NATgateway.htm#setup) |


<h1>移行フロー</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/2a027668-32a4-b458-b495-cc0645cc84fd.png)

Step0. S3とRDSとの連携設定
Step1. RDS for OracleからData Pumpを使ってデータをエクスポート
Step2. S3のDumpファイルをOCI Base Databaseに転送
Step3. DumpファイルをBase Databaseにインポート

<h2>Step0. S3とRDSとの連携設定</h2>

Step0の作業が複雑なので、最初に図示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/13f7d5a2-4af8-865f-5de1-4a526b57616b.png)

・Step0-1.IAMポリシーの作成
・Step0-2.IAMロールの作成
・Step0-3.IAMロールをRDSインスタンスに関連付ける
・Step0-4.オプション・グループの作成
・Step0-5.オプション・グループをRDSインスタンスに関連付ける

:::note warn
上記の作業が全て行えていないと、RDSにS3用のパッケージ（例：**`rdsadmin.rdsadmin_s3_tasks`**）が作成されず、Step2で`"ORA-00904: "RDSADMIN"."RDSADMIN_S3_TASKS"."UPLOAD_TO_S3": invalid identifier"`というエラーが発生しますのでご注意ください。
:::

<h4>Step0-1. IAMポリシーの設定 </h4>

AWS RDSユーザーズガイド「Amazon S3 と RDS for Oracle を統合する IAM アクセス許可の設定」の「[ステップ 1: Amazon RDS ロール用の IAM ポリシーを作成する]((https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.preparing.html#oracle-s3-integration.preparing.policy)）)」の手順を実行します。

1. AWSのIAM画面から「ポリシー」を選択し「ポリシーの作成」ボタンを押します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/5ada1e48-33a0-cc48-6316-19f8a61539bd.png)

2. 「アクセス許可を指定」の画面の「サービスを選択」の「Choose a service」から「S3」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/7d21256c-dba4-6285-1fac-3136f6f7dcab.png)

3. 「アクション許可」セクションから下記を選択します。
・リスト：`ListBucket`
・読み取り：`GetObject`
・書き込み：`PutObject`
・書き込み：`DeleteObject`
・許可の管理：`PutObjectAcl`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/ea14157a-44cd-cfd9-3cdb-abe5c4ae9e3f.png)

4. 「リソース」セクションで「特定」を選択し、「bucket」の「ARNを追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/2eb243e3-bacb-e8ec-793d-c9b634e91433.png)

5. 事前に用意したS3のARNを貼り付けて「ARNを追加」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/12b1e816-6af0-b475-3e0d-e9c0ec6f50d4.png)

6. 「object」が表示されている場合は「任意」のチェックボックスをつけて「次へ」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/22b029e2-27a7-4468-676d-7aa8c064ab97.png)

7. ポリシーの名前と説明を記載して「ポリシーの作成」ボタンを押します。
・ポリシー名：**`rds-s3-integration-policy`**（任意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/c0a30d9c-9a52-6d9b-7f45-f3c67002cce6.png)


<h4>Step0-2. IAMロールの作成 </h4>

AWS RDSユーザーズガイド「Amazon S3 と RDS for Oracle を統合する IAM アクセス許可の設定」の続きの「[ステップ 3: DB インスタンスの IAM ロールを作成し、ポリシーをアタッチする](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.preparing.html#oracle-s3-integration.preparing.role)」の手順を実行します。

1. AWSのIAM画面から「ロール」を選択し「ロールの作成」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/00cc5af4-c3e0-b312-b367-108c6c4e3244.png)

2. 「信頼されたエンティティタイプ」で「AWSのサービス」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/88acede3-8ed6-bdf5-a6a7-62fb48921d7c.png)

3. 「ユースケース」セクションで下記を選択して「次へ」を押します。
・サービスまたはユースケース：`RDS`
・ユースケース：`RDS - Add Role to Database`
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/1123f094-710e-2ac3-a5b3-05e957561d01.png)

4. 「許可ポリシー」セクションで、Step0-1で作成したポリシーを選択して「次へ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/8fb66970-1272-465a-13a9-763daac2e66f.png)

5. ロール名を任意で入力して「ロールを作成」ボタンを押します。
・ロール名：`rds-s3-integration-role`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/13692402-cf3d-6769-d94d-811ae495e84c.png)

<h4>Step0-3. IAMロールをRDSインスタンスに関連付ける </h4>

AWS RDSユーザーズガイド「Amazon S3 と RDS for Oracle を統合する IAM アクセス許可の設定」の「[ステップ 4: IAM ロールを RDS for Oracle DB インスタンスに関連付ける](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.preparing.html#oracle-s3-integration.preparing.instance)」の手順を実行します。

1. 移行元データベースの詳細画面に行きます。
1. 「IAMロールの管理」セクションで「S3_INTEGRATION に適用するロールを選択して「ロールの追加」を行います。
・このインスタンスにIAMのロールを追加：Step0-2で作成したロールを指定
・機能：`S3_INTERGRATION`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/bf54049a-4fef-79ef-1622-19bd9682f35d.png)

3. ロールの追加が「アクティブ」になったのを確認します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/95e52157-0bc1-34b9-1037-469494362aa2.png)

<h4>Step0-4. オプション・グループの作成 </h4>

AWS RDSユーザーズガイド「[Amazon S3 統合オプションの追加](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.preparing.option-group.html)」の手順を実行します。

:::note info
RDS では、新しい DB インスタンスごとに空のデフォルトオプショングループが用意されます。このデフォルトオプショングループを変更することはできないので、新しいオプショングループを作成します。
:::

1.RDSのページの「リソース」から「オプショングループ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/f0cf9f5a-c33a-11f3-303a-ed36f02186c4.png)

2.オプショングループのページから「グループの作成」ボタンを押します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/cb349e59-44b7-3ec6-2033-aa7649f2b522.png)


3.「オプショングループの作成」画面で必要事項を入力して「作成」を押します。
・名前：`rds-option-group`（必須項目）
・エンジン：移行元のOracleDBのタイプを選択（今回は`oracle-se2`)
・メジャーエンジンバージョン：移行元のOracleDBのバージョンを選択 (今回は`19`)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/0bf308c2-4e89-36d6-3a8d-ccdb5b12fceb.png)


4.作成されたオプショングループの名前をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/9096c685-26dd-9a89-f1ca-f65288063c0d.png)


5.「オプション」セクションの右上にある「オプションの追加」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/f67f4100-18dc-2ac5-af98-7b3287511ad2.png)

6.「オプションの追加」画面で必要事項を入力して「作成」を押します。
・オプション名：`S3_INTEGRATION`
・すぐに適用：`Yes`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/7831cbd7-4a4a-7b68-3594-ec2db93b9ca1.png)

7.コンソール画面からも新しく作成したオプション・グループに「S3_INTEGRATION」が追加されたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/7754c3d8-79ec-d998-1db8-b511990d8eaa.png)



<h4>Step0-5. オプション・グループに関連付ける </h4>

Step0-4に引き続き、AWS RDSユーザーズガイド「[Amazon S3 統合オプションの追加](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.preparing.option-group.html)」の手順を実行します。

:::note info
この部分はユーザーズガイドにあまり明示的に記載がないので、この手順を飛ばしがちなのでご注意ください。
:::
1. RDSインスタンス詳細画面から、右上の「変更」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/ca7d98ed-1feb-e7a6-9ac9-aa8317cb9a37.png)

2. 「追加設定」セクションの「オプショングループ」の設定は、デフォルトは「DBパラメータグループ」と同じになっていますが、Step0-4で作成したオプション・グループに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/146f318a-0bdb-b416-1ee7-5490f7716169.png)



<h2>Step1. RDS for OracleからData Pumpを使ってデータをエクスポート</h2>

・Step1-1.Data Pumpを使ってデータをエクスポート
・Step1-2.エクスポートしたデータをS3に転送

<h4>Step1-1. Data Pumpを使ってデータをエクスポート</h4>

1. ADMINユーザでRDSに接続します。

2. Dumpファイルを一旦ディレクトリ・オブジェクトに置くので、ディレクトリの確認をします。RDSでは、DataPump用のDATA_PUMP_DIRディレクトリオブジェクトが用意されており、dumpファイルにてこのOS領域を利用できます。

```sql:書き方
SELECT * FROM dba_directories
WHERE directory_name='DATA_PUMP_DIR';
```

```sql:実行結果例
OWNER	   DIRECTORY_NAME  DIRECTORY_PATH		   ORIGIN_CON_ID
---------- --------------- ----------------------- -------------
SYS	       DATA_PUMP_DIR   /rdsdbdata/datapump			       0
```

3.DBMS_DATAPUMPプロシージャを使ってExportを実行

AWS RDSユーザーズガイド「Oracle Data Pump を使用したインポート」の「[ステップ 2: DBMS_DATAPUMP を使用してデータをダンプファイルにエクスポートする](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Oracle.Procedural.Importing.DataPump.html#Oracle.Procedural.Importing.DataPumpS3.Step2)」の手順を実行します。

手順が多いように見えますが、下記の5箇所を修正すればすぐに実行できます。
・DBMS_DATAPUMP.OPEN：エクスポート操作をするハンドラを作成します。
・DBMS_DATAPUMP.ADD_FILE(1個目)：DUMPファイルを指定します。
　　‐ filename：DUMPファイルの名前を指定（今回の場合は **`exp_scott.dmp`**)
　　‐ filename：ディレクトリオブジェクト名を指定（今回の場合は **`DATA_PUMP_DIR`**)
・DBMS_DATAPUMP.ADD_FILE(2個目)：ログファイルを指定します。
　　‐ filename：ログファイルの名前を指定（今回の場合は **`exp_scott.log`**)
　　‐ directory：ディレクトリオブジェクト名を指定（今回の場合は **`DATA_PUMP_DIR`**)
・DBMS_DATAPUMP.METADATA_FILTER：スキーマを指定します。
　　‐ value：ディレクトリオブジェクト名を指定（今回の場合は **`SCOTT`**)
・DBMS_DATAPUMP.START_JOB：ジョブを開始します。
・DBMS_DATAPUMP.WAIT_FOR_JOB：ジョブが終了するのを待ちます。
```sql:実行コマンド
DECLARE
  hndl NUMBER;
  status VARCHAR2(20);
BEGIN
  hndl := DBMS_DATAPUMP.OPEN(
    operation => 'EXPORT',
    job_mode  => 'SCHEMA',
    job_name  => null);
    
  DBMS_DATAPUMP.ADD_FILE(
    handle    => hndl,
    filename  => 'exp_scott.dmp',
    directory => 'DATA_PUMP_DIR',
    filetype  => dbms_datapump.ku$_file_type_dump_file,
    reusefile => 1);
    
  DBMS_DATAPUMP.ADD_FILE(
    handle    =>  hndl,
    filename  => 'exp_scott.log',
    directory => 'DATA_PUMP_DIR',
    filetype  => dbms_datapump.ku$_file_type_log_file,
    reusefile => 1);
    
  DBMS_DATAPUMP.METADATA_FILTER(
    handle    =>  hndl,
    name      => 'SCHEMA_EXPR',
    value     => 'IN (''SCOTT'')');
    
  DBMS_DATAPUMP.START_JOB(
    handle =>  hndl);
    
  DBMS_DATAPUMP.WAIT_FOR_JOB(
    handle =>  hndl,
    job_state => status);
END;
/
```
```sql:実行結果例
PL/SQL procedure successfully completed.
```

4.ディレクトリオブジェクトの中身を確認します。
・p_directory：ディレクトリオブジェクト名を指定（今回の場合は **`DATA_PUMP_DIR`**)
```sql:書き方
col filename format a30
SELECT * FROM table
(rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
```

```sql:実行結果例
FILENAME		               TYPE	      FILESIZE   MTIME
------------------------------ ---------- ---------- ---------
datapump/		               directory	    4096 18-DEC-24
exp_scott.log		           file		         638 18-DEC-24
exp_scott.dmp		           file	          319488 18-DEC-24
```

5.実行ログを確認します。
・ディレクトリオブジェクト名を指定（今回の場合は **`DATA_PUMP_DIR`**)
・上記3で指定したログファイル名を指定（今回の場合は **`exp_scott.log`**)
```sql:書き方
col text for a100
set pagesize 100
SELECT text FROM
TABLE(RDSADMIN.RDS_FILE_UTIL.READ_TEXT_FILE('DATA_PUMP_DIR','exp_scott.log'));
```

```sql:実行結果例
TEXT
--------------------------------------------------------------------------------
Starting "ADMIN"."SYS_EXPORT_SCHEMA_01":
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
. . exported "SCOTT"."DEPT"				 6.023 KB	4 rows
. . exported "SCOTT"."EMP"				 8.773 KB      14 rows
Master table "ADMIN"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for ADMIN.SYS_EXPORT_SCHEMA_01 is:
  /rdsdbdata/datapump/exp_scott.dmp
Job "ADMIN"."SYS_EXPORT_SCHEMA_01" successfully completed at Tue Dec 31 08:02:46
 2024 elapsed 0 00:00:28


21 rows selected.
```

:::note info
RDS for Oracle環境でData Pump APIを使用した際にエラーが出たときの対処法がまとまっている記事がありますので、うまく行かない場合はこちらをご参照ください。
https://repost.aws/ja/knowledge-center/rds-oracle-dmbs-datapump-errors
:::

<h4>Step1-2.エクスポートしたデータをS3に転送</h4>

AWS RDSユーザーズガイド「[Amazon RDS for Oracle と Amazon S3 バケットの間でファイルを転送する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/oracle-s3-integration.using.html)」の手順を実行します。

:::note info
ユーザーズガイドに「ファイル転送の要件と制限」があるので、必要に応じて確認をしてください。
:::

1. DumpファイルをS3に転送するプロシージャを実行する。
下記コマンドはDumpファイルのみを転送していますが、必要に応じてファイル名を変えてログファイルも転送して、Exportの実行ログを確認してください。
・p_bucket_name：S3のバケット名を指定（今回の場合は **`basedb2s3`**)
・p_prefix：Step1-1で作成したDumpファイル名を指定（今回の場合は **`exp_scott.dmp`**)
・p_s3_prefix：S3のフォルダ名を指定（今回の場合は **`dumpfiles`**)
・p_directory_name：Step1−1で使用したディレクトリオブジェクト名を指定（今回の場合は **`DATA_PUMP_DIR`**)
```sql:書き方
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
        p_bucket_name    =>  'basedb2s3',
        p_prefix         =>  'exp_scott.dmp',
        p_s3_prefix      =>  'dumpfiles/',
        p_directory_name =>  'DATA_PUMP_DIR')
AS TASK_ID FROM DUAL;
```

```sql:実行結果例
TASK_ID
------------------------------------------------
1734504448730-198
```

2.プロシージャ実行のログを確認する。
`dbtask-<TASK_ID>.log`というファイル名でログが出力されるので内容を確認します。
```sql:書き方
SELECT text FROM table
(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1734504448730-198.log'));
```

```sql:実行結果例
TEXT
--------------------------------------------------------------------------------
2024-12-18 06:47:28.972 UTC [INFO ] File #1: Uploading the file /rdsdbdata/datap
ump/exp_scott.dmp to Amazon S3 with bucket name basedb2s3 and key dumpfiles/exp_
scott.dmp.

2024-12-18 06:47:29.121 UTC [INFO ] The file /rdsdbdata/datapump/exp_scott.dmp w
as uploaded to Amazon S3 with bucket name basedb2s3 and key dumpfiles/exp_scott.
dmp.

2024-12-18 06:47:29.134 UTC [INFO ] The task finished successfully.
```

3.S3でもファイルがあることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/072fc087-a2dc-db00-c155-7785f636b0b7.png)

4.Dumpファイルの詳細外面でオブジェクトURLを確認します。（後で利用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/1683cbaf-b60d-a410-d850-ddbb9714b74f.png)

<h2>Step2. S3のDumpファイルをOCI Base Databaseに転送</h2>

このガイドでは、下記のサイトで紹介されている「パブリックアクセスブロック機能は有効のままでS3のファイルをHTTPでダウンロードする」方法を使って、Base Databaseにファイルを転送します。設定内容の説明が書いてあるので、詳細はこちらの記事をご覧ください。

https://techblog.ap-com.co.jp/entry/2024/01/26/215603

:::note info
この方法の他にも、0CI Object Storageにコピーする方法など様々な方式がQiita等で紹介されていますので、要件に応じてご検討ください。
:::

下記の手順で行います。Step2-3だけはAWSで実施し、その他はOCI側の作業です。
Step2-1. Base Databaseにアクセスする。
Step2-2. Base DatabaseのNAT Gateway経由の外に出た時のGlobal IPアドレスを確認する。
Step2-3. バケットのポリシーを変更する。
Step2-4. S3からBaseDatabaseにDumpファイルを取得する。


<h4>Step2-1. Base Databaseにアクセスする。</h4>
Private SubnetにあるBase Databaseを想定しているので、IPSecVPNやBastionサービス、踏み台サーバ等を使ってアクセスしてください。

<h4>Step2-2. Base DatabaseのNAT Gateway経由の外に出た時のGlobal IPアドレスを確認する。</h4>
ここで取得したIPアドレスはStep2-3で使用します。

```bash:書き方
curl ifconfig.io
```

```bash:実行結果例
[opc@dbse2 ~]$ curl ifconfig.io
xxx.xxx.xxx.xxx
```

<h4>Step2-3. バケットのポリシーを変更する。</h4>

1.バケットの「アクセス許可」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/aae95e1e-3d77-0650-7231-34e1017d7669.png)

2.「ブロックパブリックアクセス」で「パブリック・アクセスをすべてブロック」はオンのままにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/98d94520-3bb8-a027-fb16-4620c1205517.png)

3.「バケットポリシー」から「編集」ボタンを押して「バケットポリシーの編集」画面に行き、バケットのポリシーに下記を記載します。
・Resource：今回は **`basedb2se3`** に変更
・IP Address：Step2-2で取得したIPアドレスに/32をつけて記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/f3cf0460-5193-418c-b2ef-aeb6c1a1e3a6.png)

```AWS:ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["s3:GetObject"],
            "Resource": ["arn:aws:s3:::basedb2s3/*"],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["xxx.xxx.xxx.xxx/32"]
                }
            }
        }
    ]
}
```

4.「変更を保存」を押して、内容を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581985/baabbd37-b097-9bcb-1a76-458d16ad690b.png)


<h4>Step2-4.S3からBaseDatabaseにDumpファイルを取得する。</h4>

1.Oracleユーザに変更します。
```bash:コマンド
sudo su -
su - oracle
```

```bash:実行結果
[opc@dbse2 ~]$ sudo su -
Last login: Wed Dec 25 14:03:18 UTC 2024
[root@dbse2 ~]# su - oracle
Last login: Wed Dec 25 14:03:18 UTC 2024
Last failed login: Wed Dec 25 14:03:32 UTC 2024 on pts/0
There was 1 failed login attempt since the last successful login.
```

2.Dumpファイル配置用のディレクトリを作成して移動する。
```bash:コマンド
mkdir /home/oracle/dumpfile
cd /home/oracle/dumpfile
```

```bash:実行結果
[oracle@dbse2 ~]$ mkdir /home/oracle/dumpfile
[oracle@dbse2 ~]$ cd /home/oracle/dumpfile
[oracle@dbse2 dumpfile]$ 
```

3.Dumpファイルをダウンロードする。
```bash:コマンド
wget https://basedb2s3.s3.ap-northeast-1.amazonaws.com/dumpfiles/exp_scott.dmp
```

```bash:実行結果
[oracle@dbse2 dumpfile]$ wget https://basedb2s3.s3.ap-northeast-1.amazonaws.com/dumpfiles/exp_scott.dmp
--2024-12-31 07:20:30--  https://basedb2s3.s3.ap-northeast-1.amazonaws.com/dumpfiles/exp_scott.dmp
Resolving basedb2s3.s3.ap-northeast-1.amazonaws.com (basedb2s3.s3.ap-northeast-1.amazonaws.com)... 3.5.158.194, 3.5.159.184, 52.219.199.54, ...
Connecting to basedb2s3.s3.ap-northeast-1.amazonaws.com (basedb2s3.s3.ap-northeast-1.amazonaws.com)|3.5.158.194|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 589824 (576K) [application/octet-stream]
Saving to: ‘exp_scott.dmp’

exp_scott.dmp                                             100%[===================================================================================================================================>] 576.00K   524KB/s    in 1.1s    

2024-12-31 07:20:33 (524 KB/s) - ‘exp_scott.dmp’ saved [589824/589824]
```

4.Dumpファイルを確認する。

```bash:コマンド
ls -l
```

```bash:実行結果
[oracle@dbse2 dumpfile]$ ls -l
total 576
-rw-r--r-- 1 oracle oinstall 589824 Dec 31 07:14 exp_scott.dmp
```

<h2>Step3. DumpファイルをBase Databaseにインポート</h2>

・Step3-1.ディレクトリ・オブジェクトを作成する。
・Step3-2.ダウンロードしたDumpファイルをインポートする。

<h4>Step3-1.ディレクトリ・オブジェクトを作成する。 </h4>

1.SQL*PlusでBase DatabaseのPDBに接続する。
```bash:コマンド
sqlplus system/<password>@pdb1
```

```bash:実行結果
[oracle@dbse2 ~]$ sqlplus system/<password>@pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Dec 31 05:54:39 2024
Version 19.25.0.0.0

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Last Successful login time: Tue Dec 31 2024 05:52:04 +00:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.25.0.0.0

SQL> 
```

2.先ほど作成したディレクトリをimpdirというディレクトリ・オブジェクトとして作成する。
```sql:コマンド
create directory impdir as '/home/oracle/dumpfile';
```

```sql:結果
SQL> create directory impdir as '/home/oracle/dumpfile';

Directory created.
```

3.作成されたディレクトリ・オブジェクトを確認する。
```sql:コマンド
select * from dba_directories where directory_name = 'IMPDIR';
```

```sql:実行結果
SQL> select * from dba_directories where directory_name = 'IMPDIR';

OWNER
--------------------------------------------------------------------------------
DIRECTORY_NAME
--------------------------------------------------------------------------------
DIRECTORY_PATH
--------------------------------------------------------------------------------
ORIGIN_CON_ID
-------------
SYS
IMPDIR
/home/oracle/dumpfile
            3
```

4.（必要に応じて）ディレクトリアクセスに必要な権限をExportするユーザに与える。
```sql:コマンド
grant read,write on directory impdir to <user_name>;
```

<h4>Step3-2.ダウンロードしたDumpファイルをインポートする。 </h4>

1.Oracleユーザのコマンドラインからimpdpコマンドを実行する。

```bash:コマンド
impdp system/<password>@pdb1 schemas=scott directory=IMPDIR dumpfile=exp_scott.dmp log=exp_scott.log
```

```実行結果
[oracle@dbse2 ~]$ impdp system/<password>@pdb1 schemas=scott directory=IMPDIR dumpfile=exp_scott.dmp log=exp_scott.log

Import: Release 19.0.0.0.0 - Production on Tue Dec 31 08:19:05 2024
Version 19.25.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Legacy Mode Active due to the following parameters:
Legacy Mode Parameter: "log=exp_scott.log" Location: Command Line, Replaced with: "logfile=exp_scott.log"
Master table "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_SCHEMA_01":  system/********@pdb1 schemas=scott directory=IMPDIR dumpfile=exp_scott.dmp logfile=exp_scott.log 
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."DEPT"                              6.023 KB       4 rows
. . imported "SCOTT"."EMP"                               8.773 KB      14 rows
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully completed at Tue Dec 31 08:19:12 2024 elapsed 0 00:00:06
```

2.SCOTTユーザで接続して表がインポートされているのを確認する。

```bash:コマンド
sqlplus  -s  system/<password>@pdb1 <<EOF
select table_name from dba_tables where owner='SCOTT';
exit
EOF
```
```実行結果
[oracle@dbse2 ~]$ sqlplus  -s  system/<password>@pdb1 <<EOF
> select table_name from dba_tables where owner='SCOTT';
> exit
> EOF

TABLE_NAME
------------------------------------------------------------------------------
EMP
DEPT
```

以上