AlwaysOn Availability Groups はプライマリと複数のセカンダリで構成することが可能です。
ミラーリングの場合は、ミラーサーバー (Availability Groups の セカンダリ) のデータベースを読み取りで使う場合はスナップショットを取得する必要があり、データベースをそのまま使用することはできませんでした。
直接アクセスしようとすると以下のようにエラーになりますので、
一度データベース スナップショットを作成して、そのスナップショットにアクセスをする必要がありました。
Availability Groups ではスナップショットを取得しなくてもセカンダリのデータベースにアクセスができるようになりました。
今回の投稿ではこのあたりをまとめてみたいと思います。
■セカンダリ ロールの接続モード
セカンダリロールの接続モードですが技術情報としては以下になると思います。
Read-Only Access to Secondary Replicas (AlwaysOn Availability Groups)
セカンダリ ロールの接続モードは以下の 3 種類があります
接続を禁止 | セカンダリ ロールのデータベースには接続を禁止 |
読み取りを目的とした接続のみを許可 | 読み取りのオプションを設定した接続であれば許可 |
すべての接続を許可 | オプションを指定しなくても接続を許可 |
[接続を禁止] とした場合には、Availability Groups に設定しているデータベースをセカンダリ ロールで接続しようとするとエラーとなります。
他の二つのモードの場合はセカンダリ ロールのデータベースに接続することが可能です。
[読み取りを目的とした接続のみを許可] と [すべての接続を許可] の違いですが、接続文字列に [ApplicationIntent] を指定しているかどうかになります。
[読み取りを目的とした接続のみを許可] とした場合は接続文字列に明示的に [ApplicationIntent] を設定する必要があります。
Using Connection String Keywords with SQL Server Native Client
そのため SNAC もこのキーワードに対応しているものを使用する必要があります。
Denali CTP3 に入っている SNAC であれば、ODBC の設定画面からも ApplicationIntent に対応しているのが確認できます。
# アプリケーションの目的が [ApplicationIntent] に該当します。
それでは ODBC 設定時のテスト接続を使用して実際に試してみたいと思います。
この状態でアプリケーションの目的を [READONLY] にして接続をしてみます。
この状態では読み取り専用を目的として接続をしても拒否されます。
次に [読み取りを目的とした接続のみを許可] に設定します。
この状態ではアプリケーションの目的を読み取りとして設定している場合のみ接続が許可されます。
そのため、ODBC の設定で [READWRITE] に設定している場合はアクセスが拒否されますが、
[すべての接続を許可] にした場合は [READWRITE] [READONLY] のどちらにしても接続が許可されます。
この設定を使用することで明示的に読み取り専用と宣言している接続以外を拒否することができるようになります。
# どういう場合に使うか / 使うことによる利点等はこの後調べないといけないのですが…。
これに伴ってコマンドラインから SQL を実行するツールである [SQLCMD] にも [-K] というオプションが追加されています。
[読み取りを目的とした~] となっているデータベースに接続をする場合には、[-K ReadOnly] というオプションを指定して SQLCMD を実行する必要があります。
テーブルの内容をテキストに出力する際に使用する [BCP] に関しても同様に[-K] が追加されています。
セカンダリを直接触ってテキストにデータを出力するのは Availability Groups を使用していると想定されるシナリオかもしれないですね。
# Availability Groups はセカンダリで COPY_ONLY のバックアップも取得ができますので、プライマリに負荷をかけないバックアップを取得することが可能となっています。
新しく追加された機能を最大限使用する場合には SNAC や各種ツールも最新を使う必要がありそうですね。