kt.log

How to setup Azure SQL Database Cross-subscription geo-replication

Azure SQL Database の サブスクリプション間 geo レプリケーションの設定方法

Azure SQL Database から Azure SQL Database へデータをコピーする方法は複数あります。

  1. Azure Data Factory の Copy Activity によるコピー + スケジュールトリガー
  2. Azure Data Factory の 変更データキャプチャ (プレビュー)
  3. Azure SQL Database で 別のデータベースに同期
  4. Azure SQL Database で geo レプリカの作成

これらの方式をメリット・デメリットで比較すると、以下の通りです。

# 方式 メリット デメリット
1 ADF の Copy Activity 簡単
比較的低コスト
データセットはテーブル単位で指定する必要がある。
コピー先にデータベースだけでなくスキーマまで作成されている必要がある。
スキーマ変更に人手で追従する必要がある。
2 ADF の変更データキャプチャ 簡単 CDC 対象の列に dbo. を指定できず、変更管理用のテーブルを見つけて適切な列を選択する必要がある。
SQL Server 系の知識が無いと使いこなすのは難しい。
プレビューのためドキュメント・サポートともに不足かつ SLA 無し。
Spark クラスターが処理をするため、高コスト。
3 Azrue SQL DB で 別の DB に同期 簡単
低コスト
同期対象をテーブル単位で指定する必要がある (「すべて選択」することは可能)。
スキーマ変更に人手で追従する必要がある。
4 Azure SQL DB で geo レプリカ作成 簡単
低コスト
データベース単位での同期
バッチのような動作はできない。
サブスクリプション間での geo レプリカは別手順

したがって、Azure SQL Database から Azure SQL Database へのデータのコピーにまず検討したいのは geo レプリカ ということになります。

ただ、デメリットの中にも記した通り、 サブスクリプション間での geo レプリカは通常とは異なる手順 となります。同一サブスクリプションでの geo レプリカとの違いは以下の通りです。

# 項目 同一サブスクリプション サブスクリプション間
1 Azure Portal からの設定 不可
2 SQL の使用 無し あり
3 必要なツール Web ブラウザ SSMS / ADS / VS Code
4 DB 上での管理者権限 不要 必要
5 ファイアウォールの設定 不要 必要
6 プライベートエンドポイントの考慮 不要 必要
7 master データベースの変更 明示的な変更は無し あり

作業者のスキル、ツールのインストール、データベース管理者との調整、ネットワークへの考慮といった観点でハードルが高いのが、サブスクリプション間 geo レプリケーションということになります。

本記事では、サブスクリプション間 geo レプリケーション の手順について、公式ドキュメント よりも少し平易に、そして少し詳しく解説します。

前提

  • Microsoft Azure に利用可能なサブスクリプションを持っている
  • SSMS (SQL Server Management Studio), ADS (Azure Data Studio), Visual Studio Code のいずれかがインストールされ、Azure SQL Database への接続が可能な環境がある

手順

手順は以下の通りです。

1
2
3
4
5
6
7
8
9
10
0. 必要な環境があることを確かめる
1. ファイアウォールにおいて接続元クライアントコンピューターの IP アドレスを許可する
2. プライマリ サーバーに geo レプリケーション セットアップ専用 ログインを作成する
3. プライマリ サーバーにログイン用のユーザーを作成する
4. プライマリ サーバーで作成したログイン用ユーザーの SID 値を取得する
5. プライマリ データベース でログインユーザーを作成する
6. プライマリ サーバーで作成したユーザーを `db_owner` ロールに追加する
7. セカンダリ サーバーにプライマリ サーバーと同じログインを作成する
8. セカンダリ サーバーにログイン用のユーザーを作成する
9. プライマリ サーバーで セカンダリ サーバーをセカンダリとして設定する

0. 必要な環境があることを確かめる

本記事では、以下の環境を想定して解説を行います。値は基本的にダミーですので、適宜読み替えを行ってください。

# プライマリサーバー セカンダリサーバー
1 サブスクリプション ID 11111111-1111-1111-1111-111111111111 22222222-2222-2222-2222-222222222222
2 Azure SQL Database サーバー sql-my-primary-server.database.windows.net sql-my-secondary-server.database.windows.net
3 データベース sql-source-db 無し
4 プライベートエンドポイントの使用有無 無し 無し
5 管理者ユーザーの利用権限 あり あり

なお、本記事ではプライマリ サーバーおよびセカンダリ サーバーのいずれもシングル データベースを使用することを想定しています。プライマリ サーバーがエラスティック プールである場合については、適宜注釈を入れることで解説いたします。(この場合に注意するのは 手順9 のみです。)

1. ファイアウォールにおいて接続元クライアントコンピューターの IP アドレスを許可する

両者のサーバーに関して、クライアントコンピューターからのネットワーク接続を許可します。

ドキュメント には SQL による IP アドレスの確認手順が示されていますが、Azure Portal > SQL Server > セキュリティ > ファイアウォール規則 から クライアント IPv4 アドレス (xxx.xxx.xxx.xxx) の追加 をクリックして 保存 をクリックするだけで実現できます。

2. プライマリ サーバーに geo レプリケーション セットアップ専用 ログインを作成する

プライマリ サーバー で作業を開始します。

# 項目
1 作業サブスクリプション プライマリ 11111111-1111-1111-1111-111111111111
2 作業サーバー プライマリ sql-my-primary-server.database.windows.net
3 作業データベース master
4 作業ユーザー SQLサーバー管理者 sqladminuser

以下のクエリを実行します。

1
create login geodrsetup with password = 'ComplexPassword01';
  • ログイン名 geodrsetup を任意の名前に変更することは可能です。本記事では変更しないことを想定して解説を行います。
  • パスワード ComplexPassword01 は任意のパスワードに置き換えて実行します。

クエリの実行結果は以下のようになります。

1
2
3
Started executing query at Line 1
Commands completed successfully.
Total execution time: 00:00:00.050

3. プライマリ サーバーにログイン用のユーザーを作成する

環境は 手順 2 と同様です。

# 項目
1 作業サブスクリプション プライマリ 11111111-1111-1111-1111-111111111111
2 作業サーバー プライマリ sql-my-primary-server.database.windows.net
3 作業データベース master
4 作業ユーザー SQLサーバー管理者 sqladminuser

以下のクエリを実行します。

1
2
create user geodrsetup for login geodrsetup;
alter role dbmanager add member geodrsetup;

クエリの実行結果は以下のようになります。

1
2
3
Started executing query at Line 1
Commands completed successfully.
Total execution time: 00:00:00.015

4. プライマリ サーバー で作成したログイン用ユーザーの SID 値を取得する

環境は手順 2,3 と同じです。

# 項目
1 作業サブスクリプション プライマリ 11111111-1111-1111-1111-111111111111
2 作業サーバー プライマリ sql-my-primary-server.database.windows.net
3 作業データベース master
4 作業ユーザー SQLサーバー管理者 sqladminuser

以下のクエリを実行します。

1
select sid from sys.sql_logins where name = 'geodrsetup';

クエリの実行結果は以下のようになります。以下に示す sid はダミーです。

1
2
3
Started executing query at Line 1
(1 row affected)
Total execution time: 00:00:00.148
sid
1 0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF

sid の値をコピーしてテキストエディタ等で一時的に保管してください。

5. プライマリ データベース でログインユーザーを作成する

作業データベースのみ変更します。

# 項目
1 作業サブスクリプション プライマリ 11111111-1111-1111-1111-111111111111
2 作業サーバー プライマリ sql-my-primary-server.database.windows.net
3 作業データベース プライマリ sql-source-db
4 作業ユーザー SQLサーバー管理者 sqladminuser

以下のクエリを実行します。

1
create user geodrsetup for login geodrsetup;

クエリの実行結果は以下のようになります。

1
2
3
Started executing query at Line 1
Commands completed successfully.
Total execution time: 00:00:00.127

6. プライマリ サーバーで作成したユーザーを db_owner ロールに追加する

手順 5 と同じ環境です。

# 項目
1 作業サブスクリプション プライマリ 11111111-1111-1111-1111-111111111111
2 作業サーバー プライマリ sql-my-primary-server.database.windows.net
3 作業データベース プライマリ sql-source-db
4 作業ユーザー SQLサーバー管理者 sqladminuser

以下のクエリを実行します。

1
alter role db_owner add member geodrsetup;

クエリの実行結果は以下のようになります。

1
2
3
Started executing query at Line 1
Commands completed successfully.
Total execution time: 00:00:00.011

7. セカンダリ サーバーにプライマリ サーバーと同じログインを作成する

セカンダリサーバーでの作業に移ります。

# 項目
1 作業サブスクリプション セカンダリ 22222222-2222-2222-2222-222222222222
2 作業サーバー セカンダリ sql-my-secondary-server.database.windows.net
3 作業データベース master
4 作業ユーザー SQLサーバー管理者 sqladminuser

以下のクエリを実行します。
パスワード ComplexPassword01 は任意の文字列で置き換えます。
sid は 手順4 で取得したものを貼り付けます。

1
create login geodrsetup with password = 'ComplexPassword01', sid=0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF;

クエリの実行結果は以下のようになります。

1
2
3
Started executing query at Line 1
Commands completed successfully.
Total execution time: 00:00:00.042

8. セカンダリ サーバーにログイン用のユーザーを作成する

作業 7 と同じ環境です。

# 項目
1 作業サブスクリプション セカンダリ 22222222-2222-2222-2222-222222222222
2 作業サーバー セカンダリ sql-my-secondary-server.database.windows.net
3 作業データベース master
4 作業ユーザー SQLサーバー管理者 sqladminuser

以下のクエリを実行します。

1
2
create user geodrsetup for login geodrsetup;
alter role dbmanager add member geodrsetup;

クエリの実行結果は以下のようになります。

1
2
3
Started executing query at Line 1
Commands completed successfully.
Total execution time: 00:00:00.021

9. プライマリ サーバーで セカンダリ サーバーをセカンダリとして設定する

再び プライマリ サーバー に移ります。

# 項目
1 作業サブスクリプション プライマリ 11111111-1111-1111-1111-111111111111
2 作業サーバー プライマリ sql-my-primary-server.database.windows.net
3 作業データベース master
4 作業ユーザー geo レプリカ設定ユーザー geodrsetup

このとき、手順 3 で作成したユーザー geodrsetup で プライマリ サーバー に接続します。これまで sqladminuser で作業していた接続は使用しません。新規の接続を使います。
接続の際には SQL Login を使用します。他の認証方式、例えば Azure Active Directory 等ではこの手順に失敗するため、注意してください。

また、プライマリ サーバーにおける geo レプリケーション対象のデータベースがエラスティック プール上に存在する場合、セカンダリ サーバーにも 同名の エラスティック プールが予め作成されている必要があります。
セカンダリ サーバー上に用意するのはエラスティック プールのみです。セカンダリ サーバー上に予めデータベースを作らないのは、シングル サーバーの場合もエラスティック プールの場合も同じです。
geo レプリケーションはエラスティック プール単位で行われます。(例えば、プライマリ サーバーのエラスティック プールにデータベースが N個ある場合、セカンダリ サーバーの同名のエラスティック プールにも N個のデータベースがそれぞれ同名で生成されます。)

以下のクエリを実行します。

1
alter database [sql-source-db] add secondary on server [sql-my-secondary-server.database.windows.net];

クエリの実行結果は以下のようになります。

1
2
3
Started executing query at Line 1
Commands completed successfully.
Total execution time: 00:00:02.173

これで、サブスクリプション間 geo レプリケーション の設定が完了しました。Azure Portal 上からは、通常の geo レプリケーションと同じように表示されているはずです。

まとめ

サブスクリプション間 geo レプリケーション の手順について、公式ドキュメント よりも少し詳しい解説を行いました。

重要なのは、正しい環境で正しい手順を踏むことです。特に ADS や SSMS から接続するユーザー名や認証方式に気をつけてください。
これを間違えると

1
2
3
4
Started executing query at Line 1
Msg 40647, Level 16, State 1, Line 1
Subscription '11111111-1111-1111-1111-111111111111' does not have the server 'sql-my-secondary-server.database.windows.net'.
Total execution time: 00:00:00.308

といったエラーとなり、エラーの内容からは原因の特定が難しくなります。

サブスクリプション間 geo レプリケーション を設定して、さらなるデータの利活用に役立ててください。

See also