SQL Server 2022 CTP 2.0 時点の情報となり、今後の Preview / 一般提供開始時には変更されている可能性もあります。
SQL Server 2022 では、包含可用性グループ (Containded Availaiblity Group) という機能が追加されました。
従来の可用性グループは、「ユーザーデータベースのみ同期する機能」となっていたため、システムデータベースに含まれるログインや SQL Agent ジョブの情報は、グループ内の各 SQL Server に同期することができず、サーバーごとに同一の設定を反映させる必要がありました。
SQL Server 2022 で追加される包含可用性グループでは、可用性グループ レベルでのメタデータ オブジェクト (ユーザー、ログイン、アクセス許可、SQL Agent ジョブなど) をグループ内の各サーバーで同期することができるようになり、従来の可用性グループでは個別に作成が必要であった、システムデータベースに含まれているオブジェクトの一部を同期対象とすることができるようになります。
包含可用性グループについて
包含可用性グループは SQL Server では、2022 で追加された機能となりますが、実際のはそれより前に、自分で導入することができる他の SQL Server ベースの環境でも類似または同様の機能の導入が行われていました。
一番最初に追加されたのは、SQL Server 2019 の Big Data Cluster のマスターインスタンスを可用性グループにした時の構成になると思います。
他にも Azure Arc Enabled SQL Managed Instance でも使用されています。
当初は replicated master / msdb のような言われ方をしていたと思うのですが、現在は包含可用性グループとなっています。
基本的な考え方としては次のようになります。
- master / msdb はシステムデータベースの他に、可用性グループ用に各可用性グループ単位に master / model を作成する
- 可用性グループリスナーまたは、可用性グループ内のデータベースに「明示的に」接続した場合には、可用性グループ内の master / model にを利用した操作とする。
包含可用性グループを作成すると、可用性グループごとに「<可用性グループ名>_master」「<可用性グループ名>_msdb」という名称の同期されたデータベースが作成されます。
リスナーまたは、可用性グループ内のデータベースに明示的に接続した場合には、可用性グループ内の master / msdb がシステムデータベースのようにふるまい、それ以外の接続方法は、従来のシステムデータベースが使用されるという仕組みとなります。
そのため、「可用性グループ内の全ノードに配布するログイン / SQL Agent ジョブ」を作成したい場合には、上記の可用性グループ内のシステムデータベースが使用される接続方法で接続をして操作を行う必要があります。(SSMS からの GUI 操作についても、接続時にリスナーまたは明示的な DB 指定をしておけば、包含可用性グループ内の操作になります)
リスナーに接続した場合と、DB 名を明示的に指定せず、サーバーに接続した場合の違いが次の画像となります。
リスナーを使用して可用性グループに接続した場合、AG01_master / AG01_msdb は見えない状態で接続が行われています。この状態が包含可用性グループへの接続となり、master / msdb に操作した内容は可用性グループ内の AG01_master / AG01_msdb に実施されます。
データベース名を明示的に指定せずにサーバーに接続した場合は、包含可用性グループには接続が行われないため、従来通りすべてのデータベースが確認できます。
ジョブについても設定内容が違っていますね。
包含可用性グループ内に作成したジョブは、包含可用性グループに接続している場合にのみ認識されていますが、通常の接続のジョブには、包含可用性グループに作成したジョブは認識されていません。(その逆にもなっており、通常のジョブは包含可用性グループ内では認識されていません)
包含可用性グループオのジョブについては、「プライマリで実行されるジョブ」として作成されるのではなく、指定したジョブが各サーバーで動作しますので「プライマリまたはセカンダリでのみ実行したい」という要望があるのであれば、ステップ内で自分でそのような制御を行う必要があると思います。
冒頭に記載した
- master / msdb はシステムデータベースの他に、可用性グループ用に各可用性グループ単位に master / model を作成する
- 可用性グループリスナーまたは、可用性グループ内のデータベースに「明示的に」接続した場合には、可用性グループ内の master / model にを利用した操作とする。
を意識しておくと活用方法の検討がいろいろとできるのではないでしょうか。
包含可用性グループの設定方法
包含可用性グループの設定はシンプルで、「可用性グループの作成時」に、包含データベース用の設定を有効にすることで利用することができます。
可用性グループ作成時にのみ設定が可能で、作成後に包含可用性グループに変更することはできません。
2022 では、CREATE AVAILABILITY GROUP に CONTAINED / REUSE_SYSTEM_DATABASES が追加されており、上記の GUI のオプションはこれらの設定が使用されています。
REUSE_SYSTEM_DATABASES は可用性グループを削除した後に、再度その可用性グループのシステムデータベースを再利用する際に使用するものとなるので、新規作成時には使用することはないかと。
包含可用性グループの制限
包含可用性グループですが設定されているデータベースにはいくつかの機能制限が発生し、Not supported に制限が記載されています。
具体的には次のような機能がサポートされません。
- すべての種類のレプリケーション
- 分散型可用性グループ
- ターゲットデータベースが包含可用性グループにある場合のログ配布
これらの機能と相互運用する場合には、包含可用性グルーの利用は見送る必要があるようです。
包含可用性グループは、従来までの可用性グループの課題であったシステムオブジェクトの連携を可能とし、各サーバーに対して、同一の設定を手動で実施する手間を削減することができます。
利用者が「包含可用性グループに対して操作をしている」ことを意識して、システムオブジェクトの作成を実施する必要はありますが、ログインやジョブのメンテナンスが頻繁に発生する環境では有益に活用することができるのではないでしょうか。