Amazon RDS for Oracle と Amazon S3 バケットの間でファイルを転送する
RDS for Oracle DB インスタンスと Amazon S3 バケット間でファイルを転送するには、Amazon RDS パッケージ rdsadmin_s3_tasks
を使用できます。アップロード時に GZIP でファイルを圧縮し、ダウンロード時に解凍することができます。
トピック
ファイル転送の要件と制限
DB インスタンスと Amazon S3 バケットの間でファイルを転送する前に、次の点に注意してください。
-
rdsadmin_s3_tasks
パッケージは、単一のディレクトリにあるファイルを転送します。転送にサブディレクトリを含めることはできません。 -
Amazon S3 バケット内の最大オブジェクトサイズは 5 TB です。
-
rdsadmin_s3_tasks
によって作成されたタスクは非同期的に実行されます。 -
DATA_PUMP_DIR
などの Data Pump ディレクトリ、またはユーザーが作成したディレクトリからファイルをアップロードできます。adump
、bdump
、またはtrace
ディレクトリなど、Oracle バックグラウンドプロセスで使用されるディレクトリからファイルをアップロードすることはできません。 -
ダウンロードできるファイル数は、
download_from_s3
の場合、プロシージャコールあたり 2000 ファイルに制限されています。Amazon S3 から 2000 を超えるファイルをダウンロードする必要がある場合は、ダウンロードを別々のアクションに分割し、1 回のプロシージャコールあたりのファイル数が 2000 を超えないようにしてください。 -
ダウンロードフォルダにファイルが存在し、同じ名前のファイルをダウンロードしようとすると、
download_from_s3
ではダウンロードをスキップします。ダウンロードディレクトリからファイルを削除するには、PL/SQL プロシージャ UTL_FILE.FREMOVEを使用します。
RDS for Oracle DB インスタンスから Amazon S3 バケットにファイルをアップロードする
DB インスタンスから Amazon S3 バケットにファイルをアップロードするには、プロシージャ rdsadmin.rdsadmin_s3_tasks.upload_to_s3
を使用します。例えば、Oracle Recovery Manager (RMAN) のバックアップファイルまたは Oracle Data Pump ファイルをアップロードすることができます。オブジェクトの操作方法の詳細については、Amazon Simple Storage Service ユーザーガイドを参照してください。RMAN バックアップの詳細については、「Oracle DB インスタンスの一般的な RMAN タスクの実行」を参照してください。
rdsadmin.rdsadmin_s3_tasks.upload_to_s3
プロシージャには以下のパラメータがあります。
パラメータ名 | データ型 | デフォルト | 必須 | 説明 |
---|---|---|---|---|
|
VARCHAR2 |
– |
必須 |
ファイルをアップロードする Amazon S3 バケットの名前。 |
|
VARCHAR2 |
– |
必須 |
ファイルのアップロード元の Oracle ディレクトリオブジェクトの名前。ディレクトリは、ユーザーが作成した任意のディレクトリオブジェクト、または Data Pump ディレクトリ (例: 注記ファイルは、指定したディレクトリからのみアップロードできます。指定したディレクトリのサブディレクトリにファイルをアップロードすることはできません。 |
|
VARCHAR2 |
– |
必須 |
ファイルをアップロードする Amazon S3 ファイル名のプレフィックス。プレフィックスが空の場合は、指定された Amazon S3 バケットの最上位レベルにすべてのファイルがアップロードされますが、そのファイル名にプレフィックスは付加されません。 例えば、プレフィックスが |
|
VARCHAR2 |
– |
必須 |
アップロードするファイル名が一致する必要があるファイル名のプレフィックス。プレフィックスが空の場合は、指定されたディレクトリ内のファイルがすべてアップロードされます。 |
|
NUMBER |
|
オプション |
GZIP 圧縮のレベル。有効な値の範囲は
|
|
VARCHAR2 |
– |
optional |
バケットのアクセスコントロールリスト。有効な値は、null と |
rdsadmin.rdsadmin_s3_tasks.upload_to_s3
プロシージャの戻り値はタスク ID です。
次の例では、
ディレクトリ内のすべてのファイルを DATA_PUMP_DIR
amzn-s3-demo-bucket
という名前の Amazon S3 バケットにアップロードします。ファイルは圧縮されません。
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => '
amzn-s3-demo-bucket
', p_prefix => '', p_s3_prefix => '', p_directory_name => 'DATA_PUMP_DIR
') AS TASK_ID FROM DUAL;
次の例では、
ディレクトリ内のプレフィックス db
のついたすべてのファイルを、DATA_PUMP_DIR
という名前の Amazon S3 バケットにアップロードします。Amazon RDS は、最高レベルの GZIP 圧縮をファイルに適用します。amzn-s3-demo-bucket
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => '
amzn-s3-demo-bucket
', p_prefix => 'db
', p_s3_prefix => '', p_directory_name => 'DATA_PUMP_DIR
', p_compression_level =>9
) AS TASK_ID FROM DUAL;
次の例では、
ディレクトリのすべてのファイルを、DATA_PUMP_DIR
という名前の Amazon S3 バケットにアップロードします。ファイルは、amzn-s3-demo-bucket
dbfiles
フォルダにアップロードされます。この例では、GZIP 圧縮レベルは 1
です。これは最も速い圧縮レベルです。
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => '
amzn-s3-demo-bucket
', p_prefix => '', p_s3_prefix => 'dbfiles/
', p_directory_name => 'DATA_PUMP_DIR
', p_compression_level =>1
) AS TASK_ID FROM DUAL;
次の例では、
ディレクトリのすべてのファイルを、DATA_PUMP_DIR
という名前の Amazon S3 バケットにアップロードします。ファイルは amzn-s3-demo-bucket
dbfiles
フォルダにアップロードされ、各ファイル名の先頭には ora
が付加されます。圧縮は適用されません。
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => '
amzn-s3-demo-bucket
', p_prefix => '', p_s3_prefix => 'dbfiles/ora
', p_directory_name => 'DATA_PUMP_DIR
') AS TASK_ID FROM DUAL;
次の例では、コマンドはアカウント A で実行されるものの、アカウント B でバケットの内容を完全に制御する必要があることを前提としています。コマンド rdsadmin_s3_tasks.upload_to_s3
は、
という名前のバケットに s3bucketOwnedByAccountB
ディレクトリ内のすべてのファイルを転送します。アクセスコントロールは、アカウント B がバケット内のファイルにアクセスできるように、DATA_PUMP_DIR
FULL_CONTROL
に設定されています。GZIP 圧縮レベルは 6
で、速度とファイルサイズのバランスが取れています。
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => '
s3bucketOwnedByAccountB
', p_prefix => '', p_s3_prefix => '', p_directory_name => 'DATA_PUMP_DIR
', p_bucket_owner_full_control => 'FULL_CONTROL', p_compression_level =>6
) AS TASK_ID FROM DUAL;
それぞれの例では、SELECT
ステートメントでは、タスクの ID が VARCHAR2
データ型で返ります。
タスクの出力ファイルを表示すると、結果を確認できます。
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-
task-id
.log'));
は、この手順で返されたタスク ID に置き換えます。task-id
注記
タスクは非同期的に実行されます。
Amazon S3 バケットから Oracle DB インスタンスにファイルをダウンロードする
Amazon S3 バケットから RDS for Oracle インスタンスにファイルをダウンロードするには、Amazon RDS プロシージャ (rdsadmin.rdsadmin_s3_tasks.download_from_s3
) を使用します。
download_from_s3
プロシージャには以下のパラメータがあります。
パラメータ名 | データ型 | デフォルト | 必須 | 説明 |
---|---|---|---|---|
|
VARCHAR2 |
– |
必須 |
ファイルのダウンロード元の Amazon S3 バケットの名前。 |
|
VARCHAR2 |
– |
必須 |
ファイルをダウンロードする Oracle ディレクトリオブジェクトの名前。ディレクトリは、ユーザーが作成した任意のディレクトリオブジェクト、または Data Pump ディレクトリ (例: |
|
VARCHAR2 |
FALSE |
オプションです。 |
Amazon S3 バケット内のどのオブジェクトもプレフィックスと一致しない場合に、タスクによってエラーを発生させるかどうかを決定するフラグ。このパラメータが設定されていないか、FALSE (デフォルト) に設定されている場合、タスクはオブジェクトが見つからなかったというメッセージを出力しますが、例外が発生したり、エラーになったりすることはありません。このパラメータが TRUE の場合、タスクでは例外が発生し、エラーになります。 一致テストでエラーになる可能性のあるプレフィックス仕様の例としては、 |
|
VARCHAR2 |
– |
必須 |
ダウンロードするファイル名が一致する必要があるファイル名のプレフィックス。プレフィックスを空にすると、指定された Amazon S3 バケット内の最上位ファイルがすべてダウンロードされますが、バケットのフォルダ内のファイルはダウンロードされません。 この手順では、プレフィックスと一致する初期のレベルのフォルダからのみ、Amazon S3 オブジェクトをダウンロードします。指定されたプレフィックスに一致する多層のディレクトリはダウンロードされません。 例えば、Amazon S3 バケットのフォルダ構造が その代わりに、 |
|
VARCHAR2 |
– |
オプションです。 |
解凍形式。有効な値は、解凍しない場合は |
rdsadmin.rdsadmin_s3_tasks.download_from_s3
プロシージャの戻り値はタスク ID です。
次の例では、
という名前の Amazon S3 バケットのファイルをすべて、amzn-s3-demo-bucket
ディレクトリにダウンロードします。ファイルは圧縮されていないため、解凍は適用されません。DATA_PUMP_DIR
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => '
amzn-s3-demo-bucket
', p_directory_name => 'DATA_PUMP_DIR
') AS TASK_ID FROM DUAL;
以下の例では、
という名前の Amazon S3 バケット内にある、プレフィックス db
がついたファイルをすべて、amzn-s3-demo-bucket
ディレクトリにダウンロードします。ファイルは GZIP で圧縮されているため、解凍が適用されます。DATA_PUMP_DIR
p_error_on_zero_downloads
パラメータはプレフィックスエラーチェックを有効にするため、プレフィックスがバケット内のどのファイルとも一致しない場合、タスクでは例外が発生し、エラーになります。
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => '
amzn-s3-demo-bucket
', p_s3_prefix => 'db
', p_directory_name => 'DATA_PUMP_DIR
', p_decompression_format => 'GZIP
', p_error_on_zero_downloads => 'TRUE
') AS TASK_ID FROM DUAL;
以下の例では、
という名前の Amazon S3 バケット内にある myfolder/
フォルダ内のファイルをすべて、amzn-s3-demo-bucket
ディレクトリにダウンロードします。Amazon S3 フォルダを指定するには、DATA_PUMP_DIR
p_s3_prefix
パラメータを使用します。アップロードされたファイルは GZIP で圧縮されますが、ダウンロード中は解凍されません。
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => '
amzn-s3-demo-bucket
', p_s3_prefix => 'myfolder/
', p_directory_name => 'DATA_PUMP_DIR
', p_decompression_format => 'NONE
') AS TASK_ID FROM DUAL;
次の例では、
ディレクトリに DATA_PUMP_DIR
という名前の Amazon S3 バケット内のファイル amzn-s3-demo-bucket
をダウンロードします。解凍は適用されません。mydumpfile.dmp
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => '
amzn-s3-demo-bucket
', p_s3_prefix => 'mydumpfile.dmp
', p_directory_name => 'DATA_PUMP_DIR
') AS TASK_ID FROM DUAL;
それぞれの例では、SELECT
ステートメントでは、タスクの ID が VARCHAR2
データ型で返ります。
タスクの出力ファイルを表示すると、結果を確認できます。
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-
task-id
.log'));
は、この手順で返されたタスク ID に置き換えます。task-id
注記
タスクは非同期的に実行されます。
ディレクトリからファイルを削除するには、Oracle プロシージャ UTL_FILE.FREMOVE
を使用できます。詳細については、Oracle ドキュメントの「FREMOVE プロシージャ
ファイル転送のステータスをモニタリングする
ファイル転送タスクでは、スタート時と完了時に Amazon RDS イベントが発行されます。イベントメッセージには、ファイル転送のタスク ID が含まれています。イベントの表示の詳細については、「Amazon RDS イベントの表示」を参照してください。
実行中のタスクのステータスは bdump ファイルで確認できます。bdump ファイルは /rdsdbdata/log/trace
ディレクトリにあります。bdump ファイルの名前形式は、以下のとおりです。
dbtask-
task-id
.log
を、モニタリングするタスクの ID に置き換えます。task-id
注記
タスクは非同期的に実行されます。
bdump ファイルの中身を表示するには、rdsadmin.rds_file_util.read_text_file
ストアドプロシージャを使用します。例えば、次のクエリでは、bdump ファイル (
) の中身が返ります。dbtask-1234567890123-1234.log
SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','
dbtask-1234567890123-1234.log
'));
次のサンプルは、転送が失敗したときのログファイルを示しています。
TASK_ID -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1234567890123-1234 TEXT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2023-04-17 18:21:33.993 UTC [INFO ] File #1: Uploading the file /rdsdbdata/datapump/A123B4CDEF567890G1234567890H1234/sample.dmp to Amazon S3 with bucket name
amzn-s3-demo-bucket
and key sample.dmp. 2023-04-17 18:21:34.188 UTC [ERROR] RDS doesn't have permission to write to Amazon S3 bucket nameamzn-s3-demo-bucket
and key sample.dmp. 2023-04-17 18:21:34.189 UTC [INFO ] The task failed.