PolarDB for MySQL では、複数のパラレルワーカーを使用してローカルテーブルを Object Storage Service (OSS) にエクスポートできます。これにより、大規模なデータセットのエクスポート時間を大幅に短縮できます。
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
Enterprise Edition を実行している PolarDB for MySQL クラスター。リビジョン番号は 8.0.1.1.38 以降(バージョン 8.0.1)または 8.0.2.2.25 以降(バージョン 8.0.2)であること
クラスターに設定された OSS バケットおよび OSS サーバー。セットアップ手順については、「OSS 外部テーブルを使用して OSS データにアクセスする」をご参照ください。
(推奨)読み取り専用ノードへの接続。プライマリノードへの影響を避けるため、読み取り専用ノードでエクスポートタスクを実行してください。
/*FORCE_SLAVE*/ヒントワードを SQL ステートメントに追加するか、直接読み取り専用ノードに接続します。
制限事項
並列エクスポートが可能なのは単一テーブルクエリ(
SELECT * FROM table)のみです。JOIN、ORDER BY、またはGROUP BYを含むクエリは、並列エクスポートの対象外です。
構文
SELECT [/*+parallel(N)*/] * FROM table_name
INTO OSSOUTFILE 'outfile_path'
[COLUMNS TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[NULL_MARKER BY 'string' | ESCAPED BY 'char']
[LINES TERMINATED BY 'string'];並列エクスポートをトリガーするには、/*+parallel(N)*/ ヒントワードを追加します。ここで、N はパラレルワーカーの数です。または、エラスティック並列クエリ機能を有効にして、データベースが自動的に並列処理の次数を決定するようにすることもできます。詳細については、「概要」をご参照ください。
INTO OSSOUTFILE 句が拡張する完全な SELECT 構文については、MySQL ドキュメントをご参照ください。
句
| 句 | 説明 |
|---|---|
COLUMNS TERMINATED BY 'string' | フィールド間の区切り文字。 |
OPTIONALLY ENCLOSED BY 'char' | フィールドの両端に配置される文字。OPTIONALLY を指定すると、文字列型フィールドにのみ適用されます。指定しない場合は、すべてのフィールドタイプに適用されます。 |
NULL_MARKER BY 'string' | NULL 値のテキスト表現。最も高い優先度を持ちます。任意の文字列を指定できます。 |
ESCAPED BY 'char' | 1 文字のエスケーププレフィックス。NULL 出力は、エスケープ文字の後に N が続く形式になります(例:ESCAPED BY '\' の場合、出力は \N になります)。NULL_MARKER の次に高い優先度を持ちます。どちらも設定されていない場合、NULL は囲み文字なしでリテラル文字列 NULL として出力されます。 |
LINES TERMINATED BY 'string' | 行間の区切り文字。 |
パラメーター
| パラメーター | 説明 |
|---|---|
outfile_path | OSS 内の宛先パス。スラッシュ (/) で区切られた 3 つの部分で構成されます:OSS サーバー名、オプションのタスクパス(マルチレベルパスの場合は複数の / を含むことができます)、および出力ファイル名。アップロード後の完全な OSS パスは「OSS サーバーパス + タスクパス」となります。ファイル名は必ず含める必要があります。 |
table_name | エクスポートするローカルテーブルの名前。 |
グローバルパラメーター
| パラメーター | デフォルト | 有効範囲 | 説明 |
|---|---|---|---|
loose_oss_outfile_buffer_size | 134217728 バイト(128 MiB) | 102400~536870912 バイト | 各パラレルエクスポートワーカースレッドに割り当てられるメモリ量。この値を増やすと、一般的にエクスポートスループットが向上します。 |
注意事項
並列エクスポートの最小データしきい値
各ワーカーは最低でも 1,024 KB(pq_oss_min_worker_write_size)のデータを書き込む必要があります。ワーカーごとの推定出力がこのしきい値を下回る場合、並列エクスポートは使用されません。並列エクスポートが有効になったかどうかを確認するには、以下のトラブルシューティング手順をご参照ください。
実行中のエクスポートのモニター
エクスポート実行中に別のセッションで以下のコマンドを実行します。クラスターエンドポイント経由で接続する場合は、エクスポートステートメントと同じノードでこれらのコマンドを実行してください。
現在のエクスポートタスクで使用されている合計メモリ量(バイト):
SHOW STATUS LIKE "%Oss_outfile_memory_used%";アクティブなエクスポートワーカースレッドの総数:
SHOW STATUS LIKE "%Oss_outfile_threads_running%";
テーブルを並列でエクスポートする
以下の例では、lineitem テーブルを 4 つのパラレルワーカーでエクスポートします。
クエリが並列実行をサポートしているか確認します。 プランナーがスキャンを並列化できるかどうかを検証するために、
EXPLAINを実行します。EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem;期待される出力:
+----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 5392844 | 100.00 | NULL | | 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 1348211 | 100.00 | Parallel scan (4 workers) | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+Extra 列に
Parallel scanが表示されている場合、並列実行が利用可能です。OSS サーバーを作成します。 すでに OSS サーバーが設定済みの場合は、この手順をスキップしてください。
CREATE SERVER outserver FOREIGN DATA WRAPPER oss OPTIONS ( EXTRA_SERVER_INFO '{"oss_endpoint": "oss-cn-zhangjiakou.aliyuncs.com", "oss_bucket": "polardb", "oss_access_key_id": "<your-access-key-id>", "oss_access_key_secret": "<your-access-key-secret>", "oss_prefix": "B_outfile"}' );プレースホルダーの値を、ご利用の OSS 認証情報およびバケット情報に置き換えてください。
このクエリで並列エクスポートがサポートされているか確認します。 プランナーが並列エクスポートを使用することを確認するために、完全なエクスポートステートメントに対して
EXPLAINを実行します。EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';期待される出力:
+----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 5805759 | 100.00 | Parallel export OSS outfile | | 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 1451439 | 100.00 | Parallel scan (4 workers); Parallel export OSS outfile | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+Extra 列に
Parallel export OSS outfileが表示されている場合、並列エクスポートが有効です。表示されない場合は、「トラブルシューティング」をご参照ください。エクスポートを実行します。
SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';エクスポート実行中は、別のセッションから「注意事項」で説明されている
SHOW STATUSコマンドを使用してリソース使用量をモニターできます。
トラブルシューティング
EXPLAIN の出力に Parallel export OSS outfile が表示されない場合は、オプティマイザートレースを使用してその理由を特定します。
オプティマイザートレースを有効にします。
SET optimizer_trace="enabled=on";並列でエクスポートされる結果を持つ SQL ステートメントの実行計画を表示するために、以下のステートメントを実行します。
EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem WHERE l_orderkey < 100 INTO OSSOUTFILE 'default_oss_server/t1' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';トレース結果を照会します。
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;出力結果で
considered_parallel_outfileオブジェクトを見つけ、causeフィールドを確認します。"considered_parallel_outfile": { "choose": false, "storage": "OSS", "format": "CSV", "mean_outfile_record_length": "79 B", "estimate_single_worker_outfile_size": "8 KB", "cause": "The data written by each worker should be greater than 1024 KB (pq_oss_min_worker_write_size)." }causeフィールドには、並列エクスポートが使用されなかった理由が記述されています。