web-dev-qa-db-ja.com

プライマリレプリカと非HAデータベースのリスト-フォワーダーレプリカを除く

任意のサーバーで書き込み可能なデータベースを尋ねる場合、以下のスニペットを使用して、PRIMARYレプリカデータベースとAGに参加していないデータベースを一覧表示しています。

Distributed Availability Group をデプロイしたので、何も動作しません!ローカルフォワーダーが sys.dm_hadr_availability_replica_states DMVのPRIMARYレプリカとして報告するため、私の古いクエリは、データベースが書き込み可能でない場合に書き込み可能であると通知しています。

このクエリをローカルフォワーダーレプリカのデータベースを除外するに変更するにはどうすればよいですか?

select 
    ars.role_desc
   ,ag_name = ag.[name]
   ,adc.[database_name]
from sys.availability_groups ag 
join sys.dm_hadr_availability_replica_states ars on ars.group_id = ag.group_id
join sys.availability_databases_cluster adc on adc.group_id = ag.group_id
where ars.is_local = 1
    and ars.role_desc = 'PRIMARY'
union all 
select 
    'LOCAL_ONLY'
   ,@@servername
   ,[name]
from sys.databases d 
where not exists (
    select 1 
    from sys.availability_databases_cluster adc
    where adc.[database_name] = d.[name]
);

...またはもっと簡単に...

すべてのローカルフォワーダーデータベースを一覧表示するにはどうすればよいですか?

2
Peter Vandivier

現在のサーバーのフォワーダーレプリカにあるすべてのデータベースを一覧表示するには...

select 
     dag.group_id
    ,dag.[name]
    ,dag.is_distributed
    ,fwd.replica_id
    ,fwd.replica_server_name
    ,adc.[database_name]
from sys.availability_groups dag 
join sys.availability_replicas fwd on fwd.group_id = dag.group_id
join sys.availability_groups ag on ag.name = fwd.replica_server_name
join sys.availability_databases_cluster adc on adc.group_id = ag.group_id
where dag.is_distributed = 1;

PRIMARYまたはローカルのみであるすべてのデータベースをリストし、フォワーダーデータベースを除外するには...

select 
    ars.role_desc
   ,ag_name = ag.[name]
   ,adc.[database_name]
from sys.availability_groups ag 
join sys.dm_hadr_availability_replica_states ars on ars.group_id = ag.group_id
join sys.availability_databases_cluster adc on adc.group_id = ag.group_id
where ars.is_local = 1
    and ars.role_desc = 'PRIMARY'
    and not exists (
        select 1
        from sys.availability_groups dag 
        join sys.availability_replicas fwd on fwd.group_id = dag.group_id
        join sys.availability_groups ag2 on ag2.name = fwd.replica_server_name
        join sys.availability_databases_cluster db on db.group_id = ag2.group_id
        where dag.is_distributed = 1
            and db.[database_name] = adc.[database_name]
)
union all 
select 
    'LOCAL_ONLY'
   ,@@servername
   ,[name]
from sys.databases d 
where not exists (
    select 1 
    from sys.availability_databases_cluster adc
    where adc.[database_name] = d.[name]
);
3
Peter Vandivier