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';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_MARKERmemungkinkan 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
ENCLOSEDdi 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:
Bagian-bagian dipisahkan dengan garis miring ( |
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;:
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.
Buat server OSS tempat data akan diekspor. Dalam contoh ini, server bernama
outserverdibuat.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"}');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:
Atur parameter
OPTIMIZER_TRACEke ON.SET optimizer_trace="enabled=on";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)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
causedari hasil eksekusi.
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%";
CatatanSaat terhubung ke endpoint kluster untuk mengeksekusi tugas ekspor, pastikan bahwa perintah
SHOW STATUSdan perintah ekspor dieksekusi pada node yang sama untuk mendapatkan informasi sumber daya memori yang digunakan oleh perintah ekspor pada node tersebut.