Wir haben einen Always On "Cluster", der aus 2 Servern besteht (es wird mehr geben), einer ist also PRIMARY und der andere ist (sind) SECONDARY . Die Idee war, SECONDARY als schreibgeschützte Replik zu widmen, damit es sich um einen Suchserver handelt.
Ich weiß, wie ConnectionString in C # festgelegt wird, damit das SECONDARY-Replikat verwendet wird - fügen Sie einfach hinzu ApplicationIntent=ReadOnly
.
Ich verstehe jedoch nicht, wie ich die SECONDARY aus einer gespeicherten Prozedur adressieren soll, wenn ich eine verteilte Abfrage verwende. Gibt es eine Möglichkeit, einige Parameter für die Abfrage festzulegen (z. B. WITH-Anweisungen oder ähnliches), sodass für die Abfrage nur das Replikat und nicht der PRIMARY-Knoten verwendet wird?
Die Sache ist, offensichtlich ist Server1 von Anfang an PRIMARY und Server2 ist SECONDARY, aber wenn Server1 ausfällt, ist Server2 PRIMARY und Server1 ist SECONDARY, nachdem es repariert wurde. Ich kann also nicht einfach den Namen des statischen Servers2 verwenden.
Bisher habe ich es geschafft, den Servernamen des aktuellen Replikats als Variable abzurufen und in EXEC zu verwenden:
-- find first available replica
DECLARE @replicaServer nvarchar(50)
SELECT TOP 1
@replicaServer = RCS.replica_server_name
FROM
sys.availability_groups_cluster AS AGC
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS RCS
ON RCS.group_id = AGC.group_id
INNER JOIN sys.dm_hadr_availability_replica_states AS ARS
ON ARS.replica_id = RCS.replica_id
INNER JOIN sys.availability_group_listeners AS AGL
ON AGL.group_id = ARS.group_id
WHERE ARS.role_desc = 'SECONDARY'
AND connected_state = 1
-- and query it
DECLARE @cmd nvarchar(MAX) = 'SELECT * FROM [' + @replicaServer + '].[somebase].[someschema].[sometable]'
EXEC (@cmd)
Aber das ist eine Schande, denke ich.