AnalyticDB for PostgreSQL のリモート AnalyticDB データソースアクセス機能を使用して、インスタンスと同じ Alibaba Cloud アカウントに属する他の AnalyticDB for PostgreSQL インスタンスのデータにアクセスできます。この機能を使用すると、外部データソースに対して結合クエリを実行できるため、データの適時性が確保され、データ冗長性が削減されます。
インスタンス間のクエリには、少なくとも 2 つのインスタンスが関係します。区別するために、クエリを開始するインスタンスをローカルインスタンス、外部データソースとして機能するインスタンスをリモートインスタンスと呼びます。
サポートされているバージョン
AnalyticDB for PostgreSQL V6.0: V6.6.0.0 以降。
AnalyticDB for PostgreSQL V7.0: V7.0.3.0 以降。
サーバーレスモードの AnalyticDB for PostgreSQL: V2.1.1.5 以降。
AnalyticDB for PostgreSQL インスタンスのマイナーバージョンの表示方法については、「インスタンスのマイナーバージョンを表示する」をご参照ください。 AnalyticDB for PostgreSQL インスタンスが上記の要件を満たしていない場合は、インスタンスのマイナーバージョンを更新することをお勧めします。詳細については、「UpgradeDBVersion」をご参照ください。
前提条件
ローカルインスタンスとリモートインスタンスは、同じ Virtual Private Cloud(VPC)内に存在する必要があります。
準備
この例では、ローカルインスタンス A とリモートインスタンス B でインスタンス間のクエリが実行されます。ローカルインスタンス A の local_db データベースからリモートインスタンス B の remote_db データベース内のテーブルにアクセスして、結合クエリを実行できます。
ローカルインスタンス A とリモートインスタンス B の初期アカウントを作成します。
クライアントの IP アドレスまたは CIDR ブロックを、ローカルインスタンス A とリモートインスタンス B のIP アドレスホワイトリストに追加します。
テストデータを準備します。
ローカルインスタンス A で、外部テーブルを作成し、リモートインスタンス B のデータにアクセスするためのデータベースとスキーマを作成します。
ローカルインスタンス A に接続します。
psql -h gp-bp166cyrtr4p*****-master.gpdb.rds.aliyuncs.com -p 5432 -d postgres -U gpdbaccountElastic Compute Service(ECS)インスタンスが AnalyticDB for PostgreSQL インスタンスと同じ VPC 内に存在しない場合、またはオンプレミスデバイスから AnalyticDB for PostgreSQL インスタンスに接続する場合は、インスタンスのパブリックエンドポイントを使用します。
ローカルインスタンス A で、
local_dbという名前のデータベースを作成し、local_dbデータベースに切り替えます。CREATE DATABASE local_db; \c local_dbローカルインスタンス A の
local_dbデータベースにスキーマを作成します。CREATE SCHEMA s02;
リモートインスタンス B で、ローカルインスタンス A からリモートインスタンス B のテーブルデータをクエリするためのデータベースとテーブルを作成します。
ローカルインスタンス A に接続するのと同じ方法で、リモートインスタンス B に接続します。
リモートインスタンス B で、
remote_dbという名前のデータベースを作成し、remote_dbデータベースに切り替えます。CREATE DATABASE remote_db; \c remote_dbリモートインスタンス B の
remote_dbデータベースにテストデータを準備します。CREATE SCHEMA s01; CREATE TABLE s01.t1(a int, b int, c text); CREATE TABLE s01.t2(a int, b int, c text); CREATE TABLE s01.t3(a int, b int, c text); INSERT INTO s01.t1 VALUES(generate_series(1,10),generate_series(11,20),'t1'); INSERT INTO s01.t2 VALUES(generate_series(11,20),generate_series(11,20),'t2'); INSERT INTO s01.t3 VALUES(generate_series(21,30),generate_series(11,20),'t3');
手順
ステップ 1: ローカルインスタンスにデータソースを追加する
AnalyticDB for PostgreSQL コンソールにログオンします。 ローカルインスタンス A を見つけて、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、[外部データソース管理] をクリックします。
[リモート Analyticdb データソースアクセス] タブをクリックし、[データソースの追加] をクリックします。 表示されるパネルで、次の表に示すパラメータを設定します。
パラメータ
説明
ローカルインスタンス ID
ローカルインスタンス A の ID。 このパラメータは自動的に指定されます。
ローカルデータベース名
ローカルインスタンス A 上のデータベースの名前。 この例では、
local_dbが使用されています。ローカル初期アカウント
ローカルインスタンス A の初期アカウント。 初期アカウントを作成済みの場合は、このパラメータを指定する必要はありません。
ローカル初期パスワード
初期アカウントのパスワード。
リモートインスタンス ID
リモートインスタンス B の ID。
リモートデータベース名
リモートインスタンス B 上のデータベースの名前。 この例では、
remote_dbが使用されています。リモート初期アカウント
リモートインスタンス B の初期アカウント。
リモート初期パスワード
初期アカウントのパスワード。
データソース名
データソースの名前。 例: example_name。
[OK] をクリックします。 データソースの接続ステータスが [実行中] に変わったら、インスタンス間でデータをクエリできます。
説明データソースを追加した後、データソースの接続ステータスは [リモート Analyticdb データソースを追加しています] に変わります。 このプロセスには約 1 分未満かかり、インスタンスの作成やデータの読み取り/書き込み操作には影響しません。
データソースが追加された後、次の操作を実行できます。
[アクション] 列の [編集] をクリックして、リモートインスタンスのデータベースアカウントとパスワードを変更します。
[アクション] 列の [削除] をクリックして、データソースを削除します。
ステップ 2: インスタンス間でデータをクエリする
リモート AnalyticDB for PostgreSQL インスタンスがサーバーレスモードの場合、スケーリング状態のインスタンスのデータにはアクセスできません。
ローカルインスタンス A に接続し、
local_dbデータベースのs02スキーマに切り替えます。ローカルインスタンス A の
s02スキーマで、リモートインスタンス B の t1、t2、t3 テーブルの外部テーブルを作成します。重要ローカルインスタンスのスキーマには、リモートテーブルと同じ名前のテーブルを含めることはできません。 そうしないと、操作は失敗します。
複数のテーブルを一度にインポートする
構文:
IMPORT FOREIGN SCHEMA remote_schema -- リモートインスタンスのスキーマ名。 [LIMIT TO ( table_name [, ...] ) ] -- リモートインスタンスのテーブル名。 FROM SERVER server_name -- ステップ 1 で設定したデータソース名。 INTO local_schema -- ローカルインスタンスのスキーマ名。例:
IMPORT FOREIGN SCHEMA s01 LIMIT TO (t1, t2, t3) FROM SERVER example_name INTO s02;説明構文の詳細については、IMPORT FOREIGN SCHEMA を参照してください。
単一のテーブルをインポートする
構文:
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ -- リモートインスタンスのテーブル名。 { column_name data_type } ] -- リモートインスタンスのテーブル構造。 [, ... ] ) SERVER server_name -- ステップ 1 で設定したデータソース名。 [ OPTIONS ( option 'value' [, ... ] ) ] -- ローカルインスタンスのスキーマ名とテーブル名。例:
CREATE FOREIGN TABLE s01.t1(a int, b int) SERVER example_name OPTIONS(schema_name 's02', table_name 't1');説明構文の詳細については、CREATE FOREIGN TABLE を参照してください。
ローカルインスタンス A の
local_dbデータベースからリモートインスタンス B のremote_dbデータベース内の t1 テーブルのデータをクエリします。説明AnalyticDB for PostgreSQL では、
Database.Schema.Table形式でデータにアクセスすることはできません。SELECT * FROM s02.t1;結果例:
a | b | c ----+----+---- 2 | 12 | t1 3 | 13 | t1 4 | 14 | t1 7 | 17 | t1 8 | 18 | t1 1 | 11 | t1 5 | 15 | t1 6 | 16 | t1 9 | 19 | t1 10 | 20 | t1 (10 rows)
関連情報
データベース間のクエリ: 同じインスタンス内のデータベース間でデータをクエリする方法について説明します。