全部產品
Search
文件中心

PolarDB:將本地表串列匯出至OSS引擎

更新時間:Mar 21, 2025

您可以通過PolarDB提供的OSSOUTFILE功能,將資料庫內的資料表匯出為CSV檔案,並儲存在OSS引擎上。

前提條件

您的PolarDB叢集需滿足如下條件之一:

  • 核心版本MySQL 8.0.1,且修訂版本為8.0.1.1.30及以上。

  • 核心版本MySQL 8.0.2,且修訂版本為8.0.2.2.8及以上。

如何確認叢集版本,詳情請參見查詢版本號碼

注意事項

  • 暫不支援通過DMS串連PolarDB將資料檔案匯出至OSS引擎,相應的報錯為:

    Can not issue executeUpdate() or executeLargeUpdate() for SELECTs

    您可以通過用戶端或者命令列串連到PolarDB後進行匯出。詳情請參見串連資料庫叢集(中文下線重新導向)

  • 如果您需要增量備份資料至OSS,您可以建立備份計劃,並配置備份計劃來將資料增量備份至OSS。

  • 建議您在唯讀節點執行匯出任務。您可以在SQL語句中添加HINT文法/*FORCE_SLAVE*/或直接連接唯讀節點進行匯出。

參數說明

參數

說明

loose_oss_outfile_buffer_size

每個OSSOUTFILE線程可以佔用的記憶體大小。取值範圍:102400~536870912。預設值為134217728。單位:Byte。一般來說,佔用記憶體越大,匯出速度越快。

loose_max_oss_outfile_threads

PolarDB可以同時啟動的OSSOUTFILE線程數量。取值範圍:1~100。預設值為1。單位:個。

您可以使用SHOW STATUS LIKE "Oss_outfile_threads_running";命令查看當前叢集正在啟動並執行OSSOUTFILE線程數量。

說明

叢集版本為PolarDB MySQL版8.0.1.1.38及以上的版本時,該參數已失效。

說明

使用OSSOUTFILE功能匯出CSV格式的資料檔案到OSS引擎過程中佔用叢集最大的總記憶體為:

loose_max_oss_outfile_threads * loose_oss_outfile_buffer_size

盡量不要使OSSOUTFILE功能佔用的總記憶體超過節點記憶體的5%,否則可能會影響當前節點上的其他業務。

使用說明

文法

SELECT * FROM table_name INTO OSSOUTFILE 'outfile_path' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
說明
  • COLUMNS TERMINATED BY:表示每個欄位之間的分隔字元。

  • OPTIONALLY ENCLOSED BY:表示欄位兩端的標識符,加上OPTIONALLY後,只會在字串類型的欄位兩端加標識符,否則會在所有類型的欄位兩端加標識符。

  • NULL_MARKER BY:表示NULL值輸出到文本的字元。NULL的輸出值有如下三種定義方式,優先順序從高到低:

    • NULL_MARKER:直接定義NULL的輸出值,NULL_MARKER可以定義為任意值,優先順序最高。

    • ESCAPED BY:只能寫單字元,NULL的輸出值為字元+N。例如,ESCAPED BY '\',則NULL會被輸出為\N,優先順序第二。

    • NULL(預設):如果以上兩者都沒有,則預設NULL的輸出值為字串“NULL”,優先順序最低。NULL的兩端沒有ENCLOSED標識符。

  • LINES TERMINATED BY:每一行之間的分隔字元。

詳情請參見MySQL官方文檔

參數說明

參數

說明

outfile_path

主要標識輸出到OSS的檔案位置,包含如下幾部分內容:

  • OSS Server資訊,用來標識當前使用的OSS節點和上傳的基本路徑。詳情請參見通過OSS外表訪問OSS資料

  • (可選)當前任務單獨的路徑。

  • 上傳後的檔案名稱。

上述三者之間用/串連。當前任務單獨的路徑中可以包含多個/,表示使用多級路徑。上傳到OSS引擎後,其整體的檔案路徑為:OSS Server中的路徑+單獨的路徑。outfile_path中必須包含上傳後的檔案名稱,用來說明最後產生的檔案名稱。

table_name

表名稱。

操作步驟

建立OSS Server

CREATE SERVER outserver FOREIGN DATA WRAPPER oss OPTIONS ( EXTRA_SERVER_INFO '{"oss_endpoint": "oss-cn-zhangjiakou-internal.aliyuncs.com", "oss_bucket": "polardb", "oss_access_key_id": "*******", "oss_access_key_secret": "********", "oss_prefix":"B_outfile"}');                 
說明
  • 此處以高版本建立OSS Server語句為例。實際操作時,請根據您叢集的核心版本進行調整。

  • oss_endpoint需為內網地址,規則格式為oss-{xxx}-internal.aliyuncs.com

匯出至OSS

以上傳的OSS檔案oss://polardb/B_outfile/tpch/1t/parallel-lineitem.CSV為例:

  • bucket名稱:polardb。

  • 路徑及檔案名稱:B_outfile/tpch/1t/parallel-lineitem.CSV為例。

SELECT * FROM lineitem INTO OSSOUTFILE 'outserver/tpch/1t/parallel-lineitem.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';

查詢任務佔用記憶體數與線程數

若您的叢集核心版本為8.0.1.1.38及以上版本時,您可以通過以下命令查看當前置出任務即時佔用的總記憶體數和匯流排程數。

  • 查看匯出任務即時佔用的總記憶體數,單位為位元組。

    SHOW STATUS LIKE "%Oss_outfile_memory_used%";
  • 查看匯出任務即時佔用的匯流排程數。

    SHOW STATUS LIKE "%Oss_outfile_threads_running%";
說明

當您使用的是叢集地址執行匯出任務時,必須保證SHOW STATUS命令和匯出命令在同一個節點執行,才能查詢當前節點中匯出命令佔用的記憶體資源資訊。

後續步驟

常見問題

匯出至OSS時,出現報錯資訊:ERROR 1086 (HY000): File 'xxxx' already exists

該錯誤出現時,說明當前OSS上存在同名檔案。您可以參考如下兩種解決方案:

  • 手動刪除OSS上對應的檔案,再重新執行SELECT ... INTO OSSOUTFILE ...語句。

  • 使用OSS_REPLACE_EXISTED_FILE()Hint文法來強制覆蓋同名檔案。格式如下:

    SELECT /*+ OSS_REPLACE_EXISTED_FILE() */ * FROM lineitem INTO OSSOUTFILE 'outserver/tpch/1t/parallel-lineitem.CSV' COLUMNS TERMINATED BY '|@|' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY "" LINES TERMINATED BY '\n';
    說明
    • 使用該Hint文法會強制覆蓋OSS上的同名檔案,覆蓋後未開啟OSS多版本功能時檔案無法找回,請謹慎考慮。操作前,您可以考慮開啟OSS的版本控制功能。

    • Hint文法所需的PolarDB叢集需為如下版本之一:

      • 核心版本MySQL 8.0.1,且修訂版本為8.0.1.1.31及以上。

      • 核心版本MySQL 8.0.2,且修訂版本為8.0.2.2.9及以上。

匯出至OSS時,出現報錯資訊:OSS error: error message : The bucket you access does not belong to you., error code: AccessDenied

該錯誤出現時,說明您設定的RAM使用者或阿里雲帳號的AccessKey沒有當前OSS bucket的許可權。請檢查您AccessKey的許可權。