-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathAlwaysON Restart Endpoint
105 lines (95 loc) · 3.69 KB
/
AlwaysON Restart Endpoint
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
--if alwayson sync is very slow its worth to try to restart endpoint.
SET NOCOUNT ON;
DECLARE @EndpointName NVARCHAR(128);
DECLARE @PrimaryReplicaServerName NVARCHAR(128);
DECLARE @ReplicaServerName NVARCHAR(128);
DECLARE @Command NVARCHAR(MAX);
-- Find the endpoint name
SELECT @EndpointName = name
FROM sys.endpoints
WHERE type_desc = 'DATABASE_MIRRORING';
-- Check if the endpoint exists
IF @EndpointName IS NULL
BEGIN
PRINT 'No database mirroring endpoint found. This server might not be part of a Database Mirroring setup or Availability Group.';
END
ELSE
BEGIN
-- Get primary and secondary server names
DECLARE @AGInfo TABLE (
AGname NVARCHAR(128),
dns_name NVARCHAR(128),
replica_server_name NVARCHAR(128),
database_name NVARCHAR(128),
IsPrimaryServer BIT,
ReadableSecondary NVARCHAR(128),
Synchronous NVARCHAR(128),
failover_mode_desc NVARCHAR(128),
read_only_routing_url NVARCHAR(128),
availability_mode_desc NVARCHAR(128)
);
INSERT INTO @AGInfo
SELECT name AS AGname,
agl.dns_name,
replica_server_name,
ADC.database_name,
CASE
WHEN(primary_replica = replica_server_name)
THEN 1
ELSE 0
END AS IsPrimaryServer,
secondary_role_allow_connections_desc AS ReadableSecondary,
[availability_mode] AS [Synchronous],
failover_mode_desc,
read_only_routing_url,
availability_mode_desc
FROM master.sys.availability_groups Groups
LEFT JOIN master.sys.availability_replicas Replicas ON Groups.group_id = Replicas.group_id
LEFT JOIN master.sys.dm_hadr_availability_group_states States ON Groups.group_id = States.group_id
LEFT JOIN sys.availability_databases_cluster ADC ON ADC.group_id = Groups.group_id
LEFT JOIN sys.availability_group_listeners agl ON agl.group_id = groups.group_id;
-- Print the dynamic SQL statements for the primary replica
SELECT @PrimaryReplicaServerName = replica_server_name
FROM @AGInfo
WHERE IsPrimaryServer = 1;
IF @PrimaryReplicaServerName IS NOT NULL
BEGIN
PRINT '-- Connecting to Primary Replica: ' + @PrimaryReplicaServerName;
PRINT ':CONNECT ' + @PrimaryReplicaServerName;
PRINT 'WAITFOR DELAY ''00:00:05'''; -- 5 seconds delay
PRINT 'ALTER ENDPOINT [' + @EndpointName + '] STATE=STOPPED';
PRINT 'GO';
PRINT 'WAITFOR DELAY ''00:00:05'''; -- 5 seconds delay
PRINT 'ALTER ENDPOINT [' + @EndpointName + '] STATE=STARTED';
PRINT 'GO';
PRINT '-- Run this script on the Primary Replica';
PRINT '';
END
ELSE
BEGIN
PRINT 'Primary replica not found.';
END
-- Print the dynamic SQL statements for each secondary replica
DECLARE ReplicaCursor CURSOR FOR
SELECT DISTINCT replica_server_name
FROM @AGInfo
WHERE IsPrimaryServer = 0;
OPEN ReplicaCursor;
FETCH NEXT FROM ReplicaCursor INTO @ReplicaServerName;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT '-- Connecting to Secondary Replica: ' + @ReplicaServerName;
PRINT ':CONNECT ' + @ReplicaServerName;
PRINT 'WAITFOR DELAY ''00:00:05'''; -- 5 seconds delay
PRINT 'ALTER ENDPOINT [' + @EndpointName + '] STATE=STOPPED';
PRINT 'GO';
PRINT 'WAITFOR DELAY ''00:00:05'''; -- 5 seconds delay
PRINT 'ALTER ENDPOINT [' + @EndpointName + '] STATE=STARTED';
PRINT 'GO';
PRINT '-- Run this script on the Secondary Replica';
PRINT '';
FETCH NEXT FROM ReplicaCursor INTO @ReplicaServerName;
END;
CLOSE ReplicaCursor;
DEALLOCATE ReplicaCursor;
END;