Tüm Ürünler
Search
Belge Merkezi

Hologres:Cross-database query (beta)

Son Güncelleme:Oct 06, 2026

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. JSON gibi karmaşık türler desteklenmez.

  • Yabancı tablolar üzerinde desteklenen işlemler: yalnızca SELECT. UPDATE, DELETE ve TRUNCATE iş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 SELECT iznine 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;
Not

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
Not

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;
Not

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
Not

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

Önemli

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.