Windows Server Failover Clusterのセットアップがあり、1つのDC、1つのプライマリサーバー、1つのセカンダリサーバーでSQL Serverサービスを使用しています。
SQL Server Management Studioの使用中に、[Always On High Availability]の[Show Dashboard]をクリックすると、次のエラーが表示されます。
常時オンのダッシュボードでエラーが発生しました
この問題を解決するには?
この問題は、ダッシュボードがrequired_copies_to_commit
に変更されたmaster.sys.availability_groups
dmvのrequired_synchronized_secondaries_to_commit
列を参照するクエリを実行することが原因です。
解決策はSSMSをアップグレードすることです(テストは17.4バージョンで行われます)。
SSMS 17.0がインストールされているマシンでこれを再試行する場合
同じエラーが発生します:
無効な列名
required_copies_to_commit
これは、17.0でダッシュボードを開いたときにクエリが異なるためです:
select * into #tmpag_availability_groups from master.sys.availability_groups
...
SELECT
CAST(
serverproperty(N'Servername')
AS sysname) AS [Server_Name],
AG.name AS [Name],
ISNULL(AG.automated_backup_preference, 4) AS [AutomatedBackupPreference],
ISNULL(AG.failure_condition_level, 6) AS [FailureConditionLevel],
ISNULL(AG.health_check_timeout, -1) AS [HealthCheckTimeout],
AR2.replica_metadata_id AS [ID],
ISNULL(arstates2.role, 3) AS [LocalReplicaRole],
ISNULL(agstates.primary_replica, '') AS [PrimaryReplicaServerName],
AG.group_id AS [UniqueId],
ISNULL(AG.basic_features, 0) AS [BasicAvailabilityGroup],
ISNULL(AG.db_failover, 0) AS [DatabaseHealthTrigger],
ISNULL(AG.dtc_support, 0) AS [DtcSupportEnabled],
ISNULL(AG.is_distributed, 1) AS [IsDistributedAvailabilityGroup],
ISNULL(AG.cluster_type, 0) AS [ClusterType],
ISNULL(AG.required_copies_to_commit, 0) AS [RequiredCopiesToCommit]
FROM
#tmpag_availability_groups AS AG
LEFT OUTER JOIN #tmpag_availability_group_states as agstates ON AG.group_id = agstates.group_id
INNER JOIN #tmpag_availability_replicas AS AR2 ON AG.group_id = AR2.group_id
INNER JOIN #tmpag_availability_replica_states AS arstates2 ON AR2.replica_id = arstates2.replica_id AND arstates2.is_local = 1
ORDER BY
[Name] ASC
...
存在しない列が使用されています
ISNULL(AG.required_copies_to_commit, 0) AS [RequiredCopiesToCommit]
SSMSの新しいバージョンの正しい列の代わりに:
ISNULL(AG.required_synchronized_secondaries_to_commit, 0) AS [RequiredSynchronizedSecondariesToCommit]
免責事項:バージョン17.1、17.2、17.3でも正しいダッシュボードが表示される場合があります。まだテストしていません
ダッシュボードが正しく開いているときにssms(17.4以降)によって実行されているクエリをトレースすると、このクエリが実行されます
select * into #tmpag_availability_groups from master.sys.availability_groups
...
SELECT
CAST(
serverproperty(N'Servername')
AS sysname) AS [Server_Name],
AG.name AS [Name],
ISNULL(AG.automated_backup_preference, 4) AS [AutomatedBackupPreference],
ISNULL(AG.failure_condition_level, 6) AS [FailureConditionLevel],
ISNULL(AG.health_check_timeout, -1) AS [HealthCheckTimeout],
AR2.replica_metadata_id AS [ID],
ISNULL(arstates2.role, 3) AS [LocalReplicaRole],
ISNULL(agstates.primary_replica, '') AS [PrimaryReplicaServerName],
AG.group_id AS [UniqueId],
CAST(ISNULL(AG.basic_features, 0) AS bit) AS [BasicAvailabilityGroup],
CAST(ISNULL(AG.db_failover, 0) AS bit) AS [DatabaseHealthTrigger],
CAST(ISNULL(AG.dtc_support, 0) AS bit) AS [DtcSupportEnabled],
CAST(ISNULL(AG.is_distributed, 0) AS bit) AS [IsDistributedAvailabilityGroup],
ISNULL(AG.cluster_type, 0) AS [ClusterType],
ISNULL(AG.required_synchronized_secondaries_to_commit, 0) AS [RequiredSynchronizedSecondariesToCommit]
FROM
#tmpag_availability_groups AS AG
LEFT OUTER JOIN #tmpag_availability_group_states as agstates ON AG.group_id = agstates.group_id
INNER JOIN #tmpag_availability_replicas AS AR2 ON AG.group_id = AR2.group_id
INNER JOIN #tmpag_availability_replica_states AS arstates2 ON AR2.replica_id = arstates2.replica_id AND arstates2.is_local = 1
ORDER BY
[Name] ASC
...
select * into #tmpag_availability_groups from master.sys.availability_groups
SSMSバージョン
(17.4)
補足として、これらの列の一部はsys.availability_groups
dmv reference に追加されていません。
結局、ダッシュボードは正しく開きます。
正しい列名が使用されているため
required_synchronized_secondaries_to_commit
クエリで正しい既存のDMV列を取得するには、SSMSの上位バージョン(17.4を使用した場合)にアップグレードする必要があります。