MaintenanceSolution от Ola Hallengren — это бесплатный набор T-SQL-скриптов для SQL Server, который автоматизирует резервное копирование баз данных, проверки целостности, а также обслуживание индексов и статистики, заменяя традиционный графический план обслуживания.
Оно работает на всех выпусках SQL Server начиная с 2008 года, а также на Azure SQL Managed Instance — везде, где доступен SQL Server Agent, от которого зависят запланированные задания.
Установка подразумевает скачивание MaintenanceSolution.sql, указание каталога для резервных копий и времени очистки, а затем его запуск для создания хранимых процедур и заданий SQL Server Agent.
Его также можно установить с помощью команды PowerShell Install-DbaMaintenanceSolution из dbatools.io.
Если вы администратор баз данных (DBA), вы понимаете, насколько важно иметь надежное решение для обслуживания баз данных. Особенно баз 1С, где обычное перестроение индексов может не сработать.
Ола Халленгрен разработал отличную реализацию обслуживания с использованием T-SQL-скриптов. Это бесплатное решение, заменяющее традиционный графический план обслуживания (для различных баз данных, приложений и размеров).
Сообщество SQL Server рекомендует решение Ola Hallengren для выполнения резервного копирования, проверок целостности, а также обслуживания индексов и статистики.
Ола Халленгрен
Ола Халленгрен — администратор баз данных (DBA) и разработчик баз данных, в настоящее время работающий в крупной финансовой компании в Швеции. Он работает с SQL Server с 2001 года.
В 2007 году Ола начал проект по улучшению обслуживания баз данных в крупной среде SQL Server. В то время в организации использовалась комбинация заданий по обслуживанию баз данных, созданных с помощью мастера обслуживания SQL Server, а также набор пользовательских скриптов на Transact-SQL. Его целью было избавиться от этого разнородного набора заданий и создать простое в развертывании решение, которое можно было бы легко внедрить в крупной среде, состоящей из критически важных серверов.
После завершения проекта Ола понял, что его решение может быть полезно и другим администраторам баз данных, поэтому 1 января 2008 года он выпустил первую версию своего скрипта для обслуживания баз данных, предложив его бесплатно для использования любой организации. С тех пор он регулярно совершенствовал свой скрипт, и сейчас он используется некоторыми из крупнейших организаций в мире.
Официальный сайт Ола Халленгрена: ola.hallengren.com. Там можно скачать последнюю версию скрипта MaintenanceSolution.sql.
Резервное копирование SQL Server, проверка целостности, обслуживание индексов и статистики
Решение для обслуживания SQL Server — это набор скриптов для выполнения резервного копирования, проверок целостности, а также обслуживания индексов и статистики во всех выпусках Microsoft SQL Server 2017, SQL Server 2019, SQL Server 2022 и SQL Server 2025. Решение основано на хранимых процедурах. Оно разработано для самых ответственных сред и используется во многих организациях по всему миру. Решение для обслуживания SQL Server на протяжении многих лет получало множество наград в сообществе SQL Server и распространяется бесплатно.
Без всяких сомнений, один из лучших инструментов! Если вы отвечаете за базу данных, вам следует использовать скрипты Олы. Они очень полные, эффективно используют ресурсы, имеют множество опций и являются блестящим образцом SQL-кода! — SQL Server Magazine
Начало работы
Скачайте MaintenanceSolution.sql. Этот скрипт создает все необходимые объекты и задания. Вы также можете скачать объекты в виде отдельных скриптов.
Минимальная требуемая версия — SQL Server 2017. Если вы используете более старую версию SQL Server, вы можете отдельно скачать последнюю поддерживаемую версию: SQL Server 2005 | SQL Server 2008–2016.
Новый более эффективный алгоритм сжатия в SQL Server 2025
Microsoft представила новый более эффективный алгоритм сжатия ZSTD в SQL Server 2025. DatabaseBackup поддерживает ZSTD.
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL',
@Compress = 'Y',
@CompressionAlgorithm = 'ZSTD',
@CompressionLevel = 'LOW'SQL Server 2025 также поддерживает полные и разностные резервные копии (не только копирующие) на вторичных репликах. DatabaseBackup поддерживает эту функцию.
Резервное копирование в S3-хранилище
Вы выполняете резервное копирование в S3-хранилище? DatabaseBackup имеет встроенную поддержку резервного копирования в AWS S3 и другие S3-совместимые хранилища.
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@URL = 's3://myaccount.s3.us-east-1.amazonaws.com/mybucket',
@BackupType = 'FULL',
@Compress = 'Y',
@Verify = 'Y',
@MaxTransferSize = 20971520,
@BackupOptions = '{"s3": {"region":"us-east-1"}}'Умное резервное копирование SQL Server в несколько файлов
Вы выполняете резервное копирование в несколько файлов для повышения производительности? Вы сталкиваетесь с ограничениями по размеру при резервном копировании в Azure Blob Storage?
DatabaseBackup поддерживает динамическое определение количества файлов.
Вот как это можно использовать для резервного копирования баз данных размером 10240 МБ или более в 8 файлов, а меньших баз данных — в один файл:
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL',
@Compress = 'Y',
@Checksum = 'Y',
@NumberOfFiles = 8,
@MinBackupSizeForMultipleFiles = 10240Вот как это можно использовать для динамического расчета количества файлов резервных копий, чтобы каждый файл имел максимальный размер 10240 МБ:
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL',
@Compress = 'Y',
@Checksum = 'Y',
@MaxFileSize = 10240Возобновляемые онлайн-перестроения индексов
SQL Server и IndexOptimize поддерживают возобновляемые онлайн-перестроения индексов. Эта функция позволяет возобновить перестроение индекса в случае его прерывания. Вот как это использовать:
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@Resumable = 'Y'Умное разностное резервное копирование и резервное копирование журнала транзакций SQL Server
SQL Server поддерживает проверку того, какой объем базы данных был изменен с момента последнего (не копирующего) полного резервного копирования, а также какой объем журнала транзакций был создан с момента последнего резервного копирования журнала. DatabaseBackup использует это для выполнения интеллектуальных разностных резервных копий и резервных копий журнала транзакций.
Вот как это можно использовать для выполнения разностного резервного копирования, если изменено менее 50% базы данных, и полного резервного копирования, если изменено 50% или более базы данных:
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'DIFF',
@ChangeBackupType = 'Y',
@MinModificationLevel = 50Вот как это можно использовать для выполнения резервного копирования журнала транзакций, если с момента последнего резервного копирования журнала создано 1 ГБ журнала или если с момента последнего резервного копирования прошло 300 секунд. Это позволяет выполнять более частые резервные копии журнала при более высокой активности.
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'LOG',
@MinLogSizeSinceLastLogBackup = 1024,
@MinTimeSinceLastLogBackup = 300Резервное копирование SQL Server в Linux
Решение для обслуживания SQL Server поддерживает SQL Server в Linux. Вот как его можно использовать для резервного копирования ваших баз данных:
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = '/var/opt/mssql/backup',
@BackupType = 'FULL',
@Verify = 'Y',
@Compress = 'Y',
@Checksum = 'Y'Чередование резервных копий в Azure Blob Storage
Команда SQLCAT опубликовала запись в блоге о том, как оптимизировать производительность при резервном копировании в Azure Blob Storage. Вы можете чередовать резервные копии в несколько файлов и использовать параметры MAXTRANSFERSIZE и BLOCKSIZE.
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@URL = 'https://myaccount.blob.core.windows.net/mycontainer',
@BackupType = 'FULL',
@Compress = 'Y',
@Verify = 'Y',
@NumberOfFiles = 8,
@MaxTransferSize = 4194304,
@BlockSize = 65536Работа с группами доступности (Availability Groups)
Решение для обслуживания SQL Server позволяет выбирать или исключать группы доступности. Вот как это работает в DatabaseBackup.
Выбор одной группы доступности:
EXECUTE dbo.DatabaseBackup
@AvailabilityGroups = 'AG1',
@Directory = 'C:\Backup',
@BackupType = 'FULL'Выбор нескольких групп доступности:
EXECUTE dbo.DatabaseBackup
@AvailabilityGroups = 'AG1, AG2',
@Directory = 'C:\Backup',
@BackupType = 'FULL'Выбор всех групп доступности, кроме одной:
EXECUTE dbo.DatabaseBackup
@AvailabilityGroups = 'ALL_AVAILABILITY_GROUPS, -AG1',
@Directory = 'C:\Backup',
@BackupType = 'FULL'Что если вы хотите выбрать все пользовательские базы данных, которые не входят в группы доступности? Вы можете использовать ключевое слово AVAILABILITY_GROUP_DATABASES в параметре @Databases:
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES, -AVAILABILITY_GROUP_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL'Это работает одинаково в DatabaseBackup, DatabaseIntegrityCheck и IndexOptimize.
Интеллектуальное обслуживание индексов
Решение для обслуживания SQL Server позволяет интеллектуально перестраивать или реорганизовывать только те индексы, которые фрагментированы. В процедуре IndexOptimize вы можете определить предпочтительную операцию обслуживания индексов для каждой группы фрагментации. Взгляните на этот код:
EXECUTE dbo.IndexOptimize @Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30В этом примере индексы с высоким уровнем фрагментации будут перестроены (по возможности онлайн). Индексы со средним уровнем фрагментации будут реорганизованы. Индексы с низким уровнем фрагментации останутся нетронутыми.
Обновление статистики
Процедура IndexOptimize также может использоваться для обновления статистики. Вы можете выбрать обновление всей статистики, только статистики по индексам или только статистики по столбцам. Вы также можете выбрать обновление статистики только в том случае, если какие-либо строки были изменены с момента последнего обновления статистики.
EXECUTE dbo.IndexOptimize @Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'Решение проблем с «отсутствием текущей резервной копии базы данных»
Большинство администраторов баз данных сталкивались с ошибками «BACKUP LOG cannot be performed because there is no current database backup» (нельзя выполнить резервное копирование журнала, так как нет текущей резервной копии базы данных) или «Cannot perform a differential backup for database, because a current database backup does not exist» (нельзя выполнить разностное резервное копирование для базы данных, так как нет текущей резервной копии базы данных). Эти ошибки обычно возникают, когда вы создали новую базу данных или изменили модель восстановления базы данных с Simple на Full. Решение заключается в том, чтобы перед запуском резервного копирования определить, можно ли выполнить разностное резервное копирование или резервное копирование журнала транзакций. Вы можете использовать опцию @ChangeBackupType процедуры DatabaseBackup для динамического изменения типа резервного копирования, если разностное резервное копирование или резервное копирование журнала транзакций не могут быть выполнены.
Вот пример использования опции @ChangeBackupType:
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'LOG',
@Verify = 'Y',
@ChangeBackupType = 'Y',
@CleanupTime = 24Выполнение проверок целостности очень больших баз данных
Решение для обслуживания SQL Server разработано для выполнения проверок целостности очень больших баз данных. В процедуре DatabaseIntegrityCheck вы можете выбрать выполнение проверок на уровне базы данных, файловой группы или таблицы. Также поддерживается ограничение проверок только физическими структурами базы данных:
EXECUTE dbo.DatabaseIntegrityCheck
@Databases = 'USER_DATABASES',
@CheckCommands = 'CHECKDB',
@PhysicalOnly = 'Y'