Topik ini menjelaskan cara melakukan kueri data lintas database di Hologres serta menyediakan contoh penggunaannya.
Informasi latar belakang
Hologres V1.1 dan versi yang lebih baru mendukung kueri data lintas wilayah, instans, dan database melalui pembuatan tabel eksternal. Proses ini sederhana dan praktis. Karena Hologres kompatibel dengan PostgreSQL, prinsip kueri lintas database menggunakan tabel eksternal sama seperti pada PostgreSQL. Untuk informasi selengkapnya, lihat FDW.
Batasan
-
Hanya Hologres V1.1 dan versi yang lebih baru yang mendukung kueri data lintas database. Jika instans Anda menggunakan versi sebelum V1.1, lihat Kesalahan umum saat persiapan upgrade gagal atau bergabunglah dengan grup DingTalk Hologres untuk memberikan masukan. Untuk informasi selengkapnya, lihat Bagaimana cara mendapatkan dukungan online lebih lanjut?.
-
Anda hanya dapat melakukan kueri data dari instans Hologres versi V1.1 atau lebih baru. Kueri lintas database hanya didukung antar instans Hologres dengan versi utama yang sama. Kueri lintas versi utama berbeda tidak didukung. Misalnya, Anda tidak dapat melakukan kueri ke instans V1.1 dari instans V1.3.
-
Anda hanya dapat melakukan kueri pada tabel internal Hologres. Tabel eksternal atau Tampilan Hologres tidak dapat dikueri.
-
Anda hanya dapat melakukan kueri pada tabel induk partisi Hologres. Tabel anak partisi tidak dapat dikueri.
Hanya tipe data dasar seperti INT, BIGINT, dan DATE yang didukung. Tipe data kompleks seperti JSON tidak didukung.
-
Perintah
UPDATE,DELETE, danTRUNCATEtidak didukung untuk tabel eksternal. -
Karena alamat IP instans Hologres tidak tetap, aksesnya mungkin dibatasi oleh Daftar putih alamat IP. Disarankan agar Anda tidak mengonfigurasi Daftar putih alamat IP saat menggunakan fitur kueri lintas database.
Kueri lintas database
Prosedur penggunaan fitur kueri lintas database adalah sebagai berikut.
-
Buat ekstensi
Sebelum memulai, superuser harus mengeksekusi pernyataan berikut di database untuk membuat ekstensi. Pembuatan ekstensi memerlukan hak akses superuser instans, berlaku untuk seluruh database, dan hanya perlu dilakukan sekali per database.
--Buat ekstensi. CREATE EXTENSION hologres_fdw;CatatanUntuk menguninstal ekstensi, eksekusi perintah berikut.
DROP EXTENSION hologres_fdw; -
Buat server
Setelah ekstensi dibuat, eksekusi pernyataan berikut untuk membuat server guna menghubungkan ke instans tujuan kueri lintas database.
CatatanAnda dapat membuat beberapa server dalam satu database yang sama.
CREATE SERVER <server_name> FOREIGN DATA WRAPPER hologres_fdw OPTIONS ( host '<endpoint>', port '<port>', dbname '<dbname>' );Parameter
Deskripsi
Contoh
server_name
Nama server. Anda dapat menentukan nama kustom.
holo_fdw_server
host
Titik akhir jaringan klasik instans Hologres. Anda dapat membuka halaman detail instans di Hologres Management Console dan memperoleh titik akhir jaringan klasik (jaringan internal) dari tab Konfigurasi Instans.
hgpostcn-cn-xxx-cn-hangzhou-internal.hologres.aliyuncs.com
port
Port instans Hologres. Anda dapat membuka halaman detail instans di Hologres Management Console dan memperoleh port instans dari tab Konfigurasi Instans.
80
dbname
Nama database sumber yang akan dikueri.
testdb
-
Buat pemetaan pengguna
Setelah membuat server, eksekusi pernyataan berikut untuk membuat pemetaan pengguna guna melakukan kueri data. Pastikan pemetaan pengguna memiliki izin yang diperlukan untuk mengakses data sumber.
CatatanAnda dapat membuat beberapa pemetaan pengguna dalam satu database yang sama.
CREATE USER MAPPING FOR <account_uid> SERVER <server_name> OPTIONS ( access_id '<access_id>', access_key '<access_key>' );Parameter
Deskripsi
server_name
Nama server yang Anda tentukan pada langkah sebelumnya.
access_id
ID AccessKey akun saat ini. Anda dapat membuka Konsol RAM untuk memperoleh ID AccessKey.
access_key
Rahasia AccessKey akun saat ini.
Contoh penggunaan
-- 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 RAM user 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 eksternal
Anda dapat membuat tabel eksternal dengan dua cara:
-
(Direkomendasikan) Gunakan pernyataan
IMPORT FOREIGN SCHEMAuntuk membuat tabel eksternalPenggunaan pernyataan
IMPORT FOREIGN SCHEMAlebih sederhana dan praktis. Pernyataan SQL-nya adalah sebagai berikut.IMPORT FOREIGN SCHEMA <holo_remote_schema> [{ LIMIT TO EXCEPT }| (remote_table [, ...])] FROM SERVER <server_name> INTO <holo_local_schema> [ OPTIONS ( OPTION 'values' [, ...])];CatatanMengimpor metadata tabel eksternal memerlukan pembacaan metadata dalam jumlah besar dari database eksternal. Disarankan menggunakan parameter LIMIT TO untuk hanya mengimpor tabel yang diperlukan. Hal ini mencegah pengimporan seluruh database dan memastikan efisiensi pembuatan tabel eksternal.
Parameter
Deskripsi
Contoh
holo_remote_schema
Nama skema tempat tabel sumber berada.
remote
remote_table
Nama tabel sumber yang akan dikueri. Setelah tabel eksternal dibuat, tabel eksternal dengan nama yang sama dengan tabel sumber akan dibuat di database baru.
lineitem
server_name
Nama server yang telah dibuat.
holo_fdw_server
holo_local_schema
Nama skema tempat tabel eksternal dibuat.
local
OPTION 'values'
Kebijakan penanganan konflik saat membuat tabel eksternal. Parameter-parameter tersebut meliputi:
-
import_collate: Menentukan apakah konfigurasi collate kolom disertakan. Nilai default-nya adalah true.
-
import_default: Menentukan apakah nilai default kolom disertakan. Nilai default-nya adalah false.
-
import_not_null: Menentukan apakah Kendala NOT NULL kolom disertakan. Nilai default-nya adalah true.
import_not_null 'true'
-
-
Gunakan pernyataan
CREATE FOREIGN TABLEuntuk membuat tabel eksternalPernyataan SQL-nya adalah sebagai 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 eksternal yang akan dibuat. Secara default, tabel ditempatkan di skema public. Jika Anda memiliki skema kustom, tambahkan nama skema sebelum nama tabel dalam format
schema.table.public.lineitem
server_name
Nama server yang telah dibuat.
holo_fdw_server
remote_schema_name
Nama skema tempat tabel sumber berada.
public
remote_table
Nama tabel sumber yang akan dikueri.
holo_lineitem
-
-
Lakukan kueri data dari tabel eksternal
Setelah tabel eksternal dibuat, Anda dapat langsung mengkueri datanya untuk melakukan kueri lintas database. Pernyataan SQL-nya adalah sebagai berikut.
SELECT * FROM <holo_local_table> LIMIT 10; -
(Opsional) Impor data ke tabel internal
Jika Anda ingin mengimpor data lintas database dan instans, atau jika performa kueri tabel eksternal tidak memenuhi ekspektasi, Anda dapat menggunakan pernyataan SQL berikut untuk mengimpor data ke tabel internal Hologres.
CatatanSebelum memulai, buat terlebih dahulu tabel internal untuk menerima data. Untuk informasi selengkapnya tentang cara membuat tabel internal, lihat Kelola tabel internal.
INSERT INTO <holo_table> SELECT * FROM <holo_local_table>;
Operasi terkait
-
Kueri server.
Anda dapat menggunakan 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'; -
Lihat pemetaan pengguna.
Anda dapat menggunakan 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 menggunakan pernyataan SQL berikut untuk menghapus pemetaan pengguna.
DROP USER MAPPING FOR <account_uid> SERVER <server_name>;server_name adalah nama server.
-
Hapus server.
Anda dapat menggunakan pernyataan SQL berikut untuk menghapus server.
PentingSebelum menghapus server, Anda harus terlebih dahulu menghapus pemetaan pengguna dan tabel eksternal terkait.
DROP SERVER <server_name>;server_name adalah nama server.
Contoh penggunaan
Bagian ini menjelaskan konfigurasi prasyarat dan menyediakan tiga contoh lengkap kueri data lintas database.
-
Konfigurasi yang Disiapkan
Sebelum memulai contoh-contoh berikut, Anda harus memiliki instans Hologres, membuat database, dan menyiapkan data tabel internal terkait. Rinciannya sebagai berikut.
-
Konfigurasi instans
Konfigurasi
Deskripsi
ID instans Hologres sumber
hgpostcn-cn-i7mxxxxxxxxx
Nama database Hologres sumber
remote_db
Nama skema instans Hologres sumber
remote
Nama tabel internal Hologres sumber
lineitem
Nama tabel induk partisi Hologres sumber
holo_dwd_product_movie_basic_info
-
DDL untuk tabel internal Hologres sumber
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; -
DDL untuk tabel partisi Hologres sumber
-- Tabel induk partisi 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 'movie name'; comment on column "remote"."holo_dwd_product_movie_basic_info"."director" is 'director'; comment on column "remote"."holo_dwd_product_movie_basic_info"."scriptwriter" is 'scriptwriter'; comment on column "remote"."holo_dwd_product_movie_basic_info"."area" is 'production area/country'; comment on column "remote"."holo_dwd_product_movie_basic_info"."actors" is 'actors'; comment on column "remote"."holo_dwd_product_movie_basic_info"."type" is 'type'; comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_length" is 'movie length'; comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_date" is 'release date'; comment on column "remote"."holo_dwd_product_movie_basic_info"."movie_language" is 'language'; comment on column "remote"."holo_dwd_product_movie_basic_info"."imdb_url" is 'IMDb number'; COMMIT; --Buat tabel anak partisi 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 tabel non-partisi lintas database
CatatanSemua contoh kode berikut harus dieksekusi di database tempat Anda melakukan 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 otorisasi untuk pengguna saat ini. CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server OPTIONS (access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret'); -- Buat skema. Di instans yang menggunakan fitur FDW, skema lokal bersifat opsional. Anda dapat menggantinya dengan skema bisnis. CREATE SCHEMA local; -- Buat tabel eksternal. 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 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 otorisasi untuk pengguna saat ini. CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server OPTIONS (access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret'); -- Buat skema. Di instans yang menggunakan fitur FDW, skema lokal bersifat opsional. Anda dapat menggantinya dengan skema bisnis. CREATE SCHEMA local; -- Beralih ke instans lokal (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' ); -- Langsung lakukan kueri semua data di tabel. SELECT * FROM local.holo_dwd_product_movie_basic_info limit 10; -
Contoh 3: Impor data dari tabel eksternal ke tabel internal
-- Buat skema. Di instans yang menggunakan fitur FDW, skema lokal bersifat opsional. Anda dapat menggantinya dengan 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
Saat membuat server, disarankan agar Anda menggunakan Instans utama sebagai instans yang akan dikueri. Jika terjadi kesalahan berikut, lihat solusinya.
-
Skenario kesalahan: Pesan kesalahan serupa berikut muncul saat Anda menggunakan instans read-only replica sebagai instans yang akan dikueri.
internal error: Gagal mendapatkan shard yang tersedia untuk kueri[xxxxx], silakan coba lagi nanti. -
Solusi: Eksekusi perintah SQL berikut di Instans utama dari instans read-only replica dan di instans inisiator kueri lintas database.
ALTER DATABASE <database> SET hg_experimental_enable_dml_read_replica=ON;