All Products
Search
Document Center

PolarDB:Mengakses data OSS menggunakan tabel eksternal OSS

Last Updated:Apr 25, 2026

PolarDB dapat langsung mengkueri data berformat CSV di OSS menggunakan tabel eksternal, sehingga mengurangi biaya penyimpanan Anda. Topik ini menjelaskan cara mengakses data di OSS menggunakan tabel eksternal.

Prasyarat

Kluster PolarDB Anda harus memenuhi salah satu persyaratan berikut:

  • Versi engine adalah MySQL 8.0.1 dengan revisi 8.0.1.1.25.4 atau lebih baru.

  • Versi engine adalah MySQL 8.0.2 dengan revisi 8.0.2.2.1 atau lebih baru.

Untuk memeriksa versi engine, lihat Memeriksa versi engine.

Cara kerja

Tabel eksternal OSS memungkinkan Anda menyimpan data berformat CSV yang jarang dikueri (dikenal sebagai cold data) di OSS serta mengkueri dan menganalisisnya.OSS外表

Batasan

  • Tabel eksternal OSS hanya dapat mengkueri data dari file CSV.

  • Tabel eksternal OSS hanya mendukung pernyataan CREATE, SELECT, dan DROP.

    Catatan

    Operasi DROP hanya menghapus metadata tabel di PolarDB, bukan file data di OSS.

  • Tabel eksternal OSS tidak mendukung indeks, partisi, atau transaksi.

  • Tipe data yang didukung untuk data dalam format CSV mencakup tipe numerik, tipe tanggal dan waktu, tipe string, dan nilai NULL.

    Catatan
    • Tipe data geospasial tidak didukung.

    • Anda tidak dapat mengkueri file CSV terkompresi.

    • Nilai NULL hanya didukung jika salah satu kondisi berikut terpenuhi:

      • Versi kernel adalah MySQL 8.0.1 dan revisinya 8.0.1.1.28 atau lebih baru.

      • Versi kernel adalah MySQL 8.0.2 dan revisinya 8.0.2.2.5 atau lebih baru.

    Tipe numerik

    Type

    Size

    Signed range

    Unsigned range

    Description

    TINYINT

    1 byte

    -128 hingga 127

    0 hingga 255

    Bilangan bulat sangat kecil.

    SMALLINT

    2 bytes

    -32768 hingga 32767

    0 hingga 65535

    Bilangan bulat kecil.

    MEDIUMINT

    3 bytes

    -8388608 hingga 8388607

    0 hingga 16777215

    Bilangan bulat berukuran sedang.

    INT or INTEGER

    4 bytes

    -2147483648 hingga 2147483647

    0 hingga 4294967295

    Bilangan bulat standar.

    BIGINT

    8 bytes

    -9.223.372.036.854.775.808 hingga 9.223.372.036.854.775.807

    0 hingga 18.446.744.073.709.551.615

    Bilangan bulat besar.

    FLOAT

    4 bytes

    -3,402823466E+38 hingga -1,175494351E-38; 0; 1,175494351E-38 hingga 3,402823466E+38

    0; 1,175494351E-38 hingga 3,402823466E+38

    Bilangan titik mengambang presisi tunggal.

    DOUBLE

    8 bytes

    -1,7976931348623157E+308 hingga -2,2250738585072014E-308; 0; 2,2250738585072014E-308 hingga 1,7976931348623157E+308

    0; 2,2250738585072014E-308 hingga 1,7976931348623157E+308

    Bilangan titik mengambang presisi ganda.

    DECIMAL

    Untuk DECIMAL(M,D), ukurannya adalah M+2 byte jika M > D, atau D+2 byte sebaliknya.

    Tergantung pada nilai M dan D.

    Tergantung pada nilai M dan D.

    Bilangan desimal.

    Tipe tanggal dan waktu

    Type

    Size

    Range

    Format

    Description

    DATE

    3 bytes

    1000-01-01 hingga 9999-12-31

    YYYY-MM-DD

    Nilai tanggal.

    TIME

    3 bytes

    -838:59:59 hingga 838:59:59

    HH:MM:SS

    Nilai waktu atau durasi.

    YEAR

    1 byte

    1901 hingga 2155

    YYYY

    Nilai tahun.

    DATETIME

    8 bytes

    1000-01-01 00:00:00 hingga 9999-12-31 23:59:59

    YYYY-MM-DD HH:MM:SS

    Nilai gabungan tanggal dan waktu.

    Catatan

    Untuk tipe data ini, bulan dan hari harus berupa angka dua digit. Misalnya, gunakan 2020-01-01 alih-alih 2020-1-1. Jika tidak, kueri akan gagal saat diteruskan ke OSS.

    TIMESTAMP

    4 bytes

    1970-01-01 00:00:00 hingga 2038-01-19 03:14:07

    YYYY-MM-DD HH:MM:SS

    Timestamp, yaitu nilai gabungan tanggal dan waktu.

    Catatan

    Untuk tipe data ini, bulan dan hari harus berupa angka dua digit. Misalnya, gunakan 2020-01-01 alih-alih 2020-1-1. Jika tidak, kueri akan gagal saat diteruskan ke OSS.

    Tipe string

    Type

    Size

    Description

    CHAR

    0 hingga 255 bytes

    String dengan panjang tetap.

    VARCHAR

    0 hingga 65.535 bytes

    String dengan panjang variabel.

    TINYBLOB

    0 hingga 255 bytes

    String biner dengan panjang maksimum 255 karakter.

    TINYTEXT

    0 hingga 255 bytes

    String teks pendek.

    BLOB

    0 hingga 65.535 bytes

    Data teks panjang dalam format biner.

    TEXT

    0 hingga 65.535 bytes

    Data teks panjang.

    MEDIUMBLOB

    0 hingga 16.777.215 bytes

    Data teks berukuran sedang dalam format biner.

    MEDIUMTEXT

    0 hingga 16.777.215 bytes

    Data teks berukuran sedang.

    LONGBLOB

    0 hingga 4.294.967.295 bytes

    Data teks sangat besar dalam format biner.

    LONGTEXT

    0 hingga 4.294.967.295 bytes

    Data teks sangat besar.

    Nilai NULL

    Penyisipan

    • Sisipkan nilai NULL ke dalam tabel eksternal OSS.

      Untuk menyisipkan nilai NULL ke dalam tabel eksternal OSS, tentukan penanda nilai NULL yang sesuai, NULL_MARKER, saat membuat tabel. Nilai default NULL_MARKER untuk tabel eksternal OSS adalah NULL. Anda dapat menjalankan pernyataan SHOW CREATE TABLE untuk melihat penanda nilai NULL:

      SHOW CREATE TABLE t1;

      Hasil berikut dikembalikan:

      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | Table | Create Table                                                                                                                                                                      |
      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | t1    | CREATE TABLE `t1` (
        `id` int(11) DEFAULT NULL
      ) ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='server_name' |
      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      1 row in set (0.00 sec)
    • Sisipkan nilai NULL ke dalam file CSV.

      Jika Anda menyisipkan NULL_MARKER ke dalam bidang file CSV, dan NULL_MARKER tidak diapit tanda kutip ganda, PolarDB akan mengenali nilai tersebut sebagai NULL.

      Catatan
      • Jika Anda menambahkan tanda kutip ganda di sekitar NULL_MARKER, PolarDB mengenalinya sebagai string. Akibatnya, Anda tidak dapat menggunakan pernyataan is_null untuk menemukan nilai NULL, dan kesalahan dilaporkan jika parameter yang diberi nilai NULL dalam file CSV tidak sesuai dengan tipe data parameter yang sesuai di tabel eksternal OSS.

      • NULL_MARKER tidak boleh berupa nilai numerik, string kosong, atau mengandung karakter berikut:

        ", \n, \r, dan ,

      Contoh

      Gunakan pernyataan berikut untuk membuat tabel eksternal OSS:

      CREATE TABLE `t1` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `time` timestamp NULL DEFAULT NULL
      ) ENGINE=CSV NULL_MARKER='NULL' CONNECTION='server_name';

      Asumsikan bahwa file data berisi konten berikut:

      1,"xiaohong","2022-01-01 00:00:00"
      NULL,"xiaoming","2022-02-01 00:00:00"
      3,NULL,"2022-03-01 00:00:00"
      4,"xiaowang",NULL

      Mengkueri tabel eksternal OSS mengembalikan data berikut:

      SELECT * FROM t1;
      +------+----------+---------------------+
      | id   | name     | time                |
      +------+----------+---------------------+
      |    1 | xiaohong | 2022-01-01 00:00:00 |
      | NULL | xiaoming | 2022-02-01 00:00:00 |
      |    3 | NULL     | 2022-03-01 00:00:00 |
      |    4 | xiaowang | NULL                |
      +------+----------+---------------------+

    Membaca

    • Saat data dibaca dari file CSV, jika nilai dalam file CSV adalah NULL dan kolom yang sesuai di tabel eksternal OSS dapat bernilai NULL, kolom tersebut diatur ke NULL.

    • Jika nilai NULL dibaca dari file CSV untuk kolom yang didefinisikan sebagai NOT NULL, terjadi konflik. Hasilnya bergantung pada mode SQL.

      • Jika sql_mode diatur ke STRICT_TRANS_TABLES, kesalahan dilaporkan.

      • Jika sql_mode diatur ke mode selain STRICT_TRANS_TABLES, kolom tersebut diatur ke nilai default yang telah ditentukan. Jika tidak ada nilai default yang ditentukan, kolom tersebut diatur ke nilai default MySQL untuk tipe datanya. Untuk informasi lebih lanjut, lihat Data Type Default Values. Peringatan juga dikembalikan. Gunakan perintah SHOW WARNINGS; untuk melihat detail peringatan.

    Catatan

    Gunakan perintah SHOW VARIABLES LIKE "sql_mode"; untuk melihat mode SQL saat ini. Anda juga dapat membuka Konsol PolarDB dan mengubah parameter sql_mode pada halaman Settings and Management > Parameters. Untuk informasi lebih lanjut, lihat Mengubah parameter.

    Contoh

    Buat tabel eksternal OSS bernama t di mana kolom id diatur sebagai NOT NULL dan tidak memiliki nilai default.

    CREATE TABLE `t` (
      `id` int(11) NOT NULL
    ) ENGINE=CSV 
    CONNECTION="server_name";

    Asumsikan bahwa file CSV t.CSV berisi konten berikut:

    NULL
    2

    Dua skenario berikut dapat terjadi saat Anda membaca data dari file CSV menggunakan tabel eksternal OSS:

    • Jika sql_mode diatur ke STRICT_TRANS_TABLES, jalankan perintah berikut untuk mengkueri data dari file CSV:

      SELECT * FROM t;

      Pesan kesalahan berikut dilaporkan:

      ERROR 1364 (HY000): Field 'id' doesn't have a default value
    • Jika sql_mode diatur ke mode selain STRICT_TRANS_TABLES, jalankan perintah berikut untuk mengkueri data dari file CSV:

      SELECT * FROM t;

      Hasil berikut dikembalikan:

      +----+
      | id |
      +----+
      |  0 |
      |  2 |
      +----+
      2 rows in set, 1 warning (0.00 sec)

      Dalam hasil tersebut, 0 adalah nilai default MySQL. Jalankan perintah berikut untuk melihat pesan peringatan:

      SHOW WARNINGS;

      Hasil berikut dikembalikan:

      +---------+------+-----------------------------------------+
      | Level   | Code | Message                                 |
      +---------+------+-----------------------------------------+
      | Warning | 1364 | Field 'id' doesn't have a default value |
      +---------+------+-----------------------------------------+
      1 row in set (0.00 sec)

Parameter

Anda dapat melihat atau mengubah parameter berikut pada halaman Settings and Management > Parameters di Konsol PolarDB:

Parameter

Ruang Lingkup

Deskripsi

loose_csv_oss_buff_size

Session

Menetapkan jumlah memori dalam byte yang dapat digunakan oleh satu thread OSS. Nilai default adalah 134217728.

Nilai valid: 4096 hingga 134217728

loose_csv_max_oss_threads

Global

Menetapkan jumlah maksimum thread OSS konkuren. Nilai default adalah 1.

Nilai valid: 1 hingga 100

Total memori maksimum untuk fitur OSS dihitung sebagai: loose_csv_max_oss_threads * loose_csv_oss_buff_size.

Catatan

Untuk mencegah masalah kehabisan memori, total memori untuk fitur OSS tidak boleh melebihi 5% dari memori node saat ini.

Prosedur

Buat server OSS

Buat server OSS untuk menambahkan informasi koneksi dan terhubung ke OSS.

Catatan

Karena alasan keamanan, membuat server OSS adalah satu-satunya metode yang didukung untuk terhubung ke OSS.

Versi terbaru

Jika kluster database Anda memenuhi salah satu kondisi berikut, gunakan sintaks berikut:

  • Versi kernel adalah MySQL 8.0.1, dan revisinya 8.0.1.1.28 atau lebih baru.

  • Versi kernel adalah MySQL 8.0.2, dan revisinya 8.0.2.2.5 atau lebih baru.

CREATE SERVER <server_name> 
FOREIGN DATA WRAPPER oss OPTIONS 
(
  [DATABASE '<my_database_name>',]
  EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id": "<my_oss_access_key_id>","oss_access_key_secret": "<my_oss_access_key_secret>","oss_prefix":"<my_oss_prefix>","oss_sts_token":"<my_oss_sts_token>"}'
);
Catatan
  • Parameter opsional DATABASE setara dengan oss_prefix. Kami menyarankan menggunakan oss_prefix.

  • Untuk menggunakan parameter oss_sts_token, salah satu kondisi berikut harus terpenuhi:

    • Versi kernel adalah MySQL 8.0.1, dan revisinya 8.0.1.1.29 atau lebih baru.

    • Versi kernel adalah MySQL 8.0.2, dan revisinya 8.0.2.2.6 atau lebih baru.

Tabel berikut menjelaskan parameter-parameter tersebut.

Parameter

Tipe

Wajib

Deskripsi

server_name

String

Ya

Nama server OSS.

Catatan

Parameter ini bersifat global dan harus unik. Nama tidak membedakan huruf besar/kecil dan memiliki panjang maksimum 64 karakter. Nama yang lebih panjang dari 64 karakter akan dipotong secara otomatis. Anda dapat menentukan nama server OSS sebagai string yang diapit tanda kutip.

my_database_name

String

Tidak

Direktori di OSS yang berisi file data CSV.

Catatan

Jika kedua parameter DATABASE dan my_oss_prefix ditentukan, PolarDB mencari file di path my_oss_prefix/DATABASE. Untuk informasi lebih lanjut tentang cara menambahkan parameter DATABASE, lihat konten di bawah.

my_oss_endpoint

String

Ya

Titik akhir untuk wilayah OSS yang sesuai.

Catatan

Jika Anda mengakses database dari host Alibaba Cloud, gunakan Titik akhir internal yang namanya mengandung "internal" untuk menghindari lalu lintas jaringan publik.

Contohnya, Titik akhir internal untuk wilayah Tiongkok (Hangzhou) adalah oss-cn-hangzhou-internal.aliyuncs.com.

my_oss_bucket

String

Ya

Bucket OSS tempat file data disimpan. Anda harus membuat bucket ini di OSS terlebih dahulu.

Catatan

Untuk performa terbaik, letakkan bucket OSS dan kluster database PolarDB di zona ketersediaan yang sama untuk mengurangi latensi jaringan.

my_oss_access_key_id

String

Ya

ID AccessKey Pengguna RAM atau Akun Alibaba Cloud.

my_oss_access_key_secret

String

Ya

AccessKey Secret Pengguna RAM atau Akun Alibaba Cloud.

my_oss_prefix

String

Tidak

Direktori di OSS yang berisi file data CSV.

my_oss_sts_token

String

Tidak

Kredensial akses sementara STS.

Catatan
  • Parameter ini wajib saat Anda menggunakan kredensial akses sementara STS untuk mengakses OSS.

  • Parameter my_oss_sts_token memiliki waktu kedaluwarsa default. Jika my_oss_sts_token telah kedaluwarsa, Anda harus menjalankan perintah berikut untuk mengatur ulang semua nilai parameter di EXTRA_SERVER_INFO.

    ALTER SERVER server_name OPTIONS(EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>",
    "oss_bucket": "<my_oss_bucket>", "oss_access_key_id": "<my_oss_access_key_id>",
    "oss_access_key_secret": "<my_oss_access_key_secret>", "oss_prefix":"<my_oss_prefix>", "oss_sts_token": "<my_oss_sts_token>"}');

Versi lama

Jika kluster database Anda memenuhi salah satu kondisi berikut, gunakan sintaks berikut:

  • Versi kernel adalah MySQL 8.0.1, dan revisinya dari 8.0.1.1.25.4 hingga 8.0.1.1.27.

  • Versi kernel adalah MySQL 8.0.2, dan revisinya dari 8.0.2.2.1 hingga 8.0.2.2.4.

CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
  [DATABASE '<my_database_name>',]
  EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id":"<my_oss_access_key_id>","oss_access_key_secret":"<my_oss_access_key_secret>"}'
);                  
Catatan

Pada versi ini, sintaks tidak mendukung parameter oss_prefix dan oss_sts_token.

Tabel berikut menjelaskan parameter-parameter tersebut.

Parameter

Jenis

Wajib

Deskripsi

server_name

String

Ya

Nama server OSS.

Catatan

Parameter ini bersifat global dan harus unik. Nama tidak membedakan huruf besar/kecil dan memiliki panjang maksimum 64 karakter. Nama yang lebih panjang dari 64 karakter akan dipotong secara otomatis. Anda dapat menentukan nama server OSS sebagai string yang diapit tanda kutip.

my_database_name

String

Tidak

Nama direktori di OSS yang berisi file data CSV.

my_oss_endpoint

String

Ya

Titik akhir untuk wilayah OSS yang sesuai.

Catatan

Jika Anda mengakses database dari host Alibaba Cloud, gunakan Titik akhir internal yang namanya mengandung "internal" untuk menghindari lalu lintas jaringan publik.

Contoh: oss-cn-hangzhou-internal.aliyuncs.com

my_oss_bucket

String

Ya

Bucket OSS tempat file data disimpan. Anda harus membuat bucket di OSS terlebih dahulu.

my_oss_access_key_id

String

Ya

ID AccessKey Pengguna RAM atau Akun Alibaba Cloud.

my_oss_access_key_secret

String

Ya

AccessKey Secret Pengguna RAM atau Akun Alibaba Cloud.

Catatan

Membuat server OSS memerlukan izin SERVERS_ADMIN. Anda dapat menjalankan perintah SHOW GRANTS FOR <username>; untuk memeriksa apakah pengguna saat ini memiliki izin SERVERS_ADMIN. Saat ini, akun dengan hak istimewa tinggi memiliki izin ini secara default dan dapat memberikannya kepada akun dengan hak istimewa rendah.

  • Jika Anda tidak memiliki hak istimewa SERVERS_ADMIN, kesalahan berikut akan dikembalikan: Access denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operation.

  • Jika Anda menggunakan akun standar yang tidak memiliki hak istimewa SERVERS_ADMIN, akun dengan hak istimewa tinggi dapat memberikan hak istimewa tersebut dengan menjalankan: GRANT SERVERS_ADMIN ON *.* TO `users`@`%` WITH GRANT OPTION.

  • Jika Anda memiliki akun dengan hak istimewa tinggi tetapi tidak memiliki izin SERVERS_ADMIN, buka halaman Settings and Management > Accounts di Konsol PolarDB dan atur ulang izinnya. Tunggu beberapa saat lalu periksa kembali akun dengan hak istimewa tinggi tersebut. Akun tersebut kemudian akan diberikan izin SERVERS_ADMIN. Jika akun dengan hak istimewa tinggi masih belum memiliki izin SERVERS_ADMIN setelah mencoba langkah-langkah ini, silakan kirim tiket untuk menghubungi kami, atau hubungi kami dengan mencari nomor grup kami di DingTalk.

  • Akun dengan hak istimewa tinggi dapat melihat informasi server OSS dengan menjalankan SELECT Server_name, Extra_server_info FROM mysql.servers;. Untuk keamanan, nilai parameter oss_access_key_id dan oss_access_key_secret dienkripsi dan tidak dapat dilihat.

Unggah data

Anda dapat menggunakan tool baris perintah ossutil untuk mengunggah file CSV lokal ke Object Storage Service (OSS).

Catatan
  • Direktori OSS tempat Anda mengunggah file CSV harus sesuai dengan direktori yang ditentukan dalam parameter DATABASE atau oss_prefix server OSS.

  • Nama file CSV yang diunggah harus dalam format <foreign_table_name>.CSV, dengan ekstensi .CSV dalam huruf kapital. Misalnya, jika tabel eksternal OSS bernama t1, file CSV harus diberi nama t1.CSV.

  • Bidang data dalam file CSV harus sesuai dengan kolom tabel eksternal OSS. Misalnya, jika tabel eksternal OSS t1 memiliki satu kolom id bertipe INT, file CSV yang diunggah juga harus hanya berisi satu bidang INT.

  • Kami menyarankan agar Anda langsung mengunggah file data dari database MySQL lokal Anda dan membuat tabel eksternal OSS yang sesuai berdasarkan definisi tabel tersebut.

Buat tabel eksternal OSS

Setelah Anda menentukan server OSS, buat tabel eksternal OSS di PolarDB untuk memetakan ke file CSV di OSS. Contoh:

CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";

connection_string terdiri dari bagian-bagian berikut, yang digabungkan dengan garis miring (/):

  • Nama server OSS.

  • (Opsional) Path ke file data di OSS.

    Catatan

    Path file data hanya didukung jika salah satu kondisi berikut terpenuhi.

    • Versi kernel adalah MySQL 8.0.1, dan revisinya 8.0.1.1.28 atau lebih baru.

    • Versi kernel adalah MySQL 8.0.2, dan revisinya 8.0.2.2.5 atau lebih baru.

  • (Opsional) Nama file data.

    Catatan
    • Jangan sertakan akhiran .CSV dalam nama file data.

    • Jika Anda tidak menentukan nama file data, file OSS yang sesuai dengan tabel saat ini adalah <current_table_name>.CSV. Jika Anda menentukan nama file data, file OSS yang sesuai adalah <specified_data_file_name>.CSV.

    • Jika Anda menentukan path ke file data di OSS, Anda juga harus menentukan nama file data. Jika tidak, sistem akan menganggap segmen terakhir dari path sebagai nama file.

Lihat tabel eksternal OSS

Setelah tabel eksternal OSS dibuat, Anda dapat melihat definisinya dengan menjalankan SHOW CREATE TABLE <table_name>;. Periksa apakah engine tabelnya adalah CSV (yaitu, ENGINE=CSV). Jika tidak, versi kluster database PolarDB Anda mungkin terlalu lama untuk mendukung engine OSS. Untuk informasi lebih lanjut, lihat Prasyarat.

Contoh

CREATE TABLE t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";

Contoh ini menunjukkan komposisi connection_string:

  • Nama server OSS: server_name.

  • Path ke file data di OSS: oss_prefix/a/b/c/d/.

  • File data: t1. File aktualnya adalah t1.CSV, tetapi akhiran .CSV dihilangkan sesuai persyaratan.

Catatan

Anda hanya dapat menentukan file data untuk tabel eksternal OSS berdasarkan nama. Misalnya, dalam pernyataan berikut, PolarDB mencari file t2.CSV di path oss_prefix di OSS.

CREATE TABLE t1 (id int) engine=csv connection="server_name/t2";

Kueri data

Contoh berikut mengkueri tabel t1 yang dibuat pada langkah sebelumnya.

-- Menghitung jumlah baris dalam tabel t1.
SELECT count(*) FROM t1;

-- Kueri rentang.
SELECT id FROM t1 WHERE id < 10 AND id > 1;

-- Kueri titik.
SELECT id FROM t1 where id = 3;

-- Penggabungan tabel.
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";

Tabel berikut menjelaskan kesalahan umum yang mungkin terjadi selama kueri data dan solusinya.

Catatan

Jika kueri mengembalikan peringatan alih-alih kesalahan, jalankan SHOW WARNINGS; untuk melihat detail peringatan.

Pesan kesalahan

Penyebab

Solusi

OSS error: No corresponding data file on the OSS engine.

File data yang sesuai tidak ditemukan di OSS.

Periksa apakah file data ada di path yang diharapkan di OSS.

  • Jika file ada, pastikan nama filenya mengikuti format <foreign_table_name>.CSV dan ekstensi .CSV dalam huruf kapital.

  • Jika file tidak ada, unggah ke path target.

There is not enough memory space for OSS transmission. Currently requested memory %d.

Memori tidak mencukupi untuk kueri OSS.

Untuk mengatasi kesalahan ini:

  • Buka halaman Parameter di konsol dan tingkatkan nilai parameter loose_csv_max_oss_threads untuk mengizinkan lebih banyak thread OSS.

  • Jalankan FLUSH TABLE untuk melepaskan thread yang dipegang oleh tabel OSS lainnya.

ERROR 8054 (HY000): OSS error: error message : Couldn't connect to server.Failed connect to aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80;

Kluster database tidak dapat terhubung ke server OSS.

Periksa apakah instansiasi basis data dan bucket OSS berada di zona ketersediaan yang sama.

  • Jika tidak, letakkan instansiasi basis data dan bucket OSS di zona ketersediaan yang sama.

  • Jika sudah berada di zona ketersediaan yang sama, beralihlah ke Titik akhir publik. Jika kesalahan tetap terjadi, hubungi Dukungan Alibaba Cloud.

Pengoptimalan kueri

Engine OSS meningkatkan performa kueri dengan meneruskan kondisi yang memenuhi syarat ke engine OSS remote. Pengoptimalan ini disebut engine condition pushdown. Batasan berikut berlaku untuk penurunan kondisi:

  • Hanya file teks CSV berkode UTF-8 yang didukung.

  • Dalam pernyataan SQL, hanya jenis operator dan ekspresi aritmetika berikut yang didukung:

    • Operator perbandingan: >, <, >=, <=, ==

    • Operator logika: LIKE, IN, AND, OR

    • Ekspresi aritmetika: + , - , * , /

  • Hanya kueri file tunggal yang didukung. Kueri yang menggunakan klausa JOIN, ORDER BY, GROUP BY, atau HAVING tidak didukung.

  • Klausa WHERE tidak boleh berisi operasi agregasi. Misalnya, where max(age) > 100 tidak diizinkan.

  • Jumlah maksimum kolom adalah 1.000, dan panjang maksimum nama kolom dalam pernyataan SQL adalah 1.024 byte.

  • Dalam klausa LIKE, hingga lima karakter wildcard % didukung.

  • Dalam klausa IN, hingga 1.024 konstanta didukung.

  • Untuk file CSV, ukuran maksimum adalah 256 KB per baris dan 256 KB per kolom.

  • Panjang maksimum pernyataan SQL adalah 16 KB. Klausa WHERE dapat berisi hingga 20 ekspresi, dan kueri dapat berisi hingga 100 operasi agregasi.

Catatan

Fitur ini dinonaktifkan secara default. Untuk mengaktifkannya, jalankan perintah SET SESSION optimizer_switch='engine_condition_pushdown=on';.

Kueri yang memenuhi kondisi ini akan diteruskan ke engine OSS. Periksa rencana eksekusi tabel eksternal OSS untuk melihat kondisi mana yang diteruskan.

  • Gunakan EXPLAIN untuk melihat rencana eksekusi tabel eksternal OSS. Contoh:

    EXPLAIN SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra                                                                                                                            |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 15000 |     1.23 | Using where; With pushed engine condition ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Using temporary; Using filesort |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    Kondisi setelah With pushed engine condition diteruskan ke engine OSS remote. Kondisi yang tersisa, `name` LIKE "%1%%%%%" dan GROUP BY `id` ORDER BY `id` DESC, tidak diteruskan dan hanya dieksekusi di server OSS lokal.

  • Gunakan format tree untuk melihat rencana eksekusi tabel eksternal OSS. Contoh:

    EXPLAIN FORMAT=tree  SELECT SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                                                                           |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | -> Sort: <temporary>.id DESC
        -> Table scan on <temporary>
            -> Aggregate using temporary table
                -> Filter: (t1.`name` like '%1%%%%%')  (cost=1690.00 rows=185)
                    -> Table scan on t1, extra ( engine conditions: ((t1.id > 5) and (t1.id < 100)) )  (cost=1690.00 rows=15000)
     |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    Kondisi setelah engine conditions: diteruskan ke engine OSS remote. Kondisi yang tersisa, `name` LIKE "%1%%%%%" dan GROUP BY `id` ORDER BY `id` DESC, tidak diteruskan dan hanya dieksekusi di server OSS lokal.

    Catatan

    Kluster Anda harus menjalankan PolarDB for MySQL 8.0.2 atau lebih baru. Anda dapat mengonfirmasi versi kluster dengan mengikuti petunjuk di Memeriksa nomor versi.

  • Gunakan format JSON untuk melihat rencana eksekusi tabel eksternal OSS. Contoh:

    EXPLAIN FORMAT=json  SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | {
      "query_block": {
        "select_id": 1,
        "cost_info": {
          "query_cost": "1875.13"
        },
        "ordering_operation": {
          "using_filesort": false,
          "grouping_operation": {
            "using_temporary_table": true,
            "using_filesort": true,
            "cost_info": {
              "sort_cost": "185.13"
            },
            "table": {
              "table_name": "t1",
              "access_type": "ALL",
              "rows_examined_per_scan": 15000,
              "rows_produced_per_join": 185,
              "filtered": "1.23",
              "engine_condition": "((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100))",
              "cost_info": {
                "read_cost": "1671.49",
                "eval_cost": "18.51",
                "prefix_cost": "1690.00",
                "data_read_per_join": "146K"
              },
              "used_columns": [
                "id",
                "name"
              ],
              "attached_condition": "(`test`.`t1`.`name` like '%1%%%%%')"
            }
          }
        }
      }
    } |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    Seperti sebelumnya, kondisi dalam field engine_condition diteruskan ke engine OSS remote. Kondisi yang tersisa, `name` LIKE "%1%%%%%" dan GROUP BY `id` ORDER BY `id` DESC, tidak diteruskan dan hanya dieksekusi di server OSS lokal.

Jika Anda menerima kesalahan berikut, artinya beberapa karakter dalam file data OSS tidak kompatibel dengan penurunan kondisi engine.

OSS error: The current query does not support engine condition pushdown. You need to use NO_ECP() hint or set optimizer_switch = 'engine_condition_pushdown=OFF' to turn off the condition push down function.

Anda dapat menonaktifkan penurunan kondisi engine secara manual dengan menggunakan hint atau optimizer_switch.

  • Hints

    Gunakan hint untuk menonaktifkan penurunan kondisi engine untuk kueri tertentu. Misalnya, untuk menonaktifkan penurunan kondisi engine untuk tabel t1:

    SELECT /*+ NO_ECP(t1) */ `j` FROM `t1` WHERE `j` LIKE "%c%" LIMIT 10;
  • optimizer_switch

    Gunakan optimizer_switch untuk menonaktifkan penurunan kondisi engine untuk semua kueri dalam sesi saat ini.

    SET SESSION optimizer_switch='engine_condition_pushdown=off'; # Nonaktifkan penurunan kondisi engine untuk sesi saat ini.

    Untuk memeriksa status penurunan kondisi engine untuk sesi saat ini, jalankan perintah berikut:

    select @@optimizer_switch;

Menyinkronkan informasi server OSS

Node primary dan node read-only dalam kluster PolarDB berbagi satu server OSS, memungkinkan akses data dari semua node. Sinkronisasi tanpa penguncian ini memastikan bahwa operasi pada setiap node tetap independen.

Saat Anda mengubah informasi server OSS, perubahan tersebut disinkronkan ke node read-only tanpa penguncian. Jika thread pada node read-only memegang kunci pada server OSS, sinkronisasi ini mungkin tertunda. Dalam kasus ini, jalankan /*force_node='pi-bpxxxxxxxx'*/ flush privileges; atau /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; untuk memperbarui secara manual informasi server OSS pada node read-only.