任意のサーバーで書き込み可能なデータベースを尋ねる場合、以下のスニペットを使用して、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]
);
...またはもっと簡単に...
すべてのローカルフォワーダーデータベースを一覧表示するにはどうすればよいですか?
現在のサーバーのフォワーダーレプリカにあるすべてのデータベースを一覧表示するには...
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]
);