web-dev-qa-db-ja.com

奇妙なデータベースミラーリングの問題

SQL Server 2012(Standard Edition)でのDBミラーリングの奇妙な問題に気づきました。ミラーリングがセットアップされ、正常に確立され、機能しています。証人はいません。

プリンシパルを再起動すると、すべてのデータベースがリカバリモードでスタックし、DBにアクセスできなくなります。ミラーでも同じことが起こります。サーバーを再起動すると、DBが回復できなくなります。リカバリから抜け出すには、エンドポイントを停止してから再起動する必要があります。私は以下を確認しました:

  1. ミラーリングは通常のセットアップ中に機能しています。
  2. アカウントには、ミラーリングを確立する権限があります。
  3. すべてのDBには、saである所有者がいます。
  4. SQL Serverはドメインアカウントで実行されており、所有者はサーバーのsysadminです。また、エンドポイントへの明示的な許可/承認も与えました。
  5. エラーログ(起動)は、エンドポイントが起動したことを示しています。

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'でアクティブになります。

前もって感謝します。

4
Subhash Pant

SQL Server Expressを使用して別のシステムを構築し、それをミラーリング監視サーバーとして構成することを強くお勧めします。次に、動作モードを「自動フェイルオーバーによる高安全性(同期)」に設定します。

このソリューションは、この問題を軽減します。デスクトップWindowsライセンスの費用が発生しますが、ご存じのとおり、SQL Server Expressの費用はかかりません。

1
Sean Perkins

私には、ミラーリングの設定方法に問題があるようです。

プリンシパルデータベースがあるサーバーで、以下のクエリを使用できます。

これにより、設定が完了したときにある程度の可視性が得られます。

--==============================================================================
-- 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];

これは出力の例です enter image description here

0