Veritabanları arası sorgu, verileri taşımanıza gerek kalmadan diğer örneklerdeki ve veritabanlarındaki Hologres dahili tablolarından — farklı bölgelerdeki örnekler dahil — veri okumanızı sağlar. PostgreSQL Foreign Data Wrapper (FDW) mekanizmasını kullanır. FDW hakkında daha fazla bilgi için bkz. PostgreSQL FDW belgeleri.
Kısıtlamalar
Veritabanları arası sorguları yapılandırmadan önce aşağıdaki kısıtlamaları gözden geçirin:
Hem kaynak hem de hedef örneklerde Hologres V1.1 veya sonraki bir sürüm gerekir. Örneğiniz V1.1'den önceki bir sürümdeyse yükseltme yardımı için Yaygın yükseltme hazırlığı hataları veya çevrimiçi destek alın bölümlerine bakın. Veritabanları arası sorgular yalnızca aynı ana sürüme sahip örnekler arasında desteklenir; örneğin, V1.3 örneği V1.1 örneğini sorgulayamaz.
Desteklenen kaynak nesneler: yalnızca dahili tablolar ve bölümlenmiş üst tablolar. Yabancı tablolar, görünümler ve bölümlenmiş alt tablolar desteklenmez.
Desteklenen veri türleri: yalnızca temel türler.
JSONgibi karmaşık türler desteklenmez.Yabancı tablolar üzerinde desteklenen işlemler: yalnızca
SELECT.UPDATE,DELETEveTRUNCATEişlemleri desteklenmez.Hologres örneklerinin IP adresleri sabit değildir. Bu özelliği kullanırken IP adresi izin listesi yapılandırmayın; IP adresi değişirse bağlantı kopabilir.
Desteklenen veri türleri
| Desteklenen | Desteklenmeyen |
|---|---|
INT |
JSON |
BIGINT |
Diğer karmaşık türler |
DATE |
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
V1.1 veya sonraki bir sürümü çalıştıran bir Hologres örneği (hem yerel hem de uzak)
Yerel veritabanında süper kullanıcı erişimi
Kaynak tablolar üzerinde
SELECTiznine sahip hesap için bir Alibaba Cloud AccessKey ID ve AccessKey Secret. Bunları RAM konsolu üzerinden edinin
Veritabanları arası sorguyu yapılandırma
Veritabanları arası sorgu kurulumu dört yapılandırma adımı ve ardından sorgunun çalıştırılmasını içerir.
Adım 1: Uzantıyı oluşturun
Bir süper kullanıcı, FDW uzantısını yüklemek için her veritabanında bir kez aşağıdaki ifadeyi çalıştırmalıdır:
CREATE EXTENSION hologres_fdw;
Uzantıyı kaldırmak için DROP EXTENSION hologres_fdw; komutunu çalıştırın.
Adım 2: Sunucu oluşturun
Uzantı yüklendikten sonra, uzak Hologres örneğine işaret eden bir sunucu nesnesi oluşturun:
CREATE SERVER <server_name> FOREIGN DATA WRAPPER hologres_fdw OPTIONS (
host '<endpoint>',
port '<port>',
dbname '<dbname>'
);
| Parametre | Açıklama | Örnek |
|---|---|---|
server_name |
Sunucuya atadığınız ad. | holo_fdw_server |
host |
Uzak Hologres örneğinin klasik ağ (dahili ağ) uç noktası. Bunu Hologres konsolundaki Instance Configuration sekmesinde bulabilirsiniz. | hgpostcn-cn-xxx-cn-hangzhou-internal.hologres.aliyuncs.com |
port |
Uzak Hologres örneğinin bağlantı noktası. Bunu Hologres konsolundaki Instance Configuration sekmesinde bulabilirsiniz. | 80 |
dbname |
Sorgulanacak uzak veritabanının adı. | testdb |
Aynı veritabanında birden fazla sunucu oluşturabilirsiniz.
Adım 3: Kullanıcı eşlemesi oluşturun
Veritabanları arası bağlantının kimliğini doğrulamak için bir kullanıcı eşlemesi oluşturun. Eşlenen hesabın kaynak tablolar üzerinde SELECT izni olması gerekir.
CREATE USER MAPPING FOR <account_uid> SERVER <server_name>
OPTIONS (
access_id '<access_id>',
access_key '<access_key>'
);
| Parametre | Açıklama |
|---|---|
account_uid |
Eşlenecek yerel kullanıcı. Geçerli oturum kullanıcısı için CURRENT_USER veya p4_<uid> biçiminde bir RAM kullanıcısı belirtin. |
server_name |
2. adımdaki sunucu adı. |
access_id |
Hesabın AccessKey ID'si. |
access_key |
Hesabın AccessKey Secret'ı. |
Örnekler:
-- Map the current user.
CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server OPTIONS (
access_id 'yourAccessKeyId',
access_key 'yourAccessKeySecret'
);
-- Map a RAM user.
CREATE USER MAPPING FOR "p4_123xxx" SERVER holo_fdw_server OPTIONS (
access_id 'yourAccessKeyId',
access_key 'yourAccessKeySecret'
);
-- Remove a user mapping.
DROP USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server;
DROP USER MAPPING FOR "p4_123xxx" SERVER holo_fdw_server;
Aynı veritabanında birden fazla kullanıcı eşlemesi oluşturabilirsiniz.
Adım 4: Yabancı tablo oluşturun
Yabancı tablo oluşturmak için aşağıdaki iki yöntemden birini kullanın. Çoğu durumda daha basit olduğu için IMPORT FOREIGN SCHEMA yöntemi önerilir.
Yöntem 1 (önerilen): IMPORT FOREIGN SCHEMA
IMPORT FOREIGN SCHEMA <holo_remote_schema>
[{ LIMIT TO | EXCEPT } (<remote_table> [, ...])]
FROM SERVER <server_name>
INTO <holo_local_schema>
[OPTIONS (<option> '<value>' [, ...])];
| Parametre | Açıklama | Örnek |
|---|---|---|
holo_remote_schema |
Kaynak tablonun bulunduğu uzak veritabanındaki şema adı. | remote |
remote_table |
Kaynak tablo adı. Yabancı tablo, yerel şemada aynı adla oluşturulur. | lineitem |
server_name |
2. adımdaki sunucu adı. | holo_fdw_server |
holo_local_schema |
Yabancı tablonun oluşturulacağı yerel şema. | local |
Desteklenen seçenekler:
| Seçenek | Açıklama | Varsayılan |
|---|---|---|
import_collate |
Sütun karşılaştırma ayarlarını dahil eder. | true |
import_default |
Sütun varsayılan değerlerini dahil eder. | false |
import_not_null |
NOT NULL kısıtlamalarını dahil eder. |
true |
Yalnızca ihtiyacınız olan tabloları içe aktarmak için LIMIT TO seçeneğini kullanın. Uzak şema çok sayıda tablo içeriyorsa tüm şemanın içe aktarılması yavaş olabilir.
Yöntem 2: CREATE FOREIGN TABLE
CREATE FOREIGN TABLE <local_table> (
col_name type,
...
) SERVER <server_name>
OPTIONS (schema_name '<remote_schema_name>', table_name '<remote_table>');
| Parametre | Açıklama | Örnek |
|---|---|---|
local_table |
Yerelde oluşturulacak yabancı tablonun adı. Özel bir şemaya yerleştirmek için schema.table biçimini kullanın. |
public.lineitem |
server_name |
2. adımdaki sunucu adı. | holo_fdw_server |
remote_schema_name |
Uzak veritabanındaki şema adı. | public |
remote_table |
Uzak veritabanındaki kaynak tablo adı. | holo_lineitem |
Adım 5: Yabancı tabloyu sorgulayın
Yabancı tablo oluşturulduktan sonra doğrudan sorgulayın:
SELECT * FROM <holo_local_table> LIMIT 10;
Adım 6 (isteğe bağlı): Verileri yerel bir dahili tabloya aktarın
Yabancı tablo sorgu performansı ihtiyaçlarınızı karşılamazsa veya verilerin yerel bir kopyasına ihtiyacınız varsa bunları bir Hologres dahili tablosuna aktarın:
INSERT INTO <holo_table> SELECT * FROM <holo_local_table>;
Bu ifadeyi çalıştırmadan önce hedef dahili tabloyu oluşturun. Ayrıntılar için bkz. Dahili tabloları yönetme.
Sunucuları ve kullanıcı eşlemelerini yönetme
Sunucuları listeleme
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 "Access privileges",
s.srvtype AS "Type",
s.srvversion AS "Version",
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 "FDW options",
d.description AS "Description"
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';
Kullanıcı eşlemelerini listeleme
SELECT
um.srvname AS "Server",
um.usename AS "User name",
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 "FDW options"
FROM
pg_catalog.pg_user_mappings um
WHERE
um.srvname != 'query_log_store_server';
Kullanıcı eşlemesini silme
DROP USER MAPPING FOR <account_uid> SERVER <server_name>;
Sunucuyu silme
Bir sunucuyu bırakmadan önce ilgili tüm kullanıcı eşlemelerini ve yabancı tabloları silin.
DROP SERVER <server_name>;
Örnekler
Aşağıdaki örnekler paylaşılan bir kaynak örneği ve veritabanını kullanır. Tüm ifadeleri yerel veritabanında — yani veritabanları arası sorguyu yaptığınız veritabanında — çalıştırın.
Kaynak örnek yapılandırması
| Yapılandırma | Değer |
|---|---|
| Kaynak örnek kimliği | hgpostcn-cn-i7mxxxxxxxxx |
| Kaynak veritabanı | remote_db |
| Kaynak şema | remote |
| Bölümlenmemiş tablo | lineitem |
| Bölümlenmiş üst tablo | holo_dwd_product_movie_basic_info |
Kaynak Hologres dahili tablosu için DDL
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;
Kaynak Hologres bölümlenmiş tablosu için DDL
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);
COMMIT;
-- Create a partition for '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');
Örnek 1: Bölümlenmemiş tabloyu sorgulama
-- Run as a superuser in the local database.
-- Step 1: Install the extension.
CREATE EXTENSION hologres_fdw;
-- Step 2: Create a server pointing to the remote instance.
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'
);
-- Step 3: Create a user mapping for the current user.
CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server
OPTIONS (access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret');
-- Step 4: Create a local schema and import the foreign table.
CREATE SCHEMA local;
IMPORT FOREIGN SCHEMA remote
LIMIT TO (lineitem)
FROM SERVER holo_fdw_server
INTO local
OPTIONS (import_not_null 'true');
-- Step 5: Query the foreign table.
SELECT * FROM local.lineitem LIMIT 10;
Örnek 2: Bölümlenmiş tabloyu sorgulama
-- Run as a superuser in the local 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'
);
CREATE USER MAPPING FOR CURRENT_USER SERVER holo_fdw_server
OPTIONS (access_id 'yourAccessKeyId', access_key 'yourAccessKeySecret');
CREATE SCHEMA local;
-- Import the partitioned parent table (child tables are included automatically).
IMPORT FOREIGN SCHEMA remote
LIMIT TO (holo_dwd_product_movie_basic_info)
FROM SERVER holo_fdw_server
INTO local
OPTIONS (import_not_null 'true');
SELECT * FROM local.holo_dwd_product_movie_basic_info LIMIT 10;
Örnek 3: Verileri yabancı tablodan yerel dahili tabloya aktarma
-- Create a local schema.
CREATE SCHEMA local;
-- Create the target internal table.
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;
-- Copy data from the foreign table into the internal table.
INSERT INTO local.dwd_product_movie_basic_info
SELECT * FROM local.holo_dwd_product_movie_basic_info;
Sorun giderme
Salt okunur çoğaltmayı sorgularken hata oluşması
Sorgu hedefi olarak salt okunur çoğaltma örneğini yapılandırırsanız aşağıdaki hatayı görebilirsiniz:
internal error: Failed to get available shards for query[xxxxx], please retry later.
Aşağıdaki ifadeyi hem salt okunur çoğaltmanın birincil örneğinde hem de yerel (başlatan) örnekte çalıştırın:
ALTER DATABASE <database> SET hg_experimental_enable_dml_read_replica=ON;
Mümkün olduğunca sorgu hedefi olarak birincil örneği kullanın.