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の一部ではなくなった場合、データベースをスキップできますか?
ありがとう!
exists
を sys.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
をクエリに追加できます。または、 このメソッド または同様のアプローチを使用できます。
次のクエリを使用して、特定のデータベースに特定のサーバーのレプリカがあるかどうかを確認できます。 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>'