全部产品
Search
文档中心

ApsaraDB RDS:Gunakan ekstensi oss_fdw untuk membaca dan menulis file teks data asing

更新时间:Jul 06, 2025

Topik ini menjelaskan cara mengimpor data dari Bucket Object Storage Service (OSS) ke instance ApsaraDB RDS for PostgreSQL menggunakan ekstensi oss_fdw, serta cara mengekspor data dari instance tersebut ke Bucket OSS.

Prasyarat

Instance RDS Anda harus menjalankan PostgreSQL 10 atau yang lebih baru.

Catatan

Jika instance RDS Anda menjalankan PostgreSQL 14, versi mesin minor harus 20220830 atau yang lebih baru. Untuk informasi lebih lanjut tentang pembaruan versi mesin minor, lihat Perbarui versi mesin minor.

Gunakan ekstensi oss_fdw

  1. Buat ekstensi oss_fdw. Untuk detail lebih lanjut, lihat Parameter yang didukung oleh ekstensi oss_fdw.

    CREATE EXTENSION oss_fdw;
  2. Buat server. Untuk informasi lebih lanjut, lihat Parameter dalam pernyataan CREATE SERVER.

    CREATE SERVER ossserver FOREIGN DATA WRAPPER oss_fdw OPTIONS 
         (host 'oss-cn-hangzhou-internal.aliyuncs.com' , id 'access_id', key 'secrect_key',bucket 'mybucket');
  3. Buat tabel asing OSS bernama ossexample. Untuk detail lebih lanjut, lihat Parameter dalam pernyataan CREATE FOREIGN TABLE.

    CREATE FOREIGN TABLE ossexample 
        (date text, time text, open float,
         high float, low float, volume int) 
         SERVER ossserver 
         OPTIONS ( dir 'osstest/', delimiter ',' ,
             format 'csv', encoding 'utf8');
    Penting

    Skema tabel dalam pernyataan pembuatan tabel hanya digunakan sebagai referensi. Pastikan skema tabel asing sesuai dengan skema objek OSS terkait.

  4. Baca data dari tabel asing OSS dan tulis data tersebut ke instance RDS Anda.

    • Baca data dari tabel asing OSS.

      SELECT * FROM ossexample;
    • Tulis data di Bucket OSS ke instance RDS Anda.

      1. Buat tabel bernama example dengan skema yang sama seperti tabel ossexample.

        CREATE TABLE example
                (date text, time text, open float,
                 high float, low float, volume int);
      2. Tulis data di Bucket OSS ke tabel example.

        INSERT INTO example SELECT * FROM ossexample;
        • Anda dapat mengeksekusi pernyataan EXPLAIN untuk memperkirakan ukuran objek OSS dan merancang rencana kueri.

          EXPLAIN INSERT INTO example SELECT * FROM ossexample;
                                        QUERY PLAN
          ----------------------------------------------------------------------
           Insert on example  (cost=0.00..1.10 rows=0 width=0)
             ->  Foreign Scan on ossexample  (cost=0.00..1.10 rows=1 width=998)
                   Foreign OssDir: osstest/
                   Number Of Ossfile: 2
        • Anda juga dapat menulis data dari tabel example ke Bucket OSS.

          INSERT INTO ossexample SELECT * FROM example;

Untuk informasi lebih lanjut tentang parameter oss_fdw, lihat bagian berikutnya.

Parameter yang didukung oleh ekstensi oss_fdw

Mirip dengan pembungkus data asing lainnya (FDW), ekstensi oss_fdw membungkus data asing yang disimpan di Bucket OSS. Anda dapat menggunakan ekstensi ini untuk membaca data dari Bucket OSS, mirip dengan proses membaca tabel data. Ekstensi oss_fdw mendukung parameter untuk terhubung ke Bucket OSS dan menganalisis data di dalamnya.

Catatan

Ekstensi oss_fdw dapat membaca dan menulis data ke objek OSS dalam format CSV, termasuk objek CSV yang dikompresi menggunakan gzip.

Parameter dalam pernyataan CREATE SERVER

Parameter

Deskripsi

host

Titik akhir internal OSS untuk wilayah yang diperlukan.

Untuk mendapatkan titik akhir internal, lakukan operasi berikut: Masuk ke Konsol OSS. Pada halaman Buckets, klik nama bucket yang diperlukan. Pada halaman Overview bucket, periksa nilai parameter Endpoint.

id

ID AccessKey dari akun Alibaba Cloud Anda. Untuk informasi lebih lanjut, lihat Dapatkan pasangan AccessKey.

key

Rahasia AccessKey dari akun Alibaba Cloud Anda. Untuk informasi lebih lanjut, lihat Dapatkan pasangan AccessKey.

bucket

Nama Bucket OSS. Anda harus mengaktifkan OSS dan kemudian membuat bucket.

Tabel berikut menjelaskan parameter toleransi kesalahan yang disediakan oleh OSS. Jika konektivitas jaringan buruk, Anda dapat menyesuaikan nilai-nilai parameter ini untuk memastikan impor dan ekspor berhasil.

Parameter

Deskripsi

oss_connect_timeout

Periode waktu habis untuk koneksi. Unit: detik. Nilai default: 10.

oss_dns_cache_timeout

Periode waktu habis untuk catatan Sistem Nama Domain (DNS) yang di-cache. Unit: detik. Nilai default: 60.

oss_speed_limit

Kecepatan transmisi minimum yang dapat ditoleransi. Unit: bit/detik. Nilai default: 1024. Nilai default sama dengan 1 Kbit/detik.

oss_speed_time

Periode waktu maksimum selama mana kecepatan transmisi minimum dapat ditoleransi. Unit: detik. Nilai default: 15.

Catatan

Anda dapat mempertahankan nilai default parameter oss_speed_limit dan oss_speed_time. Dalam kasus ini, jika kecepatan transmisi tetap kurang dari 1 Kbit/detik selama 15 detik berturut-turut, kesalahan waktu habis akan terjadi.

Parameter dalam pernyataan CREATE FOREIGN TABLE

Parameter

Deskripsi

filepath

Nama objek yang digunakan untuk mencocokkan objek yang disimpan di dalam Bucket OSS. Nama objek harus berisi jalur OSS. Anda dapat mengonfigurasi salah satu parameter filepath dan dir. Jika Anda mengonfigurasi parameter filepath, Anda hanya dapat mengimpor data dari Bucket OSS ke instance RDS Anda.

  • Nama objek tidak berisi nama Bucket OSS.

  • Nama objek cocok dengan beberapa objek yang disimpan di dalam jalur OSS. Ini memungkinkan Anda mengimpor data dari beberapa objek ke instance RDS Anda.

  • Hanya data dari objek yang dinamai dalam format berikut yang dapat diimpor ke instance RDS Anda: filepath dan filepath.x. Nilai variabel x harus berupa bilangan bulat berturut-turut yang dimulai dari 1.

    Sebagai contoh, lima objek disimpan di dalam jalur OSS: filepath, filepath.1, filepath.2, filepath.3, dan filepath.5. Dalam kasus ini, filepath, filepath.1, filepath.2, dan filepath.3 cocok dan diimpor, tetapi filepath.5 tidak dapat dicocokkan atau diimpor.

dir

Folder yang digunakan untuk mencocokkan objek yang disimpan di dalam Bucket OSS. Anda dapat mengonfigurasi salah satu parameter filepath dan dir. Jika Anda mengonfigurasi parameter dir, Anda dapat mengimpor dan mengekspor data antara Bucket OSS dan instance RDS Anda.

  • Nama folder harus diakhiri dengan garis miring maju (/).

  • Data dari semua objek di dalam folder dicocokkan dan diimpor ke instance RDS Anda. Namun, objek-objek ini tidak termasuk subfolder dan objek yang disimpan di dalam subfolder.

prefix

Awalan jalur OSS ke objek. Parameter ini tidak mendukung ekspresi reguler. Anda dapat mengonfigurasi hanya salah satu parameter prefix, filepath, dan dir.

format

Format yang didukung untuk objek yang disimpan di dalam Bucket OSS. Hanya format CSV yang didukung.

encoding

Format yang digunakan untuk menyandikan data di dalam objek yang disimpan di dalam Bucket OSS. Format penyandian umum di PostgreSQL didukung. Format yang didukung ini mencakup UTF-8.

parse_errors

Mengurai mode toleransi kesalahan saat Anda membaca data dari Bucket OSS. Unit: baris data. Kesalahan yang terjadi selama analisis file diabaikan.

Penting

Parameter ini tidak didukung saat Anda menulis data dari instance RDS Anda ke Bucket OSS. Jika Anda ingin menulis data dari instance RDS Anda ke Bucket OSS, jangan konfigurasikan parameter ini.

delimiter

Pemisah yang digunakan untuk memisahkan kolom di dalam objek yang disimpan di dalam Bucket OSS.

quote

Karakter kutipan yang didukung untuk objek yang disimpan di dalam Bucket OSS.

escape

Karakter escape yang didukung untuk objek yang disimpan di dalam Bucket OSS.

null

Mengisi kolom kosong dengan nilai null. Sebagai contoh, Anda menentukan pengaturan null 'test'. Dalam kasus ini, jika kolom test kosong, itu diisi dengan nilai null.

force_not_null

Mengisi kolom kosong dengan string kosong daripada nilai null. Sebagai contoh, Anda menentukan pengaturan force_not_null 'id'. Dalam kasus ini, jika kolom ID kosong, itu diisi dengan string kosong daripada nilai null.

compressiontype

Format kompresi yang digunakan untuk membaca data dari dan menulis data ke objek yang disimpan di dalam Bucket OSS.

  • none: Data tidak dikompresi. Ini adalah nilai default.

  • gzip: Data dikompresi dalam format GZIP.

compressionlevel

Tingkat kompresi yang digunakan untuk menulis data ke objek yang disimpan di dalam Bucket OSS. Nilai valid: 1 hingga 9. Nilai default: 6.

Catatan
  • Parameter filepath dan dir ditentukan dalam parameter OPTIONS.

  • Anda harus menentukan salah satu parameter filepath atau dir, tetapi tidak keduanya.

  • Jika Anda mengekspor data dari instance RDS ke Bucket OSS, Anda hanya dapat menentukan parameter dir. Parameter filepath tidak dapat digunakan.

Parameter dalam pernyataan CREATE FOREIGN TABLE

  • oss_flush_block_size: ukuran buffer data yang dapat ditulis ke Bucket OSS sekaligus. Nilai valid: 1 hingga 128. Unit: MB. Nilai default: 32.

  • oss_file_max_size: jumlah maksimum data yang dapat ditulis ke objek di Bucket OSS. Jika jumlah data mencapai nilai maksimum, data tersisa ditulis ke objek baru. Nilai valid: 8 hingga 4000. Unit: MB. Nilai default: 1024.

  • num_parallel_worker: jumlah maksimum thread yang dapat berjalan secara paralel untuk mengompres data yang ditulis ke Bucket OSS. Nilai valid: 1 hingga 8. Nilai default: 3.

Fungsi bantu

FUNCTION oss_fdw_list_file (relname text, schema text DEFAULT 'public')

  • Fungsi ini digunakan untuk mendapatkan nama dan ukuran objek OSS yang cocok dengan tabel asing yang ditentukan.

  • Ukuran diukur dalam byte.

SELECT * FROM oss_fdw_list_file('ossexample');
              name              |   size    
--------------------------------+-----------
 osstest/test.gz.1  | 739698350
 osstest/test.gz.2  | 739413041
 osstest/test.gz.3  | 739562048
(3 rows)

Parameter bantu

oss_fdw.rds_read_one_file: menentukan objek OSS yang cocok dengan tabel asing. Parameter ini hanya didukung saat mengimpor data dari Bucket OSS ke instance RDS. Jika Anda menentukan parameter ini, hanya objek OSS yang cocok dengan tabel asing yang diimpor.

SET oss_fdw.rds_read_one_file = 'osstest/test.gz.2';
SELECT * FROM oss_fdw_list_file('ossexample');
              name              |   size    
--------------------------------+-----------
  oss_test/test.gz.2  | 739413041
(1 rows)

Catatan penggunaan

  • Ekstensi oss_fdw dikembangkan berdasarkan kerangka FOREIGN TABLE PostgreSQL untuk mengelola tabel asing.

  • Kinerja impor data bergantung pada sumber daya PostgreSQL dan OSS yang tersedia, seperti CPU, I/O, dan memori.

  • Untuk impor data dengan kinerja tinggi, pastikan instance RDS Anda dan Bucket OSS berada di wilayah yang sama. Untuk informasi lebih lanjut, lihat Nama domain OSS.

  • Jika kesalahan "ERROR: oss endpoint userendpoint not in aliyun white list" dilaporkan saat membaca pernyataan SQL dari tabel asing, gunakan titik akhir OSS publik yang disediakan untuk wilayah tertentu. Untuk informasi lebih lanjut, lihat Wilayah dan Titik Akhir.

Pemecahan masalah

Jika terjadi kesalahan impor atau ekspor, informasi berikut dicatat:

  • code: kode status HTTP dari permintaan yang gagal.

  • error_code: kode kesalahan yang dikembalikan oleh OSS.

  • error_msg: pesan kesalahan yang dikembalikan oleh OSS.

  • req_id: UUID dari permintaan yang gagal. Jika Anda memerlukan bantuan dalam memecahkan masalah, Anda dapat mengirimkan tiket yang berisi nilai req_id dari permintaan yang gagal.

Untuk informasi lebih lanjut tentang berbagai kesalahan, lihat dokumentasi berikut. Anda dapat menangani kesalahan waktu habis dengan mengonfigurasi ulang parameter yang terkait dengan ekstensi oss_ext.

Enkripsi ID AccessKey dan Rahasia AccessKey

Jika Anda tidak mengenkripsi nilai parameter id dan key dalam pernyataan CREATE SERVER, pengguna lain dapat memperoleh pasangan AccessKey Anda dalam teks biasa dengan mengeksekusi pernyataan select * from pg_foreign_server. Anda dapat menggunakan enkripsi simetris untuk mengenkripsi nilai parameter id dan key. Gunakan kunci yang berbeda untuk instance RDS yang berbeda untuk melindungi pasangan AccessKey Anda. Namun, Anda tidak dapat menambahkan tipe data seperti yang Anda bisa di Greenplum, karena hal ini dapat menyebabkan ketidakcocokan dengan versi sebelumnya.

Snippet berikut memberikan nilai terenkripsi dari parameter id dan key:

postgres=# SELECT * FROM pg_foreign_server ;
  srvname  | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                                              srvoptions
-----------+----------+--------+---------+------------+--------+------------------------------------------------------------------------------------------------------------------------------------
----------------------------------
 ossserver |       10 |  16390 |         |            |        | {host=oss-cn-hangzhou-zmf.aliyuncs.com,id=MD5****,key=MD5****,bucket=067862}

Setiap nilai terenkripsi dimulai dengan string MD5. Panjang total dibagi 8 adalah 3. Setelah nilai-nilai terenkripsi ini diekspor, mereka tidak akan dienkripsi lagi. Perhatikan bahwa Anda tidak dapat membuat ID AccessKey atau Rahasia AccessKey yang dimulai dengan string MD5.