Порционный шринк базы

28.03.24

База данных - Администрирование СУБД

Скрипт позволяет высвобождать место в операционную систему, занятое файлом базы MS SQL в итерациях с заданным количеством мегабайт

О шринке расписывать не буду, яндекс полон ответов "Для чего, зачем и как".

Готовых скриптов порционного шринка на просторах я не обнаружил, прошу не кидать тапками, если все же такие есть.

Проблемы полноценного шринка базы:

1. Непонятно, сколько времени это займет с учетом нагрузки на базу (если приходится это делать на активно используемой базе)

2. Освобождение места произойдет непосредственно при окончании шринка.

Данный скрипт обрабатывает файл базы данных в цикле, итерация которого шринкует базу до определенного размера, вычисленного из доступного места в базе с учетом заданного размера порции шринка.

Скрипт выводит информацию о прогрессе через print, оповещая о том, с какого размера база шринкуется и до какого, скорость обработки порции, прогнозируемая скорость для обработки всего доступного в базе пространства, количество Mb, оставшиеся для шринка.

Сам скрипт:

use YourBase -- Выберите базу для шринка

set NOCOUNT ON;

DECLARE @PortionInMB INT = 1000 -- Замените на нужное значение, количество МБ. освобождаемое за итерацию
DECLARE @StopSizeInMB INT = 1000 -- Количество свободного места в базе, при котором нужно прекратить шринк
DECLARE @CurrentSizeInMB INT
DECLARE @FreeSpaceInMB INT
DECLARE @CurrentDBName nvarchar(64) = DB_NAME()
DECLARE @MomentumSize INT
DECLARE @StartTime datetime2
DECLARE @EndTime datetime2
DECLARE @IterationTime INT
DECLARE @RequiredSeconds INT

SET @FreeSpaceInMB = (select convert(decimal(12,2),round((a.size-fileproperty(a.name,'SpaceUsed'))/128.000,2)) as FreeSpaceMB from dbo.sysfiles a where status & 64 = 0)

WHILE @FreeSpaceInMB > @StopSizeInMB
BEGIN
    SET @CurrentSizeInMB = (select convert(decimal(12,2),round(a.size/128.000,2)) as FileSizeMB from dbo.sysfiles a where status & 64 = 0)
    SET @FreeSpaceInMB = (select convert(decimal(12,2),round((a.size-fileproperty(a.name,'SpaceUsed'))/128.000,2)) as FreeSpaceMB from dbo.sysfiles a where status & 64 = 0)
	SET @MomentumSize = @CurrentSizeInMB - @PortionInMB

    IF @FreeSpaceInMB > @StopSizeInMB
    BEGIN
		SET @StartTime = CURRENT_TIMESTAMP
		print CONVERT(VARCHAR(100), CURRENT_TIMESTAMP) + ': Start shrink iteration for database [' + @CurrentDBName + ']. From ' + CONVERT(VARCHAR(100), @CurrentSizeInMB) 
			+ ' to ' + CONVERT(VARCHAR(100), @MomentumSize) + '. Remains: ' + CONVERT(VARCHAR(100), @FreeSpaceInMB - @PortionInMB - @StopSizeInMB) + ' Mb.'
		RAISERROR( '',0,1) WITH NOWAIT
		DBCC SHRINKFILE (@CurrentDBName , @MomentumSize)
		SET @EndTime = CURRENT_TIMESTAMP
		SET @RequiredSeconds = (@FreeSpaceInMB - @StopSizeInMB) / @PortionInMB * datediff(s, @StartTime, @EndTime)
		print 'Iteration successfull on ' + CONVERT(VARCHAR(100), datediff(s, @StartTime, @EndTime)) + ' sec. The required time for all iteration: '
			+ CONVERT(VARCHAR(100), @RequiredSeconds) + ' sec. Completion time: ' + CONVERT(VARCHAR(100), DATEADD(s,@RequiredSeconds,CURRENT_TIMESTAMP))
		RAISERROR( '',0,1) WITH NOWAIT
    END
    ELSE
    BEGIN
        BREAK;
    END
END
 
 Выводимые данные


Нюансы:

Если в вашей базе больше одной файловой группы, скрипт не сработает, необходимо прицелиться в необходимый файл, данные по которому получаются в скрипте из dbo.sysfiles, можно либо отобрать топ по размеру, отобрать по имени и т.д.

RAISERROR использован для оперативного получения информации, переданной в print.

скрипт шринк mssql dba sql порционный шринк shrinkfile shrinkdatabase

См. также

Нестандартное решение пересчета итогов

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Статья для тех, кто столкнулся с необходимостью пересчета итогов для "больших таблиц" и нет возможности поставить на паузу ИБ для проведения работ.

25.04.2024    511    virustam    27    

5

Идентификация пользователя не выполнена

Администрирование СУБД Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Иногда в конфигурации 1С:Бухгалтерский учет v3.0 возникает ситуация, когда программа всем пользователям выдает предупреждение, что авторизация не выполнена и работа программы будет завершена. Данная инструкция позволяет решить возникшую проблему.

24.04.2024    251    Yan_Malyakov    0    

2

Устранение ошибки выполнения скрипта "Создать сервис RAGENT" в ЦКК

Администрирование СУБД Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В статье показано, как устранить ошибку выполнения скрипта "Создать сервис RAGENT" в системах 1С:Центр контроля качества или в 1С:Центр автоматизации. Будет полезна администраторам ЦКК и ЦА, которые только начали знакомство с этими системами.

18.04.2024    348    artemusII    0    

7

Долгая реструктуризация, замеры времени и очистка Ветис. Розница 2.3

HighLoad оптимизация Администрирование СУБД Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Бесплатно (free)

При подготовке к обновлению возникли проблемы на стадии тестирования и исправления базы данных, также при создании файлов РИБ для магазинов.

16.04.2024    359    xKaskadx    4    

1

Установка и получение лицензии на базовую конфигурацию 1С на Mac OS

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Установить купленную базовую конфигурацию 1С и получить лицензию на MAC OS не так просто, как кажется на первый взгляд и как хотелось бы. Официально в системных требованиях на базовую конфигурации 1С пишет всякие виндовсы и пару-тройку линуксов. МакОс там нет. В статье расскажу, как все-таки поставить на Мак базовую конфигурацию 1С.

11.04.2024    391    pahmutov    0    

2

Установка тонкого клиента 1С на Rasbian (Raspberry Pi 5)

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

После приобретения Raspberry Pi 5 решил проверить, есть ли возможность использования устройства для организации тонкого клиента. В результате столкнулся с особенностью установки 1С: Предприятие 8.3.23 на Raspbian, решением которой я хочу поделиться с сообществом.

07.04.2024    736    Bessome    4    

5

Создаем сценарии обслуживания SQL в Центре Контроля Качества 1С (Центр Администрирования)

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Данная статья научит вас, как создавать скрипты обслуживания MS SQL для Центра Контроля Качества (ЦКК) или Центра Администрирования (ЦА).

20.03.2024    799    Silenser    0    

5

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Перенос данных 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    6255    dsdred    59    

86
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. nvv1970 11.04.24 08:59 Сейчас в теме
Есть какая-то статистика, сколько времени занимает шринк относительно "обычного", когда освобождают сразу 50-90% базы? Т.е. это ускоряет или замедляет общий процесс?
2. Garilia 27 14.04.24 00:49 Сейчас в теме
(1) для моих кейсов порционный шринк всегда оказывался быстрее, да и в случае необходимости прервать операцию - прогресс шринка теряет только последнюю запущенную итерацию. На днях сравню время выполнения высвобождения 900 Гб из базы 3.7 ТБ обоими вариантами.
3. Garilia 27 17.04.24 14:53 Сейчас в теме
(1)
Дано:
База 3.7 ТБ
Свободно внутри базы - 877 ГБ
Операция полного шринка одной итерацией для базы - 15 часов и 5 минут
Порционный шринк - 22 часа.

Время для отпуска первой порции в текущей схеме распределения данных внутри базы - 2613 секунд, последующие по разному от 177 до 1700 секунд с порцией в 5000 МБ.

Скорость выполнения вероятно будет у всех разная, т.к. у меня 877 ГБ места получается после точечного вырезания определенных данных из файла базы, находящихся на всем поле размеченного пространства (свертка баз по последним N дням с сохранением ссылочной целостности для регистров и т.д. конкретно с этой базой чистились технологические таблицы и различные конф. данные - поэтому неразмеченные блоки располагаются практически везде)

На других базах, время для высвобождения первой порции памяти варьируется от 100+ секунд до 1000
Оставьте свое сообщение