將來自 Amazon Aurora MySQL 資料庫叢集的資料儲存至 Amazon S3 儲存貯體中的文字檔案 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將來自 Amazon Aurora MySQL 資料庫叢集的資料儲存至 Amazon S3 儲存貯體中的文字檔案

您可以使用該SELECT INTO OUTFILE S3陳述式查詢來自 Amazon Aurora MySQL 資料庫叢集的資料,並將其儲存到存放在 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 資料庫叢集

注意

Aurora Serverless v1 資料庫叢集不支援此功能。Aurora Serverless v2 資料庫叢集支援它。

您也可以使用 AWS Management Console、 AWS CLI或 Amazon RDS API,將資料庫叢集資料和資料庫叢集快照資料儲存到 Amazon S3。如需詳細資訊,請參閱 將資料庫叢集資料匯出至 Amazon S3將資料庫叢集快照資料匯出至 Amazon S3

授權 Aurora MySQL 存取 Amazon S3

您必須先授權 Aurora MySQL 資料庫叢集存取 Amazon S3,才能將資料儲存至 Amazon S3 儲存貯體。

授權 Aurora MySQL 存取 Amazon S3
  1. 建立可提供儲存貯體和物件許可的 AWS Identity and Access Management (IAM) 政策,讓您的 Aurora MySQL 資料庫叢集存取 Amazon S3。如需說明,請參閱建立 IAM 政策來存取 Amazon S3 資源

    注意

    在 Aurora MySQL 3.05 版及更高版本中,您可以使用 AWS KMS 客戶管理的金鑰加密物件。若要這麼做,請在 IAM 政策中包含 kms:GenerateDataKey 許可。如需詳細資訊,請參閱 建立 IAM 政策來存取 AWS KMS 資源

    您不需要此權限即可使用 AWS 受管金鑰 或 Amazon S3 受管金鑰加密物件 (SSE-S3)。

  2. 建立 IAM 角色,並將您於建立 IAM 政策來存取 Amazon S3 資源中建立的 IAM 政策連接至新的 IAM 角色。如需說明,請參閱「建立 IAM 角色以允許 Amazon Aurora 存取 AWS 服務」。

  3. 對於 Aurora MySQL 第 2 版,將 aurora_select_into_s3_roleaws_default_s3_role 資料庫叢集參數設定為新 IAM 角色的 Amazon Resource Name (ARN)。如果 aurora_select_into_s3_role 中未指定 IAM 角色,Aurora 會使用 aws_default_s3_role 中指定的 IAM 角色。

    對於 Aurora MySQL 第 3 版,請使用 aws_default_s3_role

    如果叢集屬於 Aurora 全球資料庫,請為全球資料庫中的每個 Aurora 叢集設定此參數。

    如需資料庫叢集參數的詳細資訊,請參閱 Amazon Aurora 資料庫叢集和資料庫執行個體參數

  4. 若要允許 Aurora MySQL 資料庫叢集的資料庫使用者存取 Amazon S3,請將您在建立 IAM 角色以允許 Amazon Aurora 存取 AWS 服務中建立的角色與資料庫叢集建立關聯。

    對於 Aurora 全球資料庫,請將此角色與全球資料庫中的每個 Aurora 叢集建立關聯。

    如需將 IAM 角色與資料庫叢集建立關聯的相關資訊,請參閱將 IAM 角色與 Amazon Aurora MySQL 資料庫叢集建立關聯

  5. 設定 Aurora MySQL 資料庫叢集來允許對外連接至 Amazon S3。如需說明,請參閱「啟用從 Amazon Aurora MySQL 至其他 AWS 服務的網路通訊」。

    對於 Aurora 全球資料庫,請對全球資料庫中的每個 Aurora 叢集啟用傳出連線。

授權在 Aurora MySQL 中儲存資料

發出 SELECT INTO OUTFILE S3 陳述式的資料庫使用者必須具備特定的角色或權限。在 Aurora MySQL 第 3 版中,您授予 AWS_SELECT_S3_ACCESS 角色。在 Aurora MySQL 第 2 版中,您授予 SELECT INTO S3 權限。根據預設,會將適當的角色或權限授予資料庫叢集的管理使用者。您可以使用下列其中一個陳述式,將此權限授予另一個使用者。

請針對 Aurora MySQL 第 3 版使用下列陳述式:

GRANT AWS_SELECT_S3_ACCESS TO 'user'@'domain-or-ip-address'
提示

在 Aurora MySQL 第 3 版中使用角色技術時,您也可以使用 SET ROLE role_nameSET ROLE ALL 陳述式啟用角色。如果您不熟悉 MySQL 8.0 角色系統,您可以在角色型權限模型進一步了解。有關更多詳細信息,請參閱 MySQL 參考手冊中的使用角色

此僅適用於目前的作用中工作階段。重新連線時,您必須再次執行SET ROLE陳述式以授與權限。如需詳細資訊,請參閱 MySQL Reference Manual (MySQL 參考手冊) 中的 SET ROLE 陳述式

您可以使用 activate_all_roles_on_login 資料庫叢集參數,在使用者連線至資料庫執行個體時自動啟動所有角色。設定此參數時,通常不需要明確呼叫SET ROLE陳述式即可啟用角色。如需詳細資訊,請參閱 MySQL Reference Manual (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 資料庫或 RDS for MySQL 資料庫執行個體。如果您在 Aurora MySQL 資料庫叢集 (複寫主節點) 和 MySQL 資料庫 (複寫用戶端) 之間設定複寫,則角色或權限的 GRANT 陳述式會導致複寫停止並產生錯誤。您可以放心略過此錯誤並繼續複寫。若要在 RDS for MySQL 資料庫執行個體上略過此錯誤,請使用 mysql_rds_skip_repl_error 程序。若要略過外部 MySQL 資料庫上的錯誤,請使用 slave_skip_errors 系統變數 (Aurora MySQL 第 2 版) 或 replica_skip_errors 系統變數 (Aurora MySQL 第 3 版)。

指定 Amazon S3 儲存貯體的路徑

指定路徑將資料和資訊清單存放在 Amazon S3 儲存貯體的語法,類似於 LOAD DATA FROM S3 PREFIX 陳述式中使用的語法,如下所示。

s3-region://bucket-name/file-prefix

路徑包含以下值:

  • region(選擇性) — 包含要將資料儲存到的 Amazon S3 儲存貯體的 AWS 區域。此值是選用的。如果未指定 region 值,Aurora 會將檔案儲存至資料庫叢集所在同一個區域中的 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 做為路徑來存放資料檔案,並建立三個資料檔案。指定的 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 資料庫叢集。如需使用資訊清單檔案從 Amazon S3 將資料檔案載入 Aurora MySQL 資料庫叢集的詳細資訊,請參閱使用資訊清單指定要載入的資料檔案

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 陳述式從資料庫叢集查詢資料,然後將資料直接儲存至 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 ...] [FROM table_references [PARTITION partition_list] [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] INTO OUTFILE S3 's3_uri' [CHARACTER SET charset_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 儲存貯體的路徑 中描述的語法。

FORMAT {CSV|TEXT} [HEADER]

選擇性地以 CSV 格式儲存資料。

TEXT 選項為預設值,並會產生現有的 MySQL 匯出格式。

CSV 選項會產生逗號分隔的資料值。CSV 格式會遵循 RFC-4180 中的規格。如果您指定選用的關鍵字 HEADER,則輸出檔包含一個標題列。標題列的標籤對應於 SELECT 陳述式中的欄名稱。您可以使用 CSV 檔案來訓練資料模型,以搭配 AWS ML 服務使用。如需將匯出的 Aurora 資料與 AWS ML 服務搭配使用的詳細資訊,請參閱將資料匯出到 Amazon S3 進行 SageMaker 模型訓練 (進階)

MANIFEST {ON | OFF}

指出是否在 Amazon S3 中建立資訊清單檔案。資訊清單檔案是 JavaScript 物件符號 (JSON) 檔案,可用來透過LOAD DATA FROM S3 MANIFEST陳述式將資料載入 Aurora DB 叢集。如需有關 LOAD DATA FROM S3 MANIFEST 的詳細資訊,請參閱 從 Amazon S3 儲存貯體中的文字檔案將資料載入 Amazon Aurora MySQL 資料庫叢集

如果在查詢中指定 MANIFEST ON,則在建立和上傳所有資料檔案之後,就會在 Amazon S3 中建立資訊清單檔案。資訊清單檔案是使用下列路徑來建立:

s3-region://bucket-name/file-prefix.manifest

如需資訊清單檔案之內容格式的詳細資訊,請參閱建立資訊清單以列出資料檔案

OVERWRITE {ON | OFF}

指出是否覆寫所指定 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_S3SSE_KMS 設定適用於 Aurora MySQL 3.05 版及更新版本。

您也可以使用 aurora_select_into_s3_encryption_default 工作階段變數,而不是如下列範例所示的 ENCRYPTION 子句。使用 SQL 子句或工作階段變數,但不同時使用兩者。

set session set session aurora_select_into_s3_encryption_default={ON | OFF | SSE_S3 | SSE_KMS};

SSE_S3SSE_KMS 設定適用於 Aurora MySQL 3.05 版及更新版本。

當您將 aurora_select_into_s3_encryption_default 設定為下列值時:

  • OFF – 會遵循 S3 儲存貯體的預設加密政策。aurora_select_into_s3_encryption_default 的預設值為 OFF

  • ONSSE_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_idNULL,S3 物件會使用 AWS 受管金鑰進行加密。

    • aurora_s3_default_cmk_id 是非空字串 cmk_id,S3 物件會使用客戶受管金鑰進行加密。

      cmk_id 的值不可以是空字串。

當您使用 SELECT INTO OUTFILE S3 命令時,Aurora 會按下列方式確定加密:

  • 如果 SQL 命令中存在 ENCRYPTION 子句,則 Aurora 僅依賴 ENCRYPTION 的值,且不會使用工作階段變數。

  • 如果 ENCRYPTION 子句不存在,Aurora 會依賴工作階段變數的值。

如需詳細資訊,請參閱 Amazon S3 受管金鑰搭配使用伺服器端加密 (SSE-S3) Amazon 簡單儲存服務使用者指南中的使用伺服器端加密 (SSE-KMS)。AWS KMS

您可以在 MySQL 文件的 SELECT 陳述式LOAD DATA 陳述式中找到其他參數的詳細資訊。

考量事項

寫入 Amazon S3 儲存貯體的檔案數目,取決於 SELECT INTO OUTFILE S3 陳述式所選取的資料量和 Aurora MySQL 的檔案大小臨界值。預設的檔案大小臨界值為 6 GB。如果陳述式所選取的資料小於檔案大小臨界值,則只會建立單一檔案,否則會建立多個檔案。關於此陳述式所建立的檔案,其他考量包括:

  • Aurora MySQL 保證資料檔案中的列分割不會跨越檔案界限。若為多個檔案,每個資料檔案 (最後一個檔案除外) 的大小通常接近檔案大小臨界值。不過,偶爾低於檔案大小臨界值會導致一列分割在兩個資料檔案中。在此情況下,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,以便於儲存資料檔案時使用。使用多個陳述式來分割要選取的資料,可以更輕鬆地從某個陳述式中的錯誤中復原。如果某個陳述式發生錯誤,則只需要重新選取部分資料並上傳至 Amazon S3。使用多個陳述式也有助於避免單一長時間執行的交易,可提升效能。

  • 如果多個 SELECT INTO OUTFILE S3 陳述式平行執行來選取資料給 Amazon S3,而且在 file_prefix 參數中使用相同的 s3-uri,則無法確定行為。

  • Aurora MySQL 不會將中繼資料上傳至 Amazon S3,例如資料表結構描述或檔案中繼資料。

  • 在某些情況下,您可能需要重新執行 SELECT INTO OUTFILE S3 查詢,例如從失敗中復原。在這些情況下,您必須從 Amazon S3 儲存貯體中移除具有相同檔案字首 (在 s3-uri 中指定) 的任何現有資料檔案,或在 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 資料庫叢集所在區域中的 Amazon S3 儲存貯體。在此陳述式所建立的資料檔案中,每個欄位的結尾是逗號 (,) 字元,而每一列的結尾是換行 (\n) 字元。如果符合 sample_employee_data 檔案字首的檔案存在於指定的 Amazon S3 儲存貯體中,此陳述式會傳回錯誤。

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 資料庫叢集所在同一個區域中的 Amazon S3 儲存貯體。在此陳述式所建立的資料檔案中,每個欄位的結尾是逗號 (,) 字元,而每一列的結尾是換行 (\n) 字元,此外也建立一個資訊清單檔案。如果符合 sample_employee_data 檔案字首的檔案存在於指定的 Amazon S3 儲存貯體中,此陳述式會傳回錯誤。

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 資料庫叢集所在區域中的 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 資料庫叢集所在同一個區域中的 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;