SQL Server 2012(Standard Edition)でのDBミラーリングの奇妙な問題に気づきました。ミラーリングがセットアップされ、正常に確立され、機能しています。証人はいません。
プリンシパルを再起動すると、すべてのデータベースがリカバリモードでスタックし、DBにアクセスできなくなります。ミラーでも同じことが起こります。サーバーを再起動すると、DBが回復できなくなります。リカバリから抜け出すには、エンドポイントを停止してから再起動する必要があります。私は以下を確認しました:
DBに再びアクセスできるようにするために、次のコードが実行されます。
ALTER ENDPOINT mirroring STATE = STOPPED
ALTER ENDPOINT mirroring STATE = STARTED
上記のクエリを実行すると、DBは通常の状態に戻ります。
起動エラーログ:
2016-04-03 14:03:24.900 spid18s Database Mirroring Transport is disabled in the endpoint configuration. 2016-04-03 14:03:30.240 spid28s The Database Mirroring endpoint is now listening for connections.
続いてデータベースミラーリングがアクティブになり、データベース 'DatabaseName'がプリンシパルコピーとしてアクティブになります。
上記のコードが実行された後:
2016-04-03 14:12:42.500 spid67 The Database Mirroring endpoint has stopped listening for connections.
停止しているため
2016-04-03 14:12:46.530 spid67 The Database Mirroring endpoint is now listening for connections.
開始しているため
この時点で、プリンシパルコピーが再び表示されるので、データベースミラーリングはデータベース 'DatabaseName'でアクティブになります。
前もって感謝します。
SQL Server Expressを使用して別のシステムを構築し、それをミラーリング監視サーバーとして構成することを強くお勧めします。次に、動作モードを「自動フェイルオーバーによる高安全性(同期)」に設定します。
このソリューションは、この問題を軽減します。デスクトップWindowsライセンスの費用が発生しますが、ご存じのとおり、SQL Server Expressの費用はかかりません。
私には、ミラーリングの設定方法に問題があるようです。
プリンシパルデータベースがあるサーバーで、以下のクエリを使用できます。
これにより、設定が完了したときにある程度の可視性が得られます。
--==============================================================================
-- query that shows the current state of each database in the mirroring
--==============================================================================
SELECT db_name(sd.[database_id]) AS [Database Name]
,sd.mirroring_state AS [Mirror State]
,sd.mirroring_state_desc AS [Mirror State]
,sd.mirroring_partner_name AS [Partner Name]
,sd.mirroring_role_desc AS [Mirror Role]
,sd.mirroring_safety_level_desc AS [Safety Level]
,sd.mirroring_witness_name AS [Witness]
,sd.mirroring_connection_timeout AS [Timeout(sec)]
FROM sys.database_mirroring AS sd
WHERE mirroring_guid IS NOT null
ORDER BY [Database Name];