web-dev-qa-db-ja.com

セカンダリデータベースが可用性グループから削除されているかどうかを確認するSQLクエリ

1つのプライマリレプリカと1つのセカンダリレプリカを持つAGがあります。これらのデータベースレプリカからトランザクションログのバックアップをクエリし、それらをターゲットデータベースに復元するスクリプトを作成しました。

最近、1人のユーザーがAGから1つのセカンダリデータベースを削除し、ここで説明されているようにスタンドアロンデータベースとして使用し始めました https://docs.Microsoft.com/en-us/sql/database-engine/availability-groups/windows/remove-a-secondary-database-from-an-availability-group-sql-server?view = sql-server-2017 。ユーザーは、このデータベースのバックアップチェーンも開始しました。

セカンダリデータベースでリカバリフォークGUIDが変更されたため、スクリプトは復元に失敗しました。

データベースがAGを離れたかどうかを検出する方法はありますか?バックアップセットをクエリしているときにスクリプトで、AGの一部ではなくなった場合、データベースをスキップできますか?

ありがとう!

2
S.K.

existssys.dm_hadr_database_replica_states DMVとともに使用して、DBがAGにあるかどうかを確認できます。

SQL Serverのローカルインスタンスが可用性レプリカをホストしているAlways On可用性グループに参加している各データベースの行を返します。この動的管理ビューは、プライマリレプリカとセカンダリレプリカの両方の状態情報を公開します。セカンダリレプリカでは、このビューはサーバーインスタンス上のすべてのセカンダリデータベースの行を返します。プライマリレプリカでは、このビューは各プライマリデータベースの行と、対応するセカンダリデータベースの追加行を返します

これがクエリです:

if exists(
    select 
        DBName = db_name(s.database_id)
        ,s.is_local
        ,s.synchronization_state_desc
        ,s.synchronization_health_desc
    from sys.dm_hadr_database_replica_states s
    where db_name(s.database_id) = 'your_database'
    )
begin
--do something useful
end
else
begin
--exit, probably without error
end

2014+を使用していない場合は、セカンダリに対してクエリを実行する必要があります。ある場合は、s.is_primary_replica = 0をクエリに追加できます。または、 このメソッド または同様のアプローチを使用できます。

2
scsimon

次のクエリを使用して、特定のデータベースに特定のサーバーのレプリカがあるかどうかを確認できます。 WHERE句のプレースホルダーを置き換えて、チェックするデータベースとサーバーを指定し、プライマリで実行します。

SELECT 
  * 
FROM 
  sys.dm_hadr_availability_replica_states rs 
  JOIN sys.dm_hadr_database_replica_cluster_states dcs ON dcs.replica_id = rs.replica_id 
  JOIN sys.dm_hadr_availability_replica_cluster_states acs ON acs.replica_id = rs.replica_id 
WHERE 
  dcs.database_name = '<databasename>' 
  AND acs.replica_server_name = '<servername>'
1
Tony Hinkle