全部产品
Search
文档中心

Hologres:Kueri data lintas database (beta)

更新时间:Jun 23, 2025

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, dan TRUNCATE tidak 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:

  1. 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;
    null

    Jika Anda ingin menghapus ekstensi, eksekusi pernyataan berikut:

    DROP EXTENSION hologres_fdw;
  2. 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.

    null

    Anda 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

  3. 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.

    null

    Anda 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;
  4. Buat tabel asing.

    Anda dapat menggunakan salah satu metode berikut untuk membuat tabel asing:

    • (Direkomendasikan) Eksekusi pernyataan IMPORT FOREIGN SCHEMA untuk membuat tabel asing.

      Pernyataan IMPORT FOREIGN SCHEMA mudah 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' [, ...])];
      null

      Saat 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 TABLE untuk 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

  5. 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;
  6. (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.

    null

    Sebelum 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.

    null

    Anda 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

    null

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