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.
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
Buat ekstensi oss_fdw. Untuk detail lebih lanjut, lihat Parameter yang didukung oleh ekstensi oss_fdw.
CREATE EXTENSION oss_fdw;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');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');PentingSkema tabel dalam pernyataan pembuatan tabel hanya digunakan sebagai referensi. Pastikan skema tabel asing sesuai dengan skema objek OSS terkait.
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.
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);Tulis data di Bucket OSS ke tabel example.
INSERT INTO example SELECT * FROM ossexample;Anda dapat mengeksekusi pernyataan
EXPLAINuntuk 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: 2Anda 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.
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. |
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.
|
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.
|
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 |
compressiontype | Format kompresi yang digunakan untuk membaca data dari dan menulis data ke objek yang disimpan di dalam Bucket OSS.
|
compressionlevel | Tingkat kompresi yang digunakan untuk menulis data ke objek yang disimpan di dalam Bucket OSS. Nilai valid: 1 hingga 9. Nilai default: 6. |
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.