Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存
SELECT INTO OUTFILE S3
ステートメントを使用して、Amazon Aurora MySQL DB クラスターのデータをクエリし、Amazon S3 バケット内のテキストファイルにデータを保存できます。Aurora MySQL では、ファイルを最初にローカルディスクに保存し、次に S3 にエクスポートします。エクスポートが完了すると、ローカルファイルは削除されます。
Amazon S3 マネージドキー (SSE-S3) または AWS KMS key (SSE-KMS: AWS マネージドキー またはカスタマーマネージドキー) を使用して Amazon S3 バケットを暗号化できます。
LOAD DATA FROM S3
ステートメントは、SELECT INTO
OUTFILE S3
ステートメントで作成したファイルを使用してデータを Aurora DB クラスター内にロードできます。詳細については、「Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード」を参照してください。
注記
この機能は Aurora Serverless v1 DB クラスターに対してサポートされていません。Aurora Serverless v2 DB クラスターでサポートされています。
AWS Management Console、AWS CLI、または Amazon RDS API を使用して、DB クラスターデータと DB クラスタースナップショットデータを Amazon S3 に保存することもできます。詳細については、Amazon S3 への DB クラスターデータのエクスポートおよびAmazon S3 への DB クラスタースナップショットデータのエクスポートを参照してください。
目次
Amazon S3 へのアクセスを Aurora MySQL に許可する
データを Amazon S3 バケット内に保存する前に、Amazon S3 へのアクセス権限を Aurora MySQL DB クラスターに付与する必要があります。
Amazon S3 へのアクセス権限を Aurora MySQL に付与するには
-
バケットおよびオブジェクトのアクセス許可を付与し、Aurora MySQL DB クラスターから Amazon S3 へのアクセスを許可する AWS Identity and Access Management (IAM) ポリシーを作成します。手順については、Amazon S3 リソースにアクセスするための IAM ポリシーの作成 を参照してください。
注記
Aurora MySQL バージョン 3.05 以降では、AWS KMS カスタマーマネージドキーを使用してオブジェクトを暗号化できます。そのためには、IAM ポリシーに
kms:GenerateDataKey
アクセス許可を含めてください。詳細については、「AWS KMS リソースにアクセスするための IAM ポリシーの作成」を参照してください。AWS マネージドキー または Amazon S3 マネージドキー (SSE-S3) を使用してオブジェクトを暗号化する場合にはこのアクセス許可は必要ありません。
-
IAM ロールを作成して、「Amazon S3 リソースにアクセスするための IAM ポリシーの作成」で作成した IAM ポリシーを新しい IAM ロールにアタッチします。手順については、Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成 を参照してください。
-
Aurora MySQL バージョン 2 の場合、
aurora_select_into_s3_role
またはaws_default_s3_role
DB クラスターパラメータを、新しい IAM ロールの Amazon リソースネーム (ARN) に設定します。IAM ロールがaurora_select_into_s3_role
に指定されていない場合、Aurora はaws_default_s3_role
に指定されている IAM ロールを使用します。Aurora MySQL バージョン 3 の場合、
aws_default_s3_role
を使用します。クラスターが Aurora Global Database の一部である場合は、このパラメータをグローバルデータベース内の Aurora クラスターごとに設定します。
DB クラスターのパラメータの詳細については、「Amazon Aurora の DB クラスターパラメータと DB インスタンスパラメータ」を参照してください。
-
Aurora MySQL DB クラスター内のデータベースユーザーが Amazon S3 にアクセスできるように、「Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成」で作成したロールをその DB クラスターに関連付けます。
Aurora Global Database の場合は、グローバルデータベース内の Aurora クラスターごとにロールを関連付けます。
DB クラスターへの IAM ロールの関連付けの詳細については、「IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け」を参照してください。
-
Amazon S3 へのアウトバウンド接続を許可するように Aurora MySQL DB クラスターを設定します。手順については、「Amazon Aurora から他の AWS のサービスへのネットワーク通信の有効化」を参照してください。
Aurora Global Database の場合は、グローバルデータベース内の Aurora クラスターごとにアウトバウンド接続を有効にします。
Aurora MySQL にデータを保存する権限の付与
SELECT INTO OUTFILE S3
ステートメントを発行するデータベースユーザーは、特定のロールまたは権限を保持している必要があります。Aurora MySQL バージョン 3 では、AWS_SELECT_S3_ACCESS
ロールを付与します。Aurora MySQL バージョン 2 では、SELECT
INTO S3
権限を付与します。DB クラスターの管理ユーザーにはデフォルトで適切なロールまたは権限が付与されます。他のユーザーに権限を付与するには、次のいずれかのコマンドが使用できます。
Aurora MySQL バージョン 3 では、次のステートメントを使用します:
GRANT AWS_SELECT_S3_ACCESS TO '
user
'@'domain-or-ip-address
'
ヒント
Aurora MySQL バージョン 3 でロールテクニックを使用する場合は、SET ROLE
または role_name
SET ROLE
ALL
ステートメントを使用してロールを有効化することもできます。MySQL 8.0 ロールシステムに馴染みがない場合は、ロールベースの特権モデル で詳細を確認頂けます。詳細については、「MySQL リファレンスマニュアル」の「Using roles
これは現在アクティブなセッションにのみ適用されます。再接続するときは、SET ROLE
ステートメントを再度実行して権限を付与する必要があります。詳細については、MySQL リファレンスマニュアルの「SET ROLE ステートメント
ユーザーが DB インスタンスに接続したときに、activate_all_roles_on_login
DB クラスターパラメータを使用して、すべてのロールを自動的に有効化できます。このパラメータを設定すると、通常、SET ROLE
ステートメントを明示的に呼び出してロールをアクティブ化する必要はありません。詳細については、MySQL リファレンスマニュアルの「activate_all_roles_on_login
ただし、ストアドプロシージャを別のユーザーから呼び出す場合は、ストアドプロシージャの先頭で SET ROLE ALL
を明示的に呼び出してロールをアクティブ化する必要があります。
Aurora MySQL バージョン 2 では、次のステートメントを使用します:
GRANT SELECT INTO S3 ON *.* TO '
user
'@'domain-or-ip-address
'
AWS_SELECT_S3_ACCESS
ロールまたは SELECT INTO S3
権限は Amazon Aurora MySQL に固有であり、MySQL データベースおよび MySQL DB インスタンスの RDS では使用できません。Aurora MySQL DB クラスターをレプリケーションソースとし、MySQL データベースをレプリケーションクライアントとして両者間にレプリケーションを設定した場合、ロールまたは権限の GRANT
ステートメントはエラーとなり、レプリケーションが停止します。エラーをスキップして、レプリケートを再開できます。RDS for MySQL DB インスタンスでエラーをスキップするには、 mysql_rds_skip_repl_error プロシージャを使用します。外部 MySQL データベースでエラーをスキップするには、slave_skip_errors
Amazon S3 バケットへのパスの指定
Amazon S3 バケットにデータとマニフェストファイルを保存するためのパスを指定する構文は、次に示すように、LOAD DATA FROM S3 PREFIX
ステートメントで使用する構文と似ています。
s3
-region
://bucket-name
/file-prefix
パスに指定する値は以下のとおりです。
-
region
(オプション) - データの保存先の Amazon S3 バケットがある AWS リージョン。この値はオプションです。region
値を指定しないと、Aurora は DB クラスターと同じリージョンの Amazon S3 にファイルを保存します。 -
bucket-name
- データの保存先である Amazon S3 バケットの名前。仮想フォルダのパスを識別するオブジェクトプレフィックスがサポートされています。 -
file-prefix
- Amazon S3 に保存するファイルを識別する Amazon S3 オブジェクトプレフィックス。
SELECT INTO OUTFILE S3
ステートメントで作成したデータファイルでは、次のパスを使用します。00000
はゼロから始まる 5 桁の整数です。
s3
-region
://bucket-name
/file-prefix
.part_00000
例えば、SELECT INTO OUTFILE S3
ステートメントでデータファイルの保存先のパスとして s3-us-west-2://bucket/prefix
を指定し、3 つのデータファイルを作成したとします。この場合、指定した Amazon S3 バケットに保存されるデータファイルは以下のとおりです。
-
s3-us-west-2://bucket/prefix.part_00000
-
s3-us-west-2://bucket/prefix.part_00001
-
s3-us-west-2://bucket/prefix.part_00002
データファイルをリスト化するマニフェストの作成
SELECT INTO OUTFILE S3
ステートメントで MANIFEST ON
オプションを使用すると、このステートメントで作成されるテキストファイルをリストするマニフェストファイルを JSON 形式で作成できます。LOAD DATA FROM S3
ステートメントでは、このマニフェストファイルを使用してデータファイルを逆に Aurora MySQL DB クラスター内にロードできます。マニフェストファイルを使用して Amazon S3 から Aurora MySQL DB クラスター内にデータファイルをロードする方法の詳細については、「マニフェストを使用して、ロードするデータファイルを指定する」を参照してください。
SELECT INTO OUTFILE
S3
ステートメントで作成されたマニフェストでは、このステートメントで作成された順にデータファイルがリストされます。例えば、SELECT INTO OUTFILE S3
ステートメントでデータファイルの保存先のパスとして s3-us-west-2://bucket/prefix
を指定し、マニフェストファイルを作成したとします。この場合、指定した Amazon S3 バケットに保存されるマニフェストファイルは s3-us-west-2://bucket/prefix.manifest
という名前で、以下の内容になります。
{ "entries": [ { "url":"s3-us-west-2://bucket/prefix.part_00000" }, { "url":"s3-us-west-2://bucket/prefix.part_00001" }, { "url":"s3-us-west-2://bucket/prefix.part_00002" } ] }
SELECT INTO OUTFILE S3
SELECT INTO OUTFILE S3
ステートメントを使用して、DB クラスターからクエリしたデータを直接 Amazon S3 バケット内の区切りテキストファイルに保存できます。
圧縮ファイルはサポートされていません。暗号化ファイルは Aurora MySQL バージョン 2.09.0 以降でサポートされています。
構文
SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr
[,select_expr
...] [FROMtable_references
[PARTITIONpartition_list
] [WHEREwhere_condition
] [GROUP BY {col_name
|expr
|position
} [ASC | DESC], ... [WITH ROLLUP]] [HAVINGwhere_condition
] [ORDER BY {col_name
|expr
|position
} [ASC | DESC], ...] [LIMIT {[offset
,]row_count
|row_count
OFFSEToffset
}] INTO OUTFILE S3 's3_uri
' [CHARACTER SETcharset_name
] [export_options
] [MANIFEST {ON | OFF}] [OVERWRITE {ON | OFF}] [ENCRYPTION {ON | OFF | SSE_S3 | SSE_KMS ['cmk_id
']}]export_options
: [FORMAT {CSV|TEXT} [HEADER]] [{FIELDS | COLUMNS} [TERMINATED BY 'string
'] [[OPTIONALLY] ENCLOSED BY 'char
'] [ESCAPED BY 'char
'] ] [LINES [STARTING BY 'string
'] [TERMINATED BY 'string
'] ]
パラメータ
SELECT INTO OUTFILE S3
ステートメントでは、Aurora に固有の次の必須パラメータとオプションパラメータを使用します。
- s3-uri
-
Amazon S3 のプレフィックスとして使用する URI を指定します。「Amazon S3 バケットへのパスの指定」で説明されている構文を使用してください。
- フォーマット {CSV|テキスト} [ヘッダー]
-
必要に応じて、データを CSV 形式で保存します。
TEXT
オプションはデフォルトで、既存の MySQL エクスポート形式を生成します。CSV
オプションは、カンマ区切りのデータ値を生成します。CSV 形式は、 RFC-4180の仕様に従います。オプションのキーワード HEADER
を指定すると、出力ファイルに 1 つのヘッダー行が含まれます。ヘッダー行のラベルは、SELECT
ステートメントの列名に対応します。AWS ML サービスで使用するトレーニングデータモデルに CSV ファイルを使用できます。AWS ML サービスでエクスポートされた Aurora データを使用する方法の詳細については、「SageMaker モデルトレーニング用のデータを Amazon S3 にエクスポートする (高度)」を参照してください。 - マニフェスト {オン | オフ}
-
Amazon S3 でマニフェストファイルを作成するかどうかを指定します。マニフェストファイルは、JSON (JavaScript Object Notation) ファイルであり、
LOAD DATA FROM S3 MANIFEST
ステートメントでデータを Aurora DB クラスター内にロードする際に使用できます。LOAD DATA FROM S3 MANIFEST
の詳細については、Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード を参照してください。クエリで
MANIFEST ON
を指定すると、すべてのデータファイルが作成されてアップロードされた後で、Amazon S3 内にマニフェストファイルが作成されます。マニフェストファイルは次のパスで作成されます。s3
-region
://bucket-name
/file-prefix
.manifestマニフェストファイルのコンテンツの詳しい形式については、「データファイルをリスト化するマニフェストの作成」を参照してください。
- 上書き {オン | オフ}
-
指定した Amazon S3 バケット内の既存のファイルを上書きするかどうかを指定します。
OVERWRITE ON
を指定すると、s3-uri
に指定した URI のファイルプレフィックスと一致する既存のファイルは上書きされます。上書きされないと、エラーが発生します。 - ENCRYPTION {ON | OFF | SSE_S3 | SSE_KMS ['
cmk_id
']} -
Amazon S3 マネージドキーを使ったサーバー側の暗号化 (SSE-S3) または AWS KMS keys (SSE-KMS、AWS マネージドキー およびカスタマーマネージドキーを含む) を使用するかどうかを指定します。
SSE_S3
およびSSE_KMS
設定は、Aurora MySQL バージョン 3.05 以降で使用できます。次の例に示すように、
ENCRYPTION
句の代わりにaurora_select_into_s3_encryption_default
セッション変数を使用することもできます。SQL 句またはセッション変数のいずれかを使用しますが、両方は使用できません。set session set session aurora_select_into_s3_encryption_default={ON | OFF | SSE_S3 | SSE_KMS};
SSE_S3
およびSSE_KMS
設定は、Aurora MySQL バージョン 3.05 以降で使用できます。aurora_select_into_s3_encryption_default
を次の値に設定した場合:-
OFF
– S3 バケットのデフォルトの暗号化ポリシーが適用されます。aurora_select_into_s3_encryption_default
の初期値はOFF
です。 -
ON
またはSSE_S3
– S3 オブジェクトは Amazon S3 マネージドキー (SSE-S3) を使用して暗号化されます。 -
SSE_KMS
– S3 オブジェクトは AWS KMS key を使用して暗号化されます。この場合は、セッション変数
aurora_s3_default_cmk_id
も含めます。次に例を示します。set session aurora_select_into_s3_encryption_default={SSE_KMS}; set session aurora_s3_default_cmk_id={NULL | '
cmk_id
'};-
aurora_s3_default_cmk_id
がNULL
のとき、S3 オブジェクトは AWS マネージドキー を使用して暗号化されます。 -
aurora_s3_default_cmk_id
がが空でない文字列cmk_id
の場合、S3 オブジェクトはカスタマーマネージドキーを使用して暗号化されます。cmk_id
の値は空の文字列にはできません。
-
SELECT INTO OUTFILE S3
コマンドを使用すると、Aurora は次のように暗号化を決定します。-
SQL コマンドに
ENCRYPTION
句が含まれている場合、Aurora はENCRYPTION
の値のみに依存し、セッション変数を使用しません。 -
ENCRYPTION
句がない場合、Aurora はセッション変数の値に依存します。
詳細については、Amazon Simple Storage Service ユーザーガイドの「Amazon S3 マネージドキー (SSE-S3) によるサーバー側の暗号化」および「AWS KMS キー (SSE-KMS) によるサーバー側の暗号化」を参照してください。
-
他のパラメータの詳細については、MySQL ドキュメントの「SELECT ステートメント
考慮事項
Amazon S3 バケットに書き込まれるファイルの数は、SELECT INTO OUTFILE S3
ステートメントで選択したデータの量と Aurora MySQL のファイルサイズのしきい値によって異なります。デフォルトのファイルサイズのしきい値は 6 GB です。ステートメントで選択したデータがファイルサイズのしきい値より少ない場合は、1 つのファイルが作成されます。それ以外の場合は、複数のファイルが作成されます。このステートメントで作成されるファイルについては、以下の点にも留意してください。
-
Aurora MySQL では、データファイルの行がファイル境界で分割されないことが保証されます。複数のファイルの場合、最後のファイルを除くすべてのデータファイルは、通常、ファイルサイズのしきい値に近いサイズになります。ただし、ファイルサイズのしきい値を常に下回る必要があるために、1 つの行が 2 つのデータファイル間にまたがる場合がまれにあります。この場合、Aurora MySQL では行が分割されないようにデータファイルを作成するため、ファイルサイズのしきい値を上回ることがあります。
-
Aurora MySQL では各
SELECT
ステートメントをアトミックトランザクションとして実行するため、SELECT INTO OUTFILE S3
ステートメントで大きなデータセットを選択すると、実行時間が長引く場合があります。何らかの理由でステートメントが失敗すると、ステートメントの発行をやり直す必要が生じる場合があります。ただし、ステートメントが失敗しても、Amazon S3 にアップロード済みのファイルは保存先の Amazon S3 バケット内に残るため、再実行するステートメントでは初期からではなく残りのデータだけをアップロードできます。 -
選択するデータが 25 GB を超える場合は、複数回の
SELECT INTO OUTFILE S3
ステートメントを使用してデータを Amazon S3 に保存することをお勧めします。実行するステートメントごとに、保存するデータ部分を選択し、保存先としてfile_prefix
パラメータに異なるs3-uri
を指定します。選択するデータを複数のステートメントでパーティション化すると、1 つのステートメントでエラーから回復しやすくなります。1 つのステートメントでエラーが発生した場合は、データの一部だけを再選択して Amazon S3 にアップロードする必要があります。複数のステートメントを使用すると、1 回のトランザクションの実行時間が短くなり、パフォーマンスも向上します。 -
複数の
SELECT INTO OUTFILE S3
ステートメント間で、file_prefix
パラメータに同じs3-uri
を指定した場合、これらのステートメントを同時に実行してデータを Amazon S3 に保存しようとしたときの動作は定義されていません。 -
Aurora MySQL では、テーブルスキーマやファイルメタデータなどのメタデータは Amazon S3 にアップロードされません。
-
障害から回復する目的などで
SELECT INTO OUTFILE S3
を再実行する場合もあります。このような場合は、s3-uri
で指定するファイルプレフィックスと同じ既存のデータファイルを Amazon S3 バケットから削除するか、OVERWRITE ON
クエリでSELECT INTO OUTFILE S3
を指定します。
SELECT INTO OUTFILE S3
ステートメントの成否に応じて、一般的な MySQL エラー番号およびレスポンスが返されます。MySQL エラー番号およびレスポンスにアクセスできない場合は、最も簡単な確認方法として MANIFEST ON
をステートメントで指定します。マニフェストファイルは、ステートメントで最後に書き込まれるファイルです。つまり、マニフェストファイルがあれば、ステートメントが完了したことになります。
現在、実行中に SELECT
INTO OUTFILE S3
ステートメントの進行状況を直接モニタリングする方法はありません。ただし、このステートメントを使用して Aurora MySQL から Amazon S3 に大量のデータを書き込む際に、ステートメントで選択されるデータのサイズがわかっている場合があります。このような場合、Amazon S3 でデータファイルの作成をモニタリングすることで、進行状況を推測できます。
そのためには、ステートメントで選択する約 6 GB のデータごとにデータファイルが指定先の Amazon S3 バケットに作成されることに注目します。選択対象のデータのサイズを 6 GB で割り、作成されるデータファイルの推定数を割り出します。次に Amazon S3 にアップロードされたファイルの数をステートメントの実行中にモニタリングして、ステートメントの進行状況を推測できます。
例
次のステートメントでは、employees
テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターとは異なるリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (,
) 文字、各行の末尾に改行 (\n
) 文字が付きます。指定先の Amazon S3 バケットに sample_employee_data
ファイルプレフィックスと一致するファイルがあると、ステートメントからエラーが返されます。
SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
次のステートメントでは、employees
テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターと同じリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (,
) 文字、各行の末尾に改行 (\n
) 文字が付きます。このステートメントでは、マニフェストファイルも作成されます。指定先の Amazon S3 バケットに sample_employee_data
ファイルプレフィックスと一致するファイルがあると、ステートメントからエラーが返されます。
SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' MANIFEST ON;
次のステートメントでは、employees
テーブルからすべてのデータを選択し、そのデータを Aurora DB クラスターとは異なるリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (,
) 文字、各行の末尾に改行 (\n
) 文字が付きます。指定先の Amazon S3 バケットで sample_employee_data
ファイルプレフィックスと一致する既存のファイルは上書きされます。
SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' OVERWRITE ON;
次のステートメントでは、employees
テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターと同じリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (,
) 文字、各行の末尾に改行 (\n
) 文字が付きます。このステートメントでは、マニフェストファイルも作成されます。指定先の Amazon S3 バケットで sample_employee_data
ファイルプレフィックスと一致する既存のファイルは上書きされます。
SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' MANIFEST ON OVERWRITE ON;