From e17c3a2dad5d1841092abb69d69faac19bb0aa5e Mon Sep 17 00:00:00 2001 From: ypermitin Date: Wed, 13 Sep 2023 12:32:10 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=BF=D0=BB=D0=B8=D0=BA=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20AlwaysOn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Приостановка репликации для всех реплик на вторичном сервере - Возобновление репликации для всех реплик на вторичном сервере, у которых статус "Не синхронизируется" - Небольшие правки в документации к сервисной базе --- ...1\200\320\262\320\265\321\200\320\265.sql" | 47 ++++++++++++++++++ ...1\200\320\262\320\265\321\200\320\265.sql" | 48 +++++++++++++++++++ .../Service-Database/Readme.md | 2 +- 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 "SQL-Server-AlwaysOn/\320\222\320\276\320\267\320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \321\200\320\265\320\277\320\273\320\270\320\272\320\260\321\206\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\320\265\321\205 \321\200\320\265\320\277\320\273\320\270\320\272 \320\275\320\260 \320\262\321\202\320\276\321\200\320\270\321\207\320\275\320\276\320\274 \321\201\320\265\321\200\320\262\320\265\321\200\320\265.sql" create mode 100644 "SQL-Server-AlwaysOn/\320\236\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260 \321\200\320\265\320\277\320\273\320\270\320\272\320\260\321\206\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\320\265\321\205 \321\200\320\265\320\277\320\273\320\270\320\272 \320\275\320\260 \320\262\321\202\320\276\321\200\320\270\321\207\320\275\320\276\320\274 \321\201\320\265\321\200\320\262\320\265\321\200\320\265.sql" diff --git "a/SQL-Server-AlwaysOn/\320\222\320\276\320\267\320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \321\200\320\265\320\277\320\273\320\270\320\272\320\260\321\206\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\320\265\321\205 \321\200\320\265\320\277\320\273\320\270\320\272 \320\275\320\260 \320\262\321\202\320\276\321\200\320\270\321\207\320\275\320\276\320\274 \321\201\320\265\321\200\320\262\320\265\321\200\320\265.sql" "b/SQL-Server-AlwaysOn/\320\222\320\276\320\267\320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \321\200\320\265\320\277\320\273\320\270\320\272\320\260\321\206\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\320\265\321\205 \321\200\320\265\320\277\320\273\320\270\320\272 \320\275\320\260 \320\262\321\202\320\276\321\200\320\270\321\207\320\275\320\276\320\274 \321\201\320\265\321\200\320\262\320\265\321\200\320\265.sql" new file mode 100644 index 0000000..1c8d099 --- /dev/null +++ "b/SQL-Server-AlwaysOn/\320\222\320\276\320\267\320\276\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \321\200\320\265\320\277\320\273\320\270\320\272\320\260\321\206\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\320\265\321\205 \321\200\320\265\320\277\320\273\320\270\320\272 \320\275\320\260 \320\262\321\202\320\276\321\200\320\270\321\207\320\275\320\276\320\274 \321\201\320\265\321\200\320\262\320\265\321\200\320\265.sql" @@ -0,0 +1,47 @@ +/* +Возобновление остановленной ранее репликации для всех баз реплик на сервере в случаях: + * Статус "Не синхронизируется" + * У реплики имеются ранее принятые транзакции. Необходимо проверять, т.к. у реплик + в распределенных групп доступности статус "Синхронизировано" как у первичных баз. +Используется на вторичном сервере с репликами. +*/ + +DECLARE @databaseName sysname, + @sql nvarchar(max); + +DECLARE replicas_cursor CURSOR FOR +SELECT + adc.database_name +FROM sys.dm_hadr_database_replica_states AS dhdrs +INNER JOIN sys.availability_databases_cluster AS adc + ON dhdrs.group_id = adc.group_id AND + dhdrs.group_database_id = adc.group_database_id +INNER JOIN sys.availability_groups AS ag + ON ag.group_id = dhdrs.group_id +INNER JOIN sys.availability_replicas AS ar + ON dhdrs.group_id = ar.group_id AND + dhdrs.replica_id = ar.replica_id +WHERE 1 = 1 + AND dhdrs.synchronization_state_desc IN ( + 'NOT SYNCHRONIZING' -- База не синхронизируется + ) + -- У реплик должно быть заполнено поле last_received_lsn + AND dhdrs.last_received_lsn is not null; +OPEN replicas_cursor; + +FETCH NEXT FROM replicas_cursor INTO @databaseName; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT @databaseName; + + SET @sql = ' +USE [master]; +ALTER DATABASE [' + @databaseName + '] SET HADR RESUME;' + + EXEC sp_executesql @sql + + FETCH NEXT FROM replicas_cursor INTO @databaseName; +END +CLOSE replicas_cursor; +DEALLOCATE replicas_cursor; \ No newline at end of file diff --git "a/SQL-Server-AlwaysOn/\320\236\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260 \321\200\320\265\320\277\320\273\320\270\320\272\320\260\321\206\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\320\265\321\205 \321\200\320\265\320\277\320\273\320\270\320\272 \320\275\320\260 \320\262\321\202\320\276\321\200\320\270\321\207\320\275\320\276\320\274 \321\201\320\265\321\200\320\262\320\265\321\200\320\265.sql" "b/SQL-Server-AlwaysOn/\320\236\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260 \321\200\320\265\320\277\320\273\320\270\320\272\320\260\321\206\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\320\265\321\205 \321\200\320\265\320\277\320\273\320\270\320\272 \320\275\320\260 \320\262\321\202\320\276\321\200\320\270\321\207\320\275\320\276\320\274 \321\201\320\265\321\200\320\262\320\265\321\200\320\265.sql" new file mode 100644 index 0000000..d2381b0 --- /dev/null +++ "b/SQL-Server-AlwaysOn/\320\236\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260 \321\200\320\265\320\277\320\273\320\270\320\272\320\260\321\206\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\320\265\321\205 \321\200\320\265\320\277\320\273\320\270\320\272 \320\275\320\260 \320\262\321\202\320\276\321\200\320\270\321\207\320\275\320\276\320\274 \321\201\320\265\321\200\320\262\320\265\321\200\320\265.sql" @@ -0,0 +1,48 @@ +/* +Остановка репликации для всех баз реплик на сервере в случаях: + * Статус "Синхронизируется" или "Синхронизировано" + * У реплики имеются ранее принятые транзакции. Необходимо проверять, т.к. у реплик + в распределенных групп доступности статус "Синхронизировано" как у первичных баз. +Используется на вторичном сервере с репликами. +*/ + +DECLARE @databaseName sysname, + @sql nvarchar(max); + +DECLARE replicas_cursor CURSOR FOR +SELECT + adc.database_name +FROM sys.dm_hadr_database_replica_states AS dhdrs +INNER JOIN sys.availability_databases_cluster AS adc + ON dhdrs.group_id = adc.group_id AND + dhdrs.group_database_id = adc.group_database_id +INNER JOIN sys.availability_groups AS ag + ON ag.group_id = dhdrs.group_id +INNER JOIN sys.availability_replicas AS ar + ON dhdrs.group_id = ar.group_id AND + dhdrs.replica_id = ar.replica_id +WHERE 1 = 1 + AND dhdrs.synchronization_state_desc IN ( + 'SYNCHRONIZING', -- Состояние "Синхронизируется", для обычных групп доступности + 'SYNCHRONIZED' -- Состояние "Синхронизировано", для распределенных групп доступности + ) + -- У реплик должно быть заполнено поле last_received_lsn + AND dhdrs.last_received_lsn is not null; +OPEN replicas_cursor; + +FETCH NEXT FROM replicas_cursor INTO @databaseName; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT @databaseName; + + SET @sql = ' +USE [master]; +ALTER DATABASE [' + @databaseName + '] SET HADR SUSPEND;' + + EXEC sp_executesql @sql + + FETCH NEXT FROM replicas_cursor INTO @databaseName; +END +CLOSE replicas_cursor; +DEALLOCATE replicas_cursor; \ No newline at end of file diff --git a/SQL-Server-Maintenance/Service-Database/Readme.md b/SQL-Server-Maintenance/Service-Database/Readme.md index 9b010af..afd4ac0 100644 --- a/SQL-Server-Maintenance/Service-Database/Readme.md +++ b/SQL-Server-Maintenance/Service-Database/Readme.md @@ -790,7 +790,7 @@ EXECUTE [dbo].[sp_ClearFiles] ```sql DECLARE @cutoffDate datetime = DATEADD(week, -4, GETDATE()); -EXECUTE [dbo].[sp_ClearFiles] +EXECUTE [SQLServerMaintenance].[dbo].[sp_ClearFiles] -- Каталог для очистки. Обязательный параметр. @folderPath = 'C:\Backup' -- Расширение файлов для удаления. Обязательный параметр.