全部产品
Search
文档中心

PolarDB:Ekspor tabel lokal ke OSS secara paralel

更新时间:Jul 06, 2025

Anda dapat mengekspor tabel lokal ke Object Storage Service (OSS) secara paralel, yang secara signifikan meningkatkan efisiensi ekspor data. Topik ini menjelaskan cara melakukan ekspor tersebut.

Batasan

  • Untuk kluster PolarDB for MySQL, edisi produk harus Enterprise Edition dengan versi berikut:

    • Versi 8.0.1: Nomor revisi minimal 8.0.1.1.38.

    • Versi 8.0.2: Nomor revisi minimal 8.0.2.2.25.

  • Hanya hasil query tabel tunggal yang dapat diekspor secara paralel. Query multi-tabel serta operasi kompleks seperti Join, Order By, dan Group By tidak mendukung ekspor paralel.

  • Disarankan untuk menjalankan tugas ekspor pada node baca-saja. Anda dapat menambahkan hint /*FORCE_SLAVE*/ ke pernyataan SQL atau langsung terhubung ke node baca-saja untuk mengekspor data.

Parameter

Parameter

Tingkat

Deskripsi

loose_oss_outfile_buffer_size

Global

Jumlah memori yang dapat digunakan oleh satu thread oss outfile. Dalam banyak kasus, kecepatan ekspor meningkat jika sebuah thread dapat menggunakan lebih banyak memori.

Nilai valid: 102400 hingga 536870912. Nilai default: 134217728. Unit: byte.

Penggunaan

Sintaksis

SELECT * FROM table_name INTO OSSOUTFILE 'outfile_path' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
Catatan
  • COLUMNS TERMINATED BY: Pemisah antar bidang.

  • OPTIONALLY ENCLOSED BY: Pengenal di kedua ujung bidang. Jika OPTIONALLY ditambahkan, pengenal hanya diterapkan pada bidang bertipe string. Tanpa OPTIONALLY, pengenal diterapkan ke semua jenis bidang.

  • NULL_MARKER BY: Menentukan representasi nilai NULL dalam file teks yang diekspor. Nilai NULL dapat direpresentasikan menggunakan metode berikut (berdasarkan prioritas tertinggi ke terendah):

    • NULL_MARKER: Mendefinisikan representasi keluaran nilai NULL dalam file teks yang diekspor. NULL_MARKER memungkinkan penggunaan string arbitrer sebagai representasi nilai NULL. Metode ini memiliki prioritas tertinggi.

    • ESCAPED BY: Menentukan karakter escape tunggal yang mengawali karakter N untuk merepresentasikan nilai NULL. Contohnya, jika Anda menentukan ESCAPED BY '\', nilai NULL direpresentasikan sebagai \N dalam file data yang diekspor.

    • NULL (default): Jika tidak menggunakan metode lain, nilai NULL direpresentasikan dengan string "NULL". Metode ini memiliki prioritas terendah. NULL tidak memiliki pengenal ENCLOSED di kedua ujungnya.

  • LINES TERMINATED BY: Pemisah antar baris.

Untuk informasi lebih lanjut, lihat Dokumentasi MySQL.

Parameters

Parameter

Deskripsi

outfile_path

Path di Bucket OSS yang menyimpan file data yang diekspor. Ini mencakup bagian-bagian berikut:

  • Informasi server OSS, yang mencakup nama Bucket OSS saat ini dan path dasar. Untuk informasi lebih lanjut, lihat Gunakan tabel asing OSS untuk mengakses data OSS.

  • (Opsional) Path tugas ekspor saat ini.

  • Nama file yang akan dibuat di Bucket OSS.

Bagian-bagian dipisahkan dengan garis miring (/). Jika path tugas ekspor saat ini berisi beberapa garis miring (/), path multi-level digunakan. Setelah file diunggah ke OSS, path lengkapnya adalah: path server OSS + path tugas saat ini. Nama file data yang diekspor harus disertakan dalam outfile_path.

table_name

Nama tabel database dari mana Anda ingin mengekspor data ke OSS.

Contoh

Anda dapat menambahkan hint sebelum pernyataan SQL untuk mengekspor data secara paralel. Atau, Anda dapat langsung mengeksekusi pernyataan SQL setelah fitur query paralel elastis diaktifkan. Untuk detail tentang cara mengaktifkan fitur ini, lihat Ikhtisar.

Contoh berikut menunjukkan cara mengekspor tabel lokal ke OSS dengan menambahkan hint ke pernyataan SELECT * FROM lineitem;:

  1. Eksekusi pernyataan berikut untuk memeriksa apakah pernyataan SQL saat ini dapat dieksekusi secara paralel:

    EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem;

    Hasil sampel:

    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+
    | 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) |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+
    2 rows in set, 1 warning (0.05 sec)
    

    Jika kolom Extra berisi nilai "Parallel scan", pernyataan SQL dapat dieksekusi secara paralel.

  2. Buat server OSS tempat data akan diekspor. Dalam contoh ini, server bernama outserver dibuat.

    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": "*******", "oss_access_key_secret": "********", "oss_prefix":"B_outfile"}');
  3. Eksekusi pernyataan berikut untuk melihat rencana eksekusi pernyataan SQL yang hasilnya diekspor secara paralel ke OSS, guna menentukan apakah tabel lokal dapat diekspor ke OSS secara paralel:

    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';

    Dalam contoh ini, rencana eksekusi berikut dikembalikan:

    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+
    | 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 |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+
    2 rows in set, 1 warning (0.03 sec)
    • Jika kolom Extra dari rencana eksekusi berisi nilai "Parallel export OSS outfile", tabel lokal dapat diekspor ke OSS secara paralel.

    • Jika ekspor paralel tidak didukung dalam rencana eksekusi, Anda dapat menggunakan salah satu metode berikut untuk mengidentifikasi penyebabnya:

      1. Atur parameter OPTIMIZER_TRACE ke ON.

        SET optimizer_trace="enabled=on";
      2. Eksekusi pernyataan berikut untuk melihat rencana eksekusi pernyataan SQL yang hasilnya diekspor secara paralel:

        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';

        Hasil sampel:

        +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+
        | id | select_type | table     | partitions | type  | possible_keys        | key     | key_len | ref  | rows | filtered | Extra                                  |
        +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+
        |  1 | SIMPLE      | <gather1> | NULL       | ALL   | NULL                 | NULL    | NULL    | NULL |  105 |   100.00 | NULL                                   |
        |  1 | SIMPLE      | lineitem  | NULL       | range | PRIMARY,i_l_orderkey | PRIMARY | 4       | NULL |   26 |   100.00 | Parallel scan (4 workers); Using where |
        +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+
        2 rows in set, 1 warning (0.00 sec)
      3. Eksekusi pernyataan berikut untuk melihat jejak optimiser dari pernyataan SQL yang diekspor secara paralel:

        SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;

        Hasil sampel:

        ```
         "considered_parallel_outfile": {
                              "choose": false,
                              "storage": "OSS",
                              "format": "CSV",
                              "mean_outfile_record_length": "79 B",
                              "estimate_single_worker_outfile_size": "8 KB",
                              "cause": "Data yang ditulis oleh setiap pekerja harus lebih besar dari 1024 KB (pq_oss_min_worker_write_size)."
                            }
                          }
        ```

        Alasan mengapa ekspor paralel tidak didukung dapat dilihat dalam parameter cause dari hasil eksekusi.

  4. Eksekusi pernyataan berikut untuk mengekspor tabel lokal ke OSS secara paralel:

    SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';

    Selama proses ekspor, Anda dapat mengeksekusi pernyataan berikut untuk melihat jumlah total memori dan thread yang digunakan oleh tugas ekspor secara real-time:

    • Lihat jumlah total memori yang digunakan oleh tugas ekspor secara real-time. Unit: byte.

      SHOW STATUS LIKE "%Oss_outfile_memory_used%";
    • Lihat jumlah total thread yang digunakan oleh tugas ekspor secara real-time.

      SHOW STATUS LIKE "%Oss_outfile_threads_running%";
    Catatan

    Saat terhubung ke endpoint kluster untuk mengeksekusi tugas ekspor, pastikan bahwa perintah SHOW STATUS dan perintah ekspor dieksekusi pada node yang sama untuk mendapatkan informasi sumber daya memori yang digunakan oleh perintah ekspor pada node tersebut.