Topik ini menjelaskan cara mengkueri data lintas database di Hologres dan menyediakan contoh relevan.
Informasi latar belakang
Hologres V1.1 dan versi lebih baru memungkinkan Anda mengkueri data lintas wilayah, instans, dan database menggunakan tabel asing secara nyaman dan sederhana. Hologres kompatibel dengan PostgreSQL. Prinsip-prinsip penggunaan tabel asing untuk kueri lintas database sama dengan yang ada di PostgreSQL. Untuk informasi lebih lanjut, lihat postgres_fdw.
Batasan
Hanya Hologres V1.1 dan versi lebih baru yang mendukung kueri lintas database. Jika versi instans Hologres Anda lebih lama dari V1.1, tingkatkan instans Hologres Anda secara manual di konsol Hologres atau bergabunglah dengan grup DingTalk Hologres untuk mengajukan peningkatan instans. Untuk informasi lebih lanjut tentang cara menaikkan versi instans Hologres secara manual, lihat Peningkatan Instans. Untuk informasi lebih lanjut tentang cara bergabung dengan grup DingTalk Hologres, lihat Dapatkan Dukungan Online untuk Hologres.
Kueri lintas database hanya didukung antar instans dengan versi utama yang sama dan Hologres V1.1 atau lebih baru. Sebagai contoh, Anda tidak dapat mengkueri data dalam database instans Hologres V1.1 dari database dalam instans Hologres V1.3.
Hanya data dalam tabel internal Hologres yang dapat dikueri lintas database. Anda tidak dapat mengkueri data dalam tabel asing Hologres atau tampilan Hologres lintas database.
Hanya data dalam tabel induk Hologres yang dapat dikueri lintas database. Anda tidak dapat mengkueri data dalam tabel anak Hologres lintas database.
Hanya tipe data dasar seperti INT, BIGINT, dan DATE yang didukung. Tipe data kompleks seperti JSON tidak didukung.
Pernyataan seperti
UPDATE,DELETE, danTRUNCATEtidak dapat dieksekusi pada tabel asing.Alamat IP instans Hologres tidak tetap dan mungkin tunduk pada daftar putih alamat IP. Kami menyarankan agar Anda tidak mengonfigurasi daftar putih alamat IP saat mengkueri data lintas database.
Prosedur
Untuk mengkueri data lintas database, ikuti langkah-langkah berikut:
Buat ekstensi.
Sebelum mengkueri data lintas database, eksekusi pernyataan berikut untuk membuat ekstensi di database sebagai superuser. Ekstensi dibuat oleh superuser instans pada tingkat database. Untuk setiap database, Anda hanya perlu membuat ekstensi sekali.
-- Buat ekstensi. CREATE EXTENSION hologres_fdw;nullJika Anda ingin menghapus ekstensi, eksekusi pernyataan berikut:
DROP EXTENSION hologres_fdw;Buat server.
Setelah ekstensi dibuat, eksekusi pernyataan berikut untuk membuat server. Server digunakan untuk terhubung ke instans Hologres yang datanya ingin Anda kueri lintas database.
nullAnda dapat membuat beberapa server untuk sebuah database.
CREATE SERVER <server_name> FOREIGN DATA WRAPPER hologres_fdw OPTIONS ( host '<endpoint>', port '<port>', dbname '<dbname>' );Parameter
Deskripsi
Contoh
server_name
Nama kustom server.
holo_fdw_server
host
Titik akhir jaringan klasik instans Hologres. Anda dapat melihat titik akhir jaringan klasik instans Hologres di halaman detail instans di konsol Hologres.
hgpostcn-cn-xxx-cn-hangzhou-internal.hologres.aliyuncs.com
port
Nomor port instans Hologres. Anda dapat melihat nomor port instans Hologres di halaman detail instans di konsol Hologres.
80
dbname
Nama database sumber yang ingin Anda kueri lintas database.
testdb
Buat pemetaan pengguna.
Setelah server dibuat, eksekusi pernyataan berikut untuk membuat pemetaan pengguna yang digunakan untuk kueri data. Pengguna yang ditentukan dalam pemetaan pengguna harus memiliki izin untuk mengkueri data dalam database sumber.
nullAnda dapat membuat beberapa pemetaan pengguna untuk sebuah database.
CREATE USER MAPPING FOR <UID unik akun Alibaba Cloud> SERVER <server_name> OPTIONS ( access_id '<access_id>', access_key '<access_key>' );Parameter
Deskripsi
server_name
Nama server yang dibuat di Langkah 2.
access_id
ID AccessKey akun yang digunakan untuk terhubung ke Hologres. Anda dapat memperoleh ID AccessKey di halaman Pasangan AccessKey di Konsol Resource Access Management (RAM).
access_key
Rahasia AccessKey akun yang digunakan untuk terhubung ke Hologres.
Contoh:
-- Buat pemetaan pengguna untuk pengguna saat ini. CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server OPTIONS ( access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret' ); -- Buat pemetaan pengguna untuk pengguna RAM dengan UID 123xxx. CREATE USER MAPPING FOR "p4_123xxx" SERVER holo_fdw_server OPTIONS ( access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret' ); -- Hapus pemetaan pengguna. Drop USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server; Drop USER MAPPING FOR "p4_123xxx" SERVER holo_fdw_server;Buat tabel asing.
Anda dapat menggunakan salah satu metode berikut untuk membuat tabel asing:
(Direkomendasikan) Eksekusi pernyataan
IMPORT FOREIGN SCHEMAuntuk membuat tabel asing.Pernyataan
IMPORT FOREIGN SCHEMAmudah digunakan. Contoh pernyataan:IMPORT FOREIGN SCHEMA <holo_remote_schema> [{ LIMIT TO EXCEPT }| (remote_table [, ...])] FROM SERVER <server_name> INTO <holo_local_schema> [ OPTIONS ( OPTION 'values' [, ...])];nullSaat menyinkronkan metadata tabel sumber ke tabel asing, sejumlah besar metadata dibaca dari database eksternal tempat tabel sumber berada. Kami menyarankan agar Anda mengonfigurasi parameter LIMIT TO untuk menentukan tabel sumber yang metadata-nya Anda butuhkan. Ini mempersempit ruang lingkup sinkronisasi dan meningkatkan efisiensi.
Parameter
Deskripsi
Contoh
holo_remote_schema
Nama skema tempat tabel sumber yang ingin dikueri lintas database berada.
remote
remote_table
Nama tabel sumber yang ingin Anda kueri lintas database. Setelah pernyataan dieksekusi, tabel asing dengan nama yang sama dengan tabel sumber dibuat di database saat ini.
lineitem
server_name
Nama server.
holo_fdw_server
holo_local_schema
Nama skema tempat tabel asing berada.
local
OPTION 'values'
Kebijakan yang digunakan untuk menangani konflik saat membuat tabel asing. Nilai valid:
import_collate: menentukan apakah akan menyertakan opsi COLLATE untuk kolom. Nilai default: true.
import_default: menentukan apakah akan menyertakan ekspresi DEFAULT untuk kolom. Nilai default: false.
import_not_null: menentukan apakah akan menyertakan batasan NOT NULL untuk kolom. Nilai default: true.
import_not_null 'true'
Eksekusi pernyataan
CREATE FOREIGN TABLEuntuk membuat tabel asing.Contoh pernyataan SQL berikut:
CREATE FOREIGN TABLE <local_table> ( col_name type, ...... )SERVER <server_name> OPTIONS (schema_name '<remote_schema_name>', table_name '<remote_table>');Parameter
Deskripsi
Contoh
local_table
Nama tabel asing. Secara default, tabel asing dibuat di skema public. Jika Anda ingin menentukan skema, tambahkan nama skema sebelum nama tabel dalam format
Nama skema.Nama tabel.public.lineitem
server_name
Nama server.
holo_fdw_server
remote_schema_name
Nama skema tempat tabel sumber yang ingin dikueri lintas database berada.
public
remote_table
Nama tabel sumber yang ingin Anda kueri lintas database.
holo_lineitem
Kueri data menggunakan tabel asing.
Setelah tabel asing dibuat, Anda dapat mengkueri data menggunakan tabel asing untuk mengimplementasikan kueri lintas database. Contoh pernyataan SQL berikut:
SELECT * FROM <holo_local_table> LIMIT 10;(Opsional) Impor data ke tabel internal Hologres.
Jika Anda ingin mengimpor data lintas database atau instans, atau jika kinerja kueri tabel asing tidak memenuhi harapan Anda, eksekusi pernyataan SQL berikut untuk mengimpor data ke tabel internal Hologres.
nullSebelum mengimpor data, Anda harus membuat tabel internal Hologres sebagai tabel tujuan. Untuk informasi lebih lanjut tentang cara membuat tabel internal, lihat Kelola Tabel Internal.
INSERT INTO <holo_table> SELECT * FROM <holo_local_table>;
Operasi lainnya
Kueri server.
Anda dapat mengeksekusi pernyataan SQL berikut untuk mengkueri server yang telah dibuat:
SELECT s.srvname AS "Name", pg_catalog.pg_get_userbyid(s.srvowner) AS "Owner", f.fdwname AS "Foreign-data wrapper", pg_catalog.array_to_string(s.srvacl, E'\n') AS "Hak istimewa akses", s.srvtype AS "Tipe", s.srvversion AS "Versi", CASE WHEN srvoptions IS NULL THEN '' ELSE '(' || pg_catalog.array_to_string(ARRAY ( SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM pg_catalog.pg_options_to_table(srvoptions)), ', ') || ')' END AS "Opsi FDW", d.description AS "Deskripsi" FROM pg_catalog.pg_foreign_server s JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid = s.srvfdw LEFT JOIN pg_catalog.pg_description d ON d.classoid = s.tableoid AND d.objoid = s.oid AND d.objsubid = 0 WHERE f.fdwname = 'hologres_fdw';Kueri pemetaan pengguna.
Anda dapat mengeksekusi pernyataan SQL berikut untuk mengkueri pemetaan pengguna yang telah dibuat:
SELECT um.srvname AS "Server", um.usename AS "Nama pengguna", CASE WHEN umoptions IS NULL THEN '' ELSE '(' || pg_catalog.array_to_string(ARRAY ( SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM pg_catalog.pg_options_to_table(umoptions)), ', ') || ')' END AS "Opsi FDW" FROM pg_catalog.pg_user_mappings um WHERE um.srvname != 'query_log_store_server';Hapus pemetaan pengguna.
Anda dapat mengeksekusi pernyataan SQL berikut untuk menghapus pemetaan pengguna yang telah dibuat:
DROP USER MAPPING FOR <UID akun Alibaba Cloud> SERVER <server_name>;Parameter server_name menentukan nama server.
Hapus server.
Anda dapat mengeksekusi pernyataan SQL berikut untuk menghapus server yang telah dibuat.
nullAnda harus menghapus pemetaan pengguna dan tabel asing yang dibuat di server sebelum menghapus server.
DROP SERVER <server_name>;Parameter server_name menentukan nama server.
Contoh
Bagian ini memberikan contoh relevan tentang cara mengkueri data lintas database, termasuk konfigurasi preset dan kode sampel lengkap untuk contoh tersebut.
Konfigurasi Preset
Sebelum mengkueri data lintas database, Anda harus menyiapkan instans Hologres, membuat database Hologres, dan menyiapkan data relevan di tabel internal Hologres.
Konfigurasi Terkait Instans
Parameter
Contoh
ID instans Hologres sumber
hgpostcn-cn-i7mxxxxxxxxx
Nama database Hologres sumber
remote_db
Nama skema dalam database Hologres sumber
remote
Nama tabel internal dalam database Hologres sumber
lineitem
Nama tabel induk dalam database Hologres sumber
holo_dwd_product_movie_basic_info
Pernyataan DDL untuk Membuat Tabel Internal Hologres
BEGIN; CREATE SCHEMA remote; CREATE TABLE "remote"."lineitem" ( "l_orderkey" int8 NOT NULL, "l_linenumber" int8 NOT NULL, "l_suppkey" int8 NOT NULL, "l_partkey" int8 NOT NULL, "l_quantity" int8 NOT NULL, "l_extendedprice" int8 NOT NULL, "l_discount" int8 NOT NULL, "l_tax" int8 NOT NULL, "l_returnflag" text NOT NULL, "l_linestatus" text NOT NULL, "l_shipdate" timestamptz NOT NULL, "l_commitdate" timestamptz NOT NULL, "l_receiptdate" timestamptz NOT NULL, "l_shipinstruct" text NOT NULL, "l_shipmode" text NOT NULL, "l_comment" text NOT NULL ); COMMIT;Pernyataan DDL untuk Membuat Tabel Partisi Hologres
-- Buat tabel induk. BEGIN; CREATE TABLE "remote"."holo_dwd_product_movie_basic_info" ( "movie_name" text, "director" text, "scriptwriter" text, "area" text, "actors" text, "type" text, "movie_length" text, "movie_date" text, "movie_language" text, "imdb_url" text, "ds" text ) PARTITION BY LIST (ds); comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_name" is 'Nama Film'; comment on column "remote"."holo_dwd_product_movie_basic_info"."director" is 'Sutradara'; comment on column "remote"."holo_dwd_product_movie_basic_info"."scriptwriter" is 'Penulis Skenario'; comment on column "remote"."holo_dwd_product_movie_basic_info"."area" is 'Wilayah/Negara'; comment on column "remote"."holo_dwd_product_movie_basic_info"."actors" is 'Aktor'; comment on column "remote"."holo_dwd_product_movie_basic_info"."type" is 'Jenis'; comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_length" is 'Durasi Film'; comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_date" is 'Tanggal Rilis'; comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_language" is 'Bahasa Film'; comment on column "remote"."holo_dwd_product_movie_basic_info"."imdb_url" is 'URL IMDb'; COMMIT; -- Buat tabel anak untuk partisi 20170122. CREATE TABLE IF NOT EXISTS "remote".holo_dwd_product_movie_basic_info_20170122 PARTITION OF "remote".holo_dwd_product_movie_basic_info FOR VALUES IN ('20170122');
Contoh 1: Kueri Data dalam Tabel Non-partisi Lintas Database
nullAnda harus mengeksekusi semua pernyataan berikut di database dari mana Anda memulai kueri lintas database.
-- Buat ekstensi sebagai superuser. CREATE EXTENSION hologres_fdw; -- Buat server sebagai superuser. CREATE SERVER holo_fdw_server FOREIGN DATA WRAPPER hologres_fdw OPTIONS ( host 'hgpostcn-cn-i7mxxxxxxxxx-cn-hangzhou-internal.hologres.aliyuncs.com', port '80', dbname 'remote_db' ); -- Buat pemetaan pengguna untuk pengguna saat ini. CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server OPTIONS (access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret'); -- Buat skema. Skema lokal bersifat opsional untuk instans yang menggunakan fitur foreign data wrapper (FDW). Anda dapat menggunakan skema bisnis. CREATE SCHEMA local; -- Buat tabel asing. IMPORT FOREIGN SCHEMA remote LIMIT to (lineitem) FROM SERVER holo_fdw_server INTO local OPTIONS ( import_not_null 'true' ); SELECT * FROM local.lineitem limit 10;Contoh 2: Kueri Data dalam Tabel Partisi Lintas Database
CREATE EXTENSION hologres_fdw; CREATE SERVER holo_fdw_server FOREIGN DATA WRAPPER hologres_fdw OPTIONS ( host 'hgpostcn-cn-i7mxxxxxxxxx-cn-hangzhou-internal.hologres.aliyuncs.com', port '80', dbname 'remote_db' ); -- Buat pemetaan pengguna untuk pengguna saat ini. CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server OPTIONS (access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret'); -- Buat skema. Skema lokal bersifat opsional untuk instans yang menggunakan fitur FDW. Anda dapat menggunakan skema bisnis. CREATE SCHEMA local; -- Beralih ke instans lokal, yaitu instans yang menggunakan fitur FDW. IMPORT FOREIGN SCHEMA remote LIMIT to (holo_dwd_product_movie_basic_info) FROM SERVER holo_fdw_server INTO local OPTIONS ( import_not_null 'true' ); -- Kueri data dalam seluruh tabel. SELECT * FROM local.holo_dwd_product_movie_basic_info limit 10;Contoh 3: Impor Data dari Tabel Asing ke Tabel Internal
-- Buat skema. Skema lokal bersifat opsional untuk instans yang menggunakan fitur FDW. Anda dapat menggunakan skema bisnis. CREATE SCHEMA local; -- Buat tabel internal. BEGIN; CREATE TABLE "local"."dwd_product_movie_basic_info" ( "movie_name" text, "director" text, "scriptwriter" text, "area" text, "actors" text, "type" text, "movie_length" text, "movie_date" text, "movie_language" text, "imdb_url" text, "ds" text ); COMMIT; -- Impor data ke tabel internal. insert into local.dwd_product_movie_basic_info select * from local.holo_dwd_product_movie_basic_info;
Kesalahan umum dan pemecahan masalah
Saat membuat server, kami menyarankan agar Anda menggunakan instans utama sebagai instans yang datanya ingin Anda kueri. Jika kesalahan berikut terjadi, lihat solusi untuk menyelesaikan kesalahan tersebut.
Deskripsi Masalah: Saat instans sekunder baca-saja digunakan sebagai instans yang datanya ingin Anda kueri, pesan kesalahan serupa dengan berikut ini dilaporkan:
internal error: Gagal mendapatkan shard yang tersedia untuk kueri[xxxxx], silakan coba lagi nanti.Solusi: Eksekusi pernyataan SQL berikut pada instans utama yang sesuai dengan instans sekunder baca-saja yang datanya ingin Anda kueri dan pada instans dari mana Anda memulai kueri lintas database:
ALTER DATABASE <database> SET hg_experimental_enable_dml_read_replica=ON;