全部产品
Search
文档中心

PolarDB:Gunakan tabel asing OSS untuk mengakses data OSS

更新时间:Jul 06, 2025

PolarDB memungkinkan Anda menggunakan tabel asing Object Storage Service (OSS) untuk menanyakan data berformat CSV yang disimpan di OSS, secara efektif mengurangi biaya penyimpanan. Topik ini menjelaskan cara menggunakan tabel asing OSS untuk mengakses data OSS.

Prasyarat

Kluster PolarDB Anda harus memenuhi salah satu persyaratan berikut:

  • Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.25.4 atau lebih baru.

  • Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.1 atau lebih baru.

Untuk informasi lebih lanjut tentang cara memeriksa versi kluster, lihat Kueri versi mesin.

Cara kerjanya

Anda dapat menggunakan tabel asing OSS untuk menyimpan data dingin berformat CSV di bucket OSS untuk kueri dan analisis. Data dingin adalah data yang jarang diakses. Gambar berikut menunjukkan prosesnya.OSS外表

Batasan

  • Anda hanya dapat menggunakan tabel asing OSS untuk menanyakan data berformat CSV.

  • Anda hanya dapat melakukan operasi berikut pada tabel asing OSS: CREATE, SELECT, dan DROP.

    Catatan

    Operasi DROP hanya menghapus informasi tabel di PolarDB, tanpa memengaruhi file data yang disimpan di OSS.

  • Tabel asing OSS tidak mendukung pengindeksan, partisi, atau transaksi.

  • Data berformat CSV dapat berisi nilai numerik, tanggal dan waktu, string, serta nilai NULL. Tabel-tabel berikut menggambarkan tipe data yang didukung.

    Catatan
    • Tipe data geospasial tidak didukung.

    • Anda tidak dapat menanyakan file terkompresi dalam format CSV.

    • Nilai NULL didukung untuk kluster yang memenuhi salah satu persyaratan berikut:

      • Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.28 atau lebih baru.

      • Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.5 atau lebih baru.

    Tipe numerik

    Tipe data

    Ukuran

    Rentang data (bertanda)

    Rentang data (tidak bertanda)

    Deskripsi

    TINYINT

    1 Byte

    -128~127

    0~255

    Nilai integer kecil

    SMALLINT

    2 Bytes

    -32768 hingga 32767

    0~65535

    Nilai integer

    MEDIUMINT

    3 Bytes

    -8388608 hingga 8388607

    0 hingga 16.777.215

    Nilai integer

    INT atau INTEGER

    4 Bytes

    -2147483648 hingga 2147483647

    0~4294967295

    Nilai integer

    BIGINT

    8 Bytes

    -9.223.372.036.854.775.808~9.223.372.036.854.775.807

    0~18446744073709551615

    Nilai integer besar

    FLOAT

    4 Bytes

    -3.402823466 E+38~-1.175494351E-38; 0; 1.175494351E-38~3.402823466351E+38

    0; 1.175494351E-38~3.402823466E+38

    Nilai floating-point presisi tunggal

    DOUBLE

    8 Bytes

    -2.2250738585072014E-308~-1.7976931348623157E+308; 0; 1.7976931348623157E+308~2.2250738585072014E-308

    0; 1.7976931348623157E+308~2.2250738585072014E-308

    Nilai floating-point presisi ganda

    DECIMAL

    Untuk DECIMAL(M,D), ukurannya adalah M+2 jika M>D. Jika tidak, ukurannya adalah D+2.

    Tergantung pada nilai M dan D.

    Tergantung pada nilai M dan D.

    Nilai desimal

    Tipe data tanggal dan waktu

    Tipe data

    Ukuran

    Rentang data

    Format

    Deskripsi

    DATE

    3 Bytes

    1000-01-01~9999-12-31

    YYYY-MM-DD

    Nilai tanggal

    TIME

    3 Bytes

    -838:59:59~838:59:59

    HH:MM:SS

    Nilai waktu atau durasi

    YEAR

    1 Byte

    1901~2155

    YYYY

    Nilai tahun

    DATETIME

    8 Bytes

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

    YYYY-MM-DD HH:MM:SS

    Nilai gabungan tanggal dan waktu

    Catatan

    Bulan dan tanggal dari tipe ini harus memiliki dua digit. Misalnya, 1 Januari 2020 harus ditulis sebagai 2020-01-01, bukan 2020-1-1. Kueri tidak dapat dieksekusi sesuai harapan jika 2020-1-1 didorong ke OSS.

    TIMESTAMP

    4 Bytes

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

    YYYY-MM-DD HH:MM:SS

    Nilai timestamp (gabungan tanggal dan waktu)

    Catatan

    Bulan dan tanggal dari tipe ini harus memiliki dua digit. Misalnya, 1 Januari 2020 harus ditulis sebagai 2020-01-01, bukan 2020-1-1. Kueri tidak dapat dieksekusi sesuai harapan jika 2020-1-1 didorong ke OSS.

    Tipe string

    Tipe data

    Ukuran

    Deskripsi

    CHAR

    0~255 Bytes

    String dengan panjang tetap

    VARCHAR

    0~65.535 Bytes

    String dengan panjang variabel

    TINYBLOB

    0~255 Bytes

    Objek besar biner kecil hingga 255 karakter

    TINYTEXT

    0~255 Bytes

    String pendek

    BLOB

    0 hingga 65535 Byte

    Objek besar biner standar

    TEXT

    0-65535 Byte

    String standar

    MEDIUMBLOB

    0~16.777.215 Bytes

    Objek besar biner sedang

    MEDIUMTEXT

    0~16.777.215 Bytes

    String sedang

    LONGBLOB

    0~4.294.967.295 Bytes

    Objek besar biner panjang

    LONGTEXT

    0~4.294.967.295 Bytes

    String panjang

    Nilai NULL

    Sisipkan nilai NULL

    • Sisipkan nilai NULL ke dalam tabel asing OSS.

      Untuk menyisipkan nilai NULL ke dalam tabel asing OSS, Anda harus menetapkan NULL_MARKER saat membuat tabel. Nilai default dari NULL_MARKER adalah NULL untuk tabel asing OSS. Anda dapat mengeksekusi pernyataan SHOW CREATE TABLE untuk memeriksa nilai NULL_MARKER.

      SHOW CREATE TABLE t1;

      Hasil sampel:

      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | 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 nilai NULL_MARKER untuk bidang dalam file CSV tanpa mengapit nilai tersebut dalam tanda kutip ganda ("), PolarDB mengidentifikasi nilai tersebut sebagai NULL.

      Catatan
      • Jika Anda mengapit nilai NULL_MARKER dalam tanda kutip ganda ("), PolarDB mengidentifikasi nilai tersebut sebagai string. Ini berarti bahwa pernyataan is_null tidak dapat mengidentifikasi nilai tersebut sebagai NULL. Jika tipe data bidang tempat nilai NULL ditetapkan dalam file CSV tidak sesuai dengan bidang yang sesuai dalam tabel asing OSS, kesalahan akan dilaporkan.

      • Nilai NULL_MARKER tidak boleh hanya berisi angka atau dibiarkan kosong. Selain itu, tidak boleh mengandung empat karakter berikut:

        ", \n, \r, atau ,

      Contoh

      Eksekusi pernyataan berikut untuk membuat tabel asing 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';

      Dalam contoh ini, file data berisi data 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

      Data OSS berikut diperoleh jika Anda menanyakan tabel asing OSS:

      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                |
      +------+----------+---------------------+

    Baca nilai NULL

    • Saat data dibaca dari file CSV, jika nilai bidang dalam file CSV adalah NULL dan nilai yang sesuai dalam tabel asing OSS dapat diatur ke NULL, bidang tersebut langsung diatur ke NULL.

    • Saat data dibaca dari file CSV, jika nilai bidang dalam file CSV adalah NULL tetapi nilai yang sesuai dalam tabel asing OSS diatur ke NOT NULL, data dalam file CSV bertentangan dengan data yang ditentukan dalam tabel asing OSS. Dalam hal ini, hasil yang berbeda akan dikembalikan tergantung pada aturan verifikasi sintaksis yang ditentukan.

      • Jika Anda menetapkan sql_mode ke STRICT_TRANS_TABLES, kesalahan akan dilaporkan.

      • Jika Anda menetapkan sql_mode ke nilai selain STRICT_TRANS_TABLES dan bidang saat ini memiliki nilai default, nilai bidang saat ini diatur ke nilai default. Jika bidang saat ini tidak memiliki nilai default, bidang tersebut diberi nilai default MySQL berdasarkan tipe bidang. Untuk informasi lebih lanjut, lihat Nilai Default Tipe Data. Jika pesan peringatan muncul, Anda dapat mengeksekusi pernyataan SHOW WARNINGS; untuk melihat detail pesan peringatan.

    Catatan

    Anda dapat mengeksekusi pernyataan SHOW VARIABLES LIKE "sql_mode"; untuk melihat aturan verifikasi sintaksis saat ini. Anda dapat masuk ke Konsol PolarDB dan pergi ke Settings and Management > Parameters untuk memodifikasi nilai sql_mode guna mengubah aturan verifikasi sintaksis. Untuk informasi lebih lanjut, lihat Modifikasi parameter.

    Contoh

    Buat tabel asing OSS bernama t, lalu tetapkan bidang id ke NOT NULL dan tanpa nilai default.

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

    Dalam contoh ini, file t.csv berisi data berikut:

    NULL
    2

    Saat Anda menggunakan tabel asing OSS untuk membaca data dari file CSV, salah satu skenario berikut terjadi:

    • Jika sql_mode diatur ke STRICT_TRANS_TABLES dan ketika Anda mengeksekusi pernyataan berikut untuk menanyakan data dalam 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 nilai selain STRICT_TRANS_TABLES dan ketika Anda mengeksekusi pernyataan berikut untuk menanyakan data dalam file CSV:

      SELECT * FROM t;

      Hasil sampel:

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

      0 adalah nilai default MySQL. Eksekusi pernyataan berikut untuk melihat detail pesan peringatan:

      SHOW WARNINGS;

      Hasil sampel:

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

Parameter

Masuk ke Konsol PolarDB. Temukan kluster di halaman Kluster dan buka halaman Settings and Management > Parameters untuk memodifikasi parameter.

Parameter

Tingkat

Deskripsi

loose_csv_oss_buff_size

Sesi

Ukuran memori yang digunakan oleh thread OSS. Nilai default: 134217728. Unit: byte.

Nilai valid: 4096 hingga 134217728.

loose_csv_max_oss_threads

Global

Jumlah thread OSS yang diizinkan untuk berjalan. Nilai default: 1.

Nilai valid: 1 hingga 100.

Memori maksimum untuk OSS adalah loose_csv_max_oss_threads * loose_csv_oss_buff_size.

Catatan

Saat menggunakan OSS, kami sarankan Anda membatasi penggunaan memori total OSS hingga 5% dari kapasitas memori node saat ini. Jika tidak, masalah kehabisan memori mungkin terjadi.

Prosedur

Buat server OSS

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

Catatan

Metode lain untuk terhubung ke OSS telah dinonaktifkan karena risiko keamanan. Anda hanya dapat membuat server OSS untuk menambahkan informasi koneksi OSS dan terhubung ke OSS.

Pernyataan untuk kluster versi lebih baru

Jika kluster Anda memenuhi persyaratan berikut, sintaksis pembuatan dalam bagian ini berlaku:

  • Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.28 atau lebih baru.

  • Kluster MySQL 8.0.2 dengan versi revisi 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 DATABASE bersifat opsional. Parameter ini bekerja sama dengan parameter oss_prefix. Kami sarankan Anda menggunakan oss_prefix.

  • Parameter oss_sts_token didukung untuk kluster yang memenuhi persyaratan berikut:

    • Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.29 atau lebih baru.

    • Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.6 atau lebih baru.

Tabel berikut menjelaskan parameter dalam sintaksis.

Parameter

Tipe data

Diperlukan

Deskripsi

server_name

STRING

Ya

Nama server OSS.

Catatan

Nama harus unik secara global. Nama dapat memiliki panjang hingga 64 karakter dan tidak peka huruf besar-kecil. Nama yang mengandung lebih dari 64 karakter akan dipotong secara otomatis. Anda dapat menentukan nama server OSS sebagai string yang dikutip.

my_database_name

String

Tidak

Direktori OSS untuk file CSV.

Catatan

Jika baik parameter DATABASE maupun my_oss_prefix ada di server OSS yang Anda buat, jalur akhir file adalah my_oss_prefix/DATABASE. Untuk informasi lebih lanjut tentang cara menetapkan parameter DATABASE, lihat bagian berikutnya.

my_oss_endpoint

STRING

Ya

Endpoint server OSS.

Catatan

Jika Anda mengakses database Anda dari server Alibaba Cloud, gunakan endpoint internal untuk mencegah terjadinya lalu lintas Internet. Endpoint internal mengandung kata kunci "internal".

Sebagai contoh, endpoint internal node OSS di wilayah China (Hangzhou) adalah oss-cn-xxx-internal.aliyuncs.com.

my_oss_bucket

STRING

Ya

Bucket tempat file data disimpan. Sebelum mengimpor data, Anda harus membuat bucket OSS.

Catatan

Kami sarankan Anda menerapkan bucket di zona yang sama dengan kluster PolarDB 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

Rahasia AccessKey pengguna RAM atau akun Alibaba Cloud.

my_oss_prefix

String

Tidak

Direktori OSS untuk file CSV.

my_oss_sts_token

String

Tidak

Kredensial akses sementara yang disediakan oleh Security Token Service (STS)

Catatan
  • Parameter ini diperlukan jika Anda menggunakan kredensial akses sementara yang disediakan oleh STS untuk mengakses OSS.

  • Parameter my_oss_sts_token memiliki waktu kedaluwarsa default. Jika nilai my_oss_sts_token kedaluwarsa, Anda harus mengeksekusi pernyataan berikut untuk menyetel ulang semua nilai 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>"}');

Pernyataan untuk kluster versi lebih lama

Jika kluster Anda memenuhi persyaratan berikut, sintaksis pembuatan dalam bagian ini berlaku:

  • Kluster MySQL 8.0.1 dengan versi revisi dari 8.0.1.1.25.4 hingga 8.0.1.1.28.

  • Kluster MySQL 8.0.2 dengan versi revisi dari 8.0.2.2.1 hingga 8.0.2.2.5.

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

Parameter oss_prefix dan oss_sts_token tidak didukung.

Tabel berikut menjelaskan parameter dalam sintaksis.

Parameter

Tipe data

Diperlukan

Komponen

server_name

STRING

Ya

Nama server OSS.

Catatan

Nama harus unik secara global. Nama dapat memiliki panjang hingga 64 karakter dan tidak peka huruf besar-kecil. Nama yang mengandung lebih dari 64 karakter akan dipotong secara otomatis. Anda dapat menentukan nama server OSS sebagai string yang dikutip.

my_database_name

String

Tidak

Nama direktori OSS untuk file CSV.

my_oss_endpoint

STRING

Ya

Endpoint server OSS.

Catatan

Jika Anda mengakses database Anda dari server Alibaba Cloud, gunakan endpoint internal untuk mencegah terjadinya lalu lintas Internet. Endpoint internal mengandung kata kunci "internal".

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

my_oss_bucket

STRING

Ya

Bucket tempat file data disimpan. Sebelum mengimpor data, Anda harus membuat bucket OSS.

my_oss_access_key_id

STRING

Ya

ID AccessKey pengguna RAM atau akun Alibaba Cloud.

my_oss_access_key_secret

STRING

Ya

Rahasia AccessKey pengguna RAM atau akun Alibaba Cloud.

Catatan

Izin SERVERS_ADMIN diperlukan saat Anda membuat server OSS. Anda dapat mengeksekusi pernyataan SHOW GRANTS FOR username; untuk memeriksa apakah pengguna saat ini memiliki izin SERVERS_ADMIN. Akun istimewa memiliki izin SERVERS_ADMIN secara default, dan dapat memberikan izin SERVERS_ADMIN kepada akun standar.

  • Jika Anda tidak memiliki izin SERVERS_ADMIN, pesan kesalahan Access denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operation muncul.

  • Jika Anda menggunakan akun standar yang tidak memiliki izin SERVERS_ADMIN, Anda dapat menggunakan akun istimewa untuk mengeksekusi pernyataan berikut: GRANT SERVERS_ADMIN ON *.* TO `users`@`%` WITH GRANT OPTION.

  • Jika Anda menggunakan akun istimewa yang tidak memiliki izin SERVERS_ADMIN, Anda dapat menyetel ulang izin akun tersebut. Untuk melakukannya, temukan kluster di Konsol PolarDB dan klik ID atau nama kluster untuk masuk ke halaman detail kluster. Di panel navigasi sebelah kiri, pilih Settings and Management > Accounts. Pada tab Akun Pengguna, temukan akun istimewa yang ingin dikelola dan klik **Setel Ulang Izin** di kolom Tindakan. Tunggu hingga izin selesai disetel ulang. Setelah proses ini selesai, akun istimewa akan memiliki izin SERVERS_ADMIN.

  • Jika Anda menggunakan akun istimewa, Anda dapat mengeksekusi pernyataan SELECT Server_name, Extra_server_info FROM mysql.servers; untuk melihat informasi server OSS yang Anda buat. Nilai parameter oss_access_key_id dan oss_access_key_secret dienkripsi demi alasan keamanan.

Unggah data

Anda dapat menggunakan alat ossutil untuk mengunggah file CSV lokal ke bucket OSS jarak jauh.

Catatan
  • Direktori OSS untuk file CSV harus berupa direktori DATABASE atau oss_prefix pada server OSS.

  • Nama file CSV harus berupa Nama tabel asing OSS.CSV dan ekstensi CSV harus dalam huruf besar. Sebagai contoh, jika nama tabel asing OSS adalah t1, nama file CSV harus t1.CSV.

  • Bidang data dalam file CSV harus sesuai dengan bidang tabel asing OSS. Sebagai contoh, jika tabel asing OSS t1 hanya memiliki bidang id bertipe INT, file CSV hanya dapat memiliki satu bidang bertipe INT.

  • Kami sarankan Anda langsung mengunggah file data MySQL lokal dan membuat tabel asing OSS berdasarkan definisi tabel.

Buat tabel asing OSS

Setelah Anda mendefinisikan server OSS, Anda dapat membuat tabel asing OSS di PolarDB untuk terhubung ke OSS. Contoh:

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

Nilai dari connection_string terdiri dari item-item berikut yang dipisahkan oleh garis miring (/):

  • Nama server OSS.

  • Opsional. Jalur file data di OSS.

    Catatan

    Anda dapat mengonfigurasi jalur file data di OSS jika kluster Anda memenuhi persyaratan berikut:

    • Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.28 atau lebih baru.

    • Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.5 atau lebih baru.

  • (Opsional) Nama file data.

    Catatan
    • Nama file data tidak boleh mengandung ekstensi .CSV.

    • Jika Anda tidak menentukan nama file data, file OSS yang sesuai dengan tabel saat ini adalah Nama tabel saat ini.CSV. Jika Anda menentukan nama file data, file OSS yang sesuai dengan tabel saat ini adalah Nama file data yang ditentukan.CSV.

    • Jika Anda mengonfigurasi jalur file data di OSS, Anda harus menentukan nama file. Jika tidak, segmen terakhir dari jalur akan dianggap sebagai nama file saat sistem mencari file data.

Lihat tabel asing OSS

Setelah tabel asing OSS dibuat, Anda dapat mengeksekusi pernyataan show create table untuk melihat tabel asing OSS. Periksa apakah mesin tabel yang dibuat adalah CSV (ENGINE=CSV). Jika tidak, versi kluster PolarDB Anda sudah usang dan tidak mendukung OSS. Untuk informasi lebih lanjut, lihat Prasyarat.

Contoh

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

Dalam kode sampel sebelumnya, connection_string terdiri dari elemen-elemen berikut:

  • Nama server OSS: server_name.

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

  • File data: t1. File data aktual adalah t1.CSV. Akhiran .CSV dihilangkan berdasarkan persyaratan parameter.

Catatan

Anda hanya dapat menggunakan nama file data untuk menentukan file data yang sesuai dengan tabel asing OSS. Sebagai contoh, pernyataan berikut menanyakan file t2.CSV di jalur oss_prefix OSS.

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

Kueri data

Tabel t1 digunakan dalam contoh berikut.

# Kueri jumlah catatan data di tabel t1.
SELECT count(*) FROM t1;

# Kueri catatan dalam rentang tertentu.
SELECT id FROM t1 WHERE id < 10 AND id > 1;

# Kueri catatan tertentu.
SELECT id FROM t1 where id = 3;

# Kueri catatan dengan menggabungkan beberapa tabel.
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";

Tabel berikut menjelaskan pesan kesalahan umum dan penyebabnya saat Anda menanyakan data.

Catatan

Jika tidak ada pesan kesalahan yang dilaporkan tetapi muncul pesan peringatan saat Anda menanyakan data, Anda harus mengeksekusi pernyataan SHOW WARNINGS; untuk melihat pesan tersebut.

Pesan kesalahan

Penyebab

Solusi

Kesalahan OSS: Tidak ada file data yang sesuai di mesin OSS.

File data yang ditentukan tidak ditemukan di OSS.

Periksa apakah file data ada di jalur yang ditentukan di OSS berdasarkan aturan sebelumnya.

  • Jika ya, periksa apakah file data mematuhi aturan penamaan berikut: Nama file data dalam format Nama tabel asing.CSV, dan ekstensi .CSV dalam huruf besar.

  • Jika tidak, Anda harus mengunggah file data ke jalur yang ditentukan.

Tidak cukup ruang memori untuk transmisi OSS. Memori yang diminta saat ini %d.

Memori tidak cukup untuk kueri OSS.

Anda dapat menggunakan salah satu metode berikut untuk memperbaiki kesalahan ini:

  • Di halaman Parameter di konsol, ubah nilai parameter loose_csv_max_oss_threads untuk menjalankan lebih banyak thread OSS.

  • Eksekusi pernyataan flush table untuk menutup thread beberapa tabel OSS.

ERROR 8054 (HY000): Kesalahan OSS: pesan kesalahan : Tidak dapat terhubung ke server. Gagal terhubung ke aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80;

Kluster saat ini tidak dapat terhubung ke server OSS.

Periksa apakah kluster saat ini berada di zona yang sama dengan bucket OSS.

  • Jika tidak, Anda harus memindahkan kluster saat ini dan bucket OSS ke zona yang sama.

  • Jika ya, Anda dapat mengubah endpoint kluster menjadi endpoint publik. Jika kesalahan tetap ada setelah endpoint diubah, hubungi dukungan teknis Alibaba Cloud.

Optimasi kueri

Selama proses kueri, mesin kueri dapat mendorong kueri dengan kondisi tertentu ke bucket OSS jarak jauh untuk meningkatkan efisiensi kueri. Optimasi ini disebut engine condition pushdown. Fitur penurunan kondisi mesin tunduk pada batasan berikut:

  • Hanya file CSV yang dikodekan UTF-8 yang didukung.

  • Hanya jenis operator berikut yang didukung dalam pernyataan SQL:

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

    • Operator logika: LIKE, IN, AND, dan OR

    • Operator aritmatika: +, -, *, dan /

  • Hanya satu file yang dapat ditanyakan saat Anda menggunakan pernyataan SQL. Klausul berikut tidak didukung: JOIN, ORDER BY, GROUP BY, dan HAVING.

  • Klausa WHERE tidak boleh mengandung kondisi agregasi. Sebagai contoh, WHERE max(age) > 100 tidak diizinkan.

  • Maksimal 1.000 kolom dapat ditentukan untuk pernyataan SQL. Nama kolom dalam pernyataan SQL dapat memiliki panjang maksimal 1.024 byte.

  • Maksimal lima karakter wildcard (%) didukung dalam klausa LIKE.

  • Maksimal 1.024 konstanta didukung dalam klausa IN.

  • Ukuran kolom maksimum dan ukuran baris untuk objek CSV adalah 256 KB.

  • Ukuran maksimum pernyataan SQL adalah 16 KB. Maksimal 20 ekspresi dapat ditambahkan setelah klausa WHERE. Setiap pernyataan mendukung hingga 100 operasi agregasi.

Catatan

Secara default, fitur penurunan kondisi mesin dinonaktifkan. Untuk mengaktifkan fitur ini, eksekusi pernyataan SET SESSION optimizer_switch='engine_condition_pushdown=on';.

Kueri yang memenuhi kondisi di atas didorong ke bucket OSS jarak jauh. Anda dapat menggunakan rencana eksekusi tabel asing OSS untuk melihat kueri yang didorong ke bucket OSS jarak jauh.

  • Lihat rencana eksekusi tabel asing OSS dengan mengeksekusi pernyataan EXPLAIN. 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 | Menggunakan where; Dengan kondisi mesin yang didorong ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Menggunakan sementara; Menggunakan pengurutan file |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    Kueri dengan kondisi setelah Dengan kondisi mesin yang didorong dapat didorong ke bucket OSS jarak jauh. Kueri dengan kondisi `name` LIKE "%1%%%%%" dan GROUP BY `id` ORDER BY `id` DESC hanya dapat dilakukan di server OSS lokal.

  • Lihat rencana eksekusi tabel asing OSS dalam format tree. Contoh:

    EXPLAIN FORMAT=tree  SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" Y `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)

    Kueri dengan kondisi setelah kondisi mesin: dapat didorong ke bucket OSS jarak jauh. Kueri dengan kondisi `name` LIKE "%1%%%%%" dan GROUP BY `id` ORDER BY `id` DESC hanya dapat dilakukan di server OSS lokal.

    Catatan

    Anda harus menggunakan kluster PolarDB for MySQL 8.0.2 untuk menanyakan data. Anda dapat memeriksa nomor versi untuk memeriksa versi kluster.

  • Lihat rencana eksekusi tabel asing OSS dalam format JSON. 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)

    Kueri dengan kondisi setelah kondisi mesin: dapat didorong ke bucket OSS jarak jauh. Kueri dengan kondisi `name` LIKE "%1%%%%%" dan GROUP BY `id` ORDER BY `id` DESC hanya dapat dilakukan di server OSS lokal.

Jika kesalahan berikut terjadi, beberapa karakter dalam file data OSS saat ini tidak memenuhi persyaratan untuk penurunan kondisi mesin.

Kesalahan OSS: Kueri saat ini tidak mendukung penurunan kondisi mesin. Anda perlu menggunakan petunjuk NO_ECP() atau menyetel optimizer_switch = 'engine_condition_pushdown=OFF' untuk mematikan fungsi penurunan kondisi.

Anda dapat menggunakan petunjuk atau variabel optimizer_switch untuk menonaktifkan fitur penurunan kondisi mesin secara manual.

  • hints

    Gunakan petunjuk untuk menonaktifkan fitur penurunan kondisi mesin untuk kueri. Dalam contoh berikut, fitur penurunan kondisi mesin dinonaktifkan untuk tabel t1:

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

    Gunakan variabel optimizer_switch untuk menonaktifkan fitur penurunan kondisi mesin untuk semua kueri dalam sesi saat ini.

    SET SESSION optimizer_switch='engine_condition_pushdown=off'; # Setel parameter engine_condition_pushdown ke off. Dalam hal ini, fitur penurunan kondisi mesin dinonaktifkan untuk semua kueri dalam sesi saat ini.

    Anda dapat mengeksekusi pernyataan berikut untuk menentukan apakah fitur penurunan kondisi mesin diaktifkan untuk semua kueri dalam sesi saat ini berdasarkan nilai variabel optimizer_switch:

    select @@optimizer_switch;

Sinkronkan informasi server OSS antar beberapa node

Node utama dan node baca-saja dari kluster PolarDB berbagi server OSS yang sama. Ini memastikan bahwa node-node tersebut dapat mengakses data OSS. Sinkronisasi informasi server OSS antar node ini bebas kunci untuk memastikan bahwa operasi pada node-node tersebut independen.

Setelah Anda memodifikasi informasi server OSS, modifikasi tersebut disinkronkan ke node baca-saja secara bebas kunci. Jika sebuah thread di node baca-saja memegang kunci untuk server OSS, sinkronisasi informasi server OSS mungkin tertunda. Dalam hal ini, Anda dapat mengeksekusi pernyataan /*force_node='pi-bpxxxxxxxx'*/ flush privileges; atau /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; untuk memperbarui informasi server OSS dari node baca-saja secara manual.