現象
たとえば次のようなシナリオを考えてみます。
- Microsoft SQL Server 2012 または SQL Server 2014 を使用している。
- プライマリ レプリカで Service Broker が有効になっているデータベースがあります。
- Service Broker が有効になっているプライマリ サーバーにデータベースをバックアップし、それをセカンダリ サーバーに復元します。
- プライマリ サーバーとセカンダリ サーバー間の可用性グループを定義する一環として、新しい可用性グループ ウィザードを使用するか、次のコマンドを使用して、データベースを可用性グループに参加させようとします。
ALTER DATABASE <dbname> SET HADR AVAILABILITY GROUP = <agname>
このシナリオでは、次のエラーが SQL Server エラー ログに記録されます。
注
{
エラー: 3449、重大度: 21、状態: 1。
データベース (データベース ID 1) を回復するには、SQL Server をシャットダウンする必要があります。 データベースは、シャットダウンできなかったユーザー データベースまたはシステム データベースのいずれかです。 SQL Server を再起動します。 別の起動、修復または復元後にデータベースの回復に失敗した場合
サーバーのシャットダウンにより、SQL トレースが停止しました。 トレース ID = '1'。 これは単なる情報メッセージです。ユーザー操作は必要ありません。
}
原因
この問題は、Service Broker が有効なデータベースをバックアップしてセカンダリ サーバーに復元した場合に、復元されたデータベースの Service Broker が有効になっていないために発生します。 データベースは引き続き内部にサービス ブローカー ID を保持します。
セカンダリ サーバー上の復元されたデータベースを可用性グループに追加すると、サービス ブローカーが有効になります。 可用性データベースで同じ GUID が検出され、次のエラーが (サイレントに) 発生します。
9772 "同じ ID で有効な Service Broker が既に存在するため、データベース "<dbname>" の Service Broker を有効にできません。"
これにより、データベースが可用性グループに参加しているため、エラー 3449 が発生し、SQL Server が予期せずシャットダウンします。
解決策
この問題は、次の SQL Server の累積的な更新プログラムで最初に修正されました。
SQL Server 2014 用の累積的な更新プログラム 1 /en-us/help/2931693
SQL Server 2012 SP1 の累積的な更新プログラム 9 /en-us/help/2931078
SQL Server 用の累積的な更新プログラムについて
SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムを確認してください。
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。