リージョン間およびクラウドプラットフォーム間での共有の複製

Snowflake Marketplace またはData Exchangeでデータを共有すると、プロバイダーはリモートリージョンからリクエストを受信します。このトピックでは、アカウント複製を使用して、リージョンとクラウドプラットフォーム間でデータ共有を複製する手順について説明します。

アカウントの複製により、 ソース アカウントから同じ組織内にある1つ以上の ターゲット アカウントにオブジェクトを複製できるようになります。各ターゲットアカウントで複製されたオブジェクトは、 セカンダリ オブジェクトと呼ばれ、ソースアカウントの プライマリ オブジェクトのレプリカです。

重要

元となるSnowflakeアカウントとは異なる地理的地域または国にデータベースを複製する場合は、データの転送またはホストに関する法的または規制上の制限がないことを確認する必要があります。

このトピックの内容:

複製グループ

複製グループは、1つ以上のターゲットアカウントにユニットとして複製される、ソースアカウント内のオブジェクトの定義済みコレクションです。複製グループは、複製されたオブジェクトへの読み取り専用アクセスを提供します。複製グループは、コレクション内のオブジェクト(データベースや共有など)に対して特定時点における一貫性を提供します。

プロバイダーは、ソースアカウントにプライマリ複製グループを作成し、コンシューマーのターゲットアカウントへの複製を有効にします。標準の共有の場合、データプロバイダーは、コンシューマーごとではなく、リージョンごとに共有のコピーを1つだけ作成する必要があります。

注釈

このトピックは、 アカウント複製 で利用できる機能のサブセクションです。アカウント複製により、アカウントオブジェクトの複製とフェールオーバーに加えて、データベースと共有の複製ができるようになります。

複製されたオブジェクト

データベースの複製

この機能は、データベースの複製をサポートします。スナップショットには、オブジェクトとデータへの変更が含まれます。セカンダリデータベースを更新すると、データベースとデータベース内のオブジェクト(スキーマ、テーブル、ビューなど)に対する権限の付与が同期されます。これらのオブジェクトのロールに付与された権限は、ソースアカウントからターゲットアカウントに同期されます。データベース複製でサポートされているオブジェクトに対する権限付与のみが同期されることに注意してください。オブジェクトのリストについては、 複製されたデータベースオブジェクト をご参照ください。

サポートされているオブジェクト および サポートされていないデータベースオブジェクトの両方に対する将来の付与は、データベースレベルとスキーマレベルで同期されます。セカンダリデータベースがセット内のプライマリデータベースに昇格された後、指定された型のオブジェクトを作成すると、将来の付与での定義に従って権限がロールに自動で付与されます。将来の付与の詳細については、 将来の付与を使用した付与管理の簡素化 をご参照ください。

共有複製

この機能は、共有オブジェクトと、データベースオブジェクトの共有に付与されたアクセス権限の複製をサポートします。

ターゲットアカウントのオブジェクトを更新するユーザー

ALTER REPLICATION GROUP ... REFRESH コマンドを実行して、ソースアカウントからターゲットアカウントのオブジェクトを更新するユーザーは、複製グループに対して REPLICATE 権限を持つロールを使用する必要があります。Snowflakeは、次のシナリオで失敗することにより、ターゲットアカウントでこのユーザーを保護します。

  • ユーザーがソースアカウントに存在しない場合は、更新操作に失敗します。

  • ユーザーがソースアカウントに存在するが、REPLICATE 権限を持つロールがユーザーに付与されていない場合は、更新操作に失敗します。

複製権限

ユーザーがシステム内のオブジェクトに対して実行できる操作を指定するためにロールに付与できる複製権限のリストについては、 複製権限 をご参照ください。

複製スケジュール

ベストプラクティスとして、Snowflakeは、 REPLICATION_SCHEDULE パラメーターを使用して自動更新をスケジュールすることをお勧めします。スケジュールは、 CREATE REPLICATION GROUP 以降で(ALTER REPLICATION GROUP を使用して)新しい複製グループを作成するときに定義できます。

セカンダリ複製グループが作成されると、最初の更新が自動的に実行されます。次回の更新は、前回の更新が開始された日時とスケジュール間隔、またはcron式に基づいた次の有効時間に基づいてスケジュールされます。たとえば、更新スケジュール間隔が10分で、前回の更新操作(スケジュールされた更新または手動でトリガーされた更新)が12:01に開始される場合、次の更新は12:11にスケジュールされます。

Snowflakeは、一度に1回の更新のみが実行されるようにします。次回の更新がスケジュールされているときに更新がまだ実行中の場合、現在実行中の更新が完了後に次回の更新が遅れて開始されます。たとえば、更新が毎時正時15分後に実行されるようにスケジュールされており、前の更新が12:16に完了する場合、次の更新は、前に実行中の更新完了後に実行がスケジュールされます。

複製グループの制約

データベースと共有では、複製グループのメンバーシップに制約があり、ターゲットアカウントに一意に複製する必要があります。

次の制約がデータベースと共有オブジェクトに適用されます。

  • 各グループが 異なる ターゲットアカウントに複製される限り、オブジェクトは複数の複製グループに属することができます。

  • セカンダリ(レプリカ)オブジェクトをプライマリ複製グループに追加することはできません。

データベース複製からグループベース複製への移行

地域とクラウドプラットフォーム間で安全にデータを共有する の手順に従って以前にデータベースのデータベース複製を有効にした場合は、データベースを複製グループに追加する前にデータベース複製を無効にする必要があります。

注釈

ACCOUNTADMIN ロールを使用して、このセクションの SQL ステートメントを実行します。

ステップ1:複製が有効なデータベースの複製を無効にする

複製グループに追加する前に、 SYSTEM$DISABLE_DATABASE_REPLICATION 関数を使用して、プライマリデータベースとそれにリンクされているセカンダリデータベースのデータベース複製を無効にします。

プライマリデータベースのソースアカウントから次の SQL ステートメントを実行します。

SELECT SYSTEM$DISABLE_DATABASE_REPLICATION('mydb');
Copy

ステップ2:データベースと共有をプライマリ複製グループに追加し、セカンダリ複製グループを作成する

データベース複製を正常に無効にすると、プライマリデータベースとプライマリ共有をソースアカウントの複製グループに追加できるようになります。

次に、各ターゲットアカウントにセカンダリ複製グループを作成します。セカンダリ複製グループが各ターゲットアカウントで更新されると、以前のセカンダリデータベースがセカンダリ複製グループのメンバーとして自動的に追加され、プライマリオブジェクトからの変更で更新されます。

プライマリおよびセカンダリ複製グループを作成し、ターゲットアカウントのオブジェクトの自動更新をスケジュールするには、以下の ワークフロー をご参照ください。

注釈

以前に複製されたデータベースを複製グループに追加すると、Snowflakeはそのデータベースに対してすでに複製されたデータを再複製 しません。グループが更新されると、最後の更新以降の変更のみが複製されます。

ワークフロー

次の SQL ステートメントは、データベースを有効にし、複製を共有し、オブジェクトを更新するためのワークフローを示しています。各ステップについては、以下で詳しく説明します。

希望するSnowflakeクライアントで次の SQL ステートメントを実行して、データベースと共有複製を有効にし、スケジュールに従ってオブジェクトを更新します。

ソースアカウントでの実行

  1. ロールを作成し、それに CREATE REPLICATION GROUP 権限を付与します。このステップは オプション です。

    -- Execute the following SQL statements using the ACCOUNTADMIN role:
    USE ROLE ACCOUNTADMIN;
    
    CREATE ROLE myrole;
    
    GRANT CREATE REPLICATION GROUP ON ACCOUNT
      TO ROLE myrole;
    
    Copy
  2. ソースアカウントに複製グループを作成し、特定のターゲットアカウントへの複製を有効にします。

    注釈

    • 以前に複製が有効になっている複製グループに追加するデータベースがある場合は、グループに追加する 前にデータベース複製からグループベース複製への移行 の手順(このトピック内)に従って、オブジェクトを複製グループと互換性のあるオブジェクトに変換します。

    • データベースを複製グループに追加するには、データベースに対する MONITOR 権限がアクティブなロールに必要です。データベース権限の詳細については、 データベース権限 (別のトピック内)をご参照ください。

    • 複製グループに共有を追加するには、共有に対する OWNERSHIP 権限がアクティブなロールに必要です。

    USE ROLE myrole;
    
    -- Execute the following SQL statement using a role with the CREATE REPLICATION GROUP privilege:
    CREATE REPLICATION GROUP myrg
        OBJECT_TYPES = DATABASES, SHARES
        ALLOWED_DATABASES = db1, db2
        ALLOWED_SHARES = s1
        ALLOWED_ACCOUNTS = myorg.myaccount2, myorg.myaccount3
        REPLICATION_SCHEDULE = '10 MINUTE';
    
    Copy

ターゲットアカウントでの実行

  1. ターゲットアカウントにロールを作成し、それに CREATE REPLICATION GROUP 権限を付与します。このステップは オプション です。

    -- Execute the following SQL statements using the ACCOUNTADMIN role:
    USE ROLE ACCOUNTADMIN;
    
    CREATE ROLE myrole;
    
    GRANT CREATE REPLICATION GROUP ON ACCOUNT
        TO ROLE myrole;
    
    Copy
  2. ソースアカウントの複製グループのレプリカとして、ターゲットアカウントに複製グループを作成します。

    USE ROLE myrole;
    
     -- Execute the following SQL statement using a role with the CREATE REPLICATION GROUP privilege:
     CREATE REPLICATION GROUP myrg
         AS REPLICA OF myorg.myaccount1.myrg;
    
    Copy

セカンダリ複製グループを手動で更新する

ベストプラクティスとして、Snowflakeは、 REPLICATION_SCHEDULE パラメーターを使用して自動更新をスケジュールすることをお勧めします。詳細については、 複製スケジュール (このトピック内)をご参照ください。セカンダリ複製グループ内のすべてのオブジェクトを手動で更新するには、 ターゲット アカウントから次の SQL ステートメントを実行します。

ターゲットアカウント内のオブジェクトを手動で更新するには、 ALTER REPLICATION GROUP...REFRESH コマンドを実行します。

注釈

ターゲットアカウントで関数を呼び出したユーザーがソースアカウントでドロップされた場合は、更新操作に失敗します。

複製グループの REPLICATE 権限をロールに付与する --- オプション

現在、 REPLICATE 権限は複製 されない ため、ソースアカウントとターゲットアカウントの両方の複製グループで付与する必要があります。

ソースアカウントから実行:

-- Execute the following SQL statements using a role with the OWNERSHIP privilege on the group:
GRANT REPLICATE ON REPLICATION GROUP myrg TO ROLE my_replication_role;
Copy

ターゲットアカウントから実行:

-- Execute the following SQL statements using a role with the OWNERSHIP privilege on the group:
GRANT REPLICATE ON REPLICATION GROUP myrg TO ROLE my_replication_role;
Copy

手動でセカンダリ複製グループを更新する

たとえば、複製グループ myrg 内のオブジェクトを更新するには、ターゲットアカウントから次のステートメントを実行します。

USE ROLE my_replication_role;

-- Execute the following SQL statements using a role with the REPLICATE privilege:
ALTER REPLICATION GROUP myrg REFRESH;
Copy

データベースおよび共有の複製

前提条件

アカウントで複製を有効にする

ORGADMIN ロールを持つユーザーは、組織内の2つ以上のアカウントで複製を有効にする必要があります。手順については、 前提条件: 組織内のアカウントの複製を有効にする をご参照ください。

注釈

データ複製を構成する前に、既存のアカウントを持っているか、データを共有するリージョンにアカウントを作成し、ローカルアカウントにリンクする必要があります。アカウントの作成の詳細については、 アカウントの作成 をご参照ください。

ソースアカウントで共有を作成する

以前にソース(ローカル)アカウントで共有を作成している場合は、このステップをスキップできます。

新しい共有を作成するには、

  1. Snowflake Classic Console に、 ACCOUNTADMIN のロールを持つユーザーとしてログインします。

  2. 共有を作成し、共有にオブジェクトを追加します。手順については、 Secure Data Sharingの開始 をご参照ください。

ステップ1: ソースアカウントに CREATE REPLICATION GROUP 権限を持つロールを作成する --- オプション

ロールを作成し、それに CREATE REPLICATION GROUP 権限を付与します。このステップはオプションです。このロールをすでに作成している場合は、 ステップ2: ソースアカウントにプライマリ複製グループを作成する にスキップします。

-- Execute the following SQL statements using the ACCOUNTADMIN role:
USE ROLE ACCOUNTADMIN;

CREATE ROLE myrole;

GRANT CREATE REPLICATION GROUP ON ACCOUNT
    TO ROLE myrole;
Copy

ステップ2: ソースアカウントにプライマリ複製グループを作成する

プライマリ複製グループを作成し、現在の(ソース)アカウントから同じ組織内にある1つ以上のターゲットアカウントに、指定されたデータベースと共有を複製できるようにします。

複製が有効になっているすべてのアカウントを表示する

複製が有効になっている組織内のアカウントのリストを取得するには、 SHOW REPLICATION ACCOUNTS を使用します。

SHOW REPLICATION ACCOUNTS;

+------------------------+-------------------------+--------------+-----------------+-----------------+-------------------+
| snowflake_region       | created_on              | account_name | account_locator |  comment        | organization_name |
+------------------------+-------------------------+--------------+-----------------+-----------------+-------------------+
| AWS_US_WEST_2          | 2020-07-15 21:59:25.455 | myaccount1   | myacctlocator1  |                 | myorg             |
+------------------------+-------------------------+--------------+-----------------+-----------------+-------------------+
| AWS_US_EAST_1          | 2020-07-23 14:12:23.573 | myaccount2   | myacctlocator2  |                 | myorg             |
+------------------------+-------------------------+--------------+-----------------+-----------------+-------------------+
| AWS_US_EAST_2          | 2020-07-25 19:25:04.412 | myaccount3   | myacctlocator3  |                 | myorg             |
+------------------------+-------------------------+--------------+-----------------+-----------------+-------------------+
Copy

複製グループメンバーシップの表示

データベースオブジェクトと共有オブジェクトには、メンバーシップ上の 複製グループの制約 があります。新しいグループを作成したり、既存のグループにオブジェクトを追加したりする前に、既存の複製グループと各グループのオブジェクトのリストを確認できます。

注釈

このセクションの SQL ステートメントを実行できるのは、アカウント管理者(ACCOUNTADMIN ロールを持つユーザー)またはグループ所有者(グループに対する OWNERSHIP 権限を持つロール)のみです。

現在のアカウントにリンクされているすべての複製グループと、各グループのオブジェクト型を表示します。

SHOW REPLICATION GROUPS;
Copy

複製グループ myrg 内のすべてのデータベースを表示します。

SHOW DATABASES IN REPLICATION GROUP myrg;
Copy

複製グループ myrg 内のすべての共有を表示します。

SHOW SHARES IN REPLICATION GROUP myrg;
Copy

ソースアカウントからターゲットアカウントへのデータベースと共有の複製を有効にする

ソースアカウントで指定されたデータベースと共有の複製グループを作成し、ターゲットアカウントのリストへの複製を有効にします。構文については、 CREATE REPLICATION GROUP をご参照ください。

たとえば、データベース db1db2 の複製を有効にし、ソースアカウントから同じ組織の myaccount2 アカウントに s1 を共有します。

ソースアカウントで実行:

USE ROLE myrole;

-- Execute the following SQL statement using a role with the CREATE REPLICATION GROUP privilege:
CREATE REPLICATION GROUP myrg
    OBJECT_TYPES = databases, shares
    ALLOWED_DATABASES = db1, db2
    ALLOWED_SHARES = s1
    ALLOWED_ACCOUNTS = myorg.myaccount2;
Copy

ステップ3: ターゲットアカウントに CREATE REPLICATION GROUP 権限を持つロールを作成する --- オプション

ターゲットアカウントにロールを作成し、それに CREATE REPLICATION GROUP 権限を付与します。このステップはオプションです。このロールをすでに作成している場合は、 ステップ4: ターゲットアカウントにセカンダリ複製グループを作成する にスキップします。

-- Execute the following SQL statements using the ACCOUNTADMIN role:
USE ROLE ACCOUNTADMIN;

CREATE ROLE myrole;

GRANT CREATE REPLICATION GROUP ON ACCOUNT
    TO ROLE myrole;
Copy

ステップ4: ターゲットアカウントにセカンダリ複製グループを作成する

ソースアカウントのプライマリ複製グループのレプリカとして、ターゲットアカウントにセカンダリ複製グループを作成します。

ステップ2: ソースアカウントにプライマリ複製グループを作成する (このトピック内)で複製を有効にした各ターゲットアカウントで、 CREATE REPLICATION GROUP...AS REPLICA OF ステートメントを実行します。

各ターゲットアカウントから実行:

USE ROLE myrole;

-- Execute the following SQL statement using a role with the CREATE REPLICATION GROUP privilege:
CREATE REPLICATION GROUP myrg
  AS REPLICA OF myorg.myaccount1.myrg;
Copy

セカンダリ複製グループを手動で更新する

ターゲットアカウントのセカンダリ複製グループを手動で更新します。これにより、複製グループ内のすべてのオブジェクトが更新されます。

注釈

ベストプラクティスとして、Snowflakeは、 REPLICATION_SCHEDULE パラメーターを使用して自動更新をスケジュールすることをお勧めします。 複製スケジュール (このトピック内)をご参照ください。

セカンダリ複製グループを更新します。

たとえば、複製グループ myrg 内のオブジェクトを更新するには、ターゲットアカウントから次のステートメントを実行します。

-- Only a user with the ACCOUNTADMIN role can execute the following SQL statement:
ALTER REPLICATION GROUP myrg REFRESH;
Copy

複製グループを表示する

複製グループを表示するには、 SHOW REPLICATION GROUPS を使用します。

現在のアカウントに関連付けられているすべてのプライマリおよびセカンダリ複製グループを表示するには、次の SQL ステートメントを実行します。

SHOW REPLICATION GROUPS;
Copy

コマンド出力:

+------------------+-------------------------------+--------------+------+-------------+---------+------------+------------------+--------------------------------------+------------------------------------------+--------------------+-----------------+----------------------+-----------------+------------+
| snowflake_region | created_on                    | account_name | name | type        | comment | is_primary | primary          | object_types                         | allowed_accounts                         | organization_name  | account_locator | replication_schedule | secondary_state | owner      |
+------------------+-------------------------------+--------------+------+-------------+---------+------------+------------------+--------------------------------------+------------------------------------------+--------------------+-----------------+----------------------+-----------------+------------+
| AWS_US_EAST_1    | 2022-01-14 16:59:01.462 -0800 | MYACCOUNT2   | MYRG | REPLICATION | NULL    | false      | MYORG.MYACCOUNT1 |                                      |                                          | MYORG              | MYACCTLOCATOR2  | 15 MINUTE            | SUSPENDED       |  NULL      |
| AWS_US_WEST_2    | 2022-01-14 16:56:10.497 -0800 | MYACCOUNT1   | MYRG | REPLICATION | NULL    | true       | MYORG.MYACCOUNT1 | DATABASES, SHARES                    | MYORG.MYACCOUNT2                         | MYORG              | MYACCTLOCATOR1  | 15 MINUTE            | NULL            |  MYROLE    |
+------------------+-------------------------------+--------------+------+-------------+---------+------------+------------------+--------------------------------------+------------------------------------------+--------------------+-----------------+----------------------+-----------------+------------+
Copy