Перейти к содержимому

Как сделать скрипт для бэкапа mssql что бы следить что фуул лежит в том же месте что и новое место.

Задача сделать скрипт который будет проверять если ли фулл бэкап в заданной директории .

Процедура используется SQL Server Backup ola.hallengren

 

-- Объявляем переменные
DECLARE @BackupDirectory NVARCHAR(500) = N'\\ARC03\sql_backup$';
DECLARE @DatabaseList NVARCHAR(MAX) = ''; -- Список баз для бэкапа
DECLARE @DatabaseName NVARCHAR(128);
DECLARE @LastFullBackupPath NVARCHAR(500);
DECLARE @LastFullBackupDate DATETIME;

-- Курсор для перебора всех пользовательских баз данных
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE database_id > 4 -- Исключаем системные базы данных
AND state = 0; -- Только базы в режиме ONLINE

-- Открываем курсор
OPEN db_cursor;

-- Перебираем базы данных
FETCH NEXT FROM db_cursor INTO @DatabaseName;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Получаем путь и дату последнего полного бэкапа для текущей базы
    SELECT TOP 1
        @LastFullBackupPath = mf.physical_device_name,
        @LastFullBackupDate = bs.backup_finish_date
    FROM msdb.dbo.backupset bs
    INNER JOIN msdb.dbo.backupmediafamily mf ON bs.media_set_id = mf.media_set_id
    WHERE bs.database_name = @DatabaseName
    AND bs.type = 'D' -- 'D' означает полный бэкап
    ORDER BY bs.backup_finish_date DESC;

    -- Проверяем условия:
    -- 1. Полный бэкап отсутствует в указанной папке
    -- 2. Полный бэкап делался более 7 дней назад
    IF @LastFullBackupPath IS NULL 
       OR @LastFullBackupPath NOT LIKE @BackupDirectory + '%'
       OR DATEDIFF(DAY, @LastFullBackupDate, GETDATE()) > 7
    BEGIN
        -- Добавляем базу данных в список для бэкапа
        IF @DatabaseList <> ''
        BEGIN
            SET @DatabaseList = @DatabaseList + ',';
        END
        SET @DatabaseList = @DatabaseList + @DatabaseName;

       -- PRINT 'База данных ' + @DatabaseName + ' будет добавлена в список для бэкапа.';
    END
    ELSE
    BEGIN
       -- PRINT 'Для базы данных ' + @DatabaseName + ' уже существует актуальный полный бэкап в указанной папке: ' + @LastFullBackupPath;
        PRINT 'Дата последнего полного бэкапа: ' + CONVERT(NVARCHAR, @LastFullBackupDate, 120);
    END

    -- Переходим к следующей базе данных
    FETCH NEXT FROM db_cursor INTO @DatabaseName;
END;

-- Закрываем и освобождаем курсор
CLOSE db_cursor;
DEALLOCATE db_cursor;

-- Если есть базы для бэкапа, выполняем процедуру DatabaseBackup
IF @DatabaseList <> ''
BEGIN
    PRINT 'Выполняю полный бэкап для баз данных: ' + @DatabaseList;

    EXECUTE [dbo].[DatabaseBackup]
        @Databases = @DatabaseList,
        @Directory = @BackupDirectory,
        @BackupType = 'FULL',
        @Verify = 'Y',
        @Compress = 'Y',
        @CleanupTime = 312,
        @CleanupMode = 'AFTER_BACKUP',
        @CheckSum = 'Y',
        @LogToTable = 'Y',
        @DatabasesInParallel = 'Y'; -- Включаем параллельное выполнение для нескольких баз

    PRINT 'Полный бэкап успешно выполнен для баз данных: ' + @DatabaseList;
END
ELSE
BEGIN
    PRINT 'Нет баз данных, требующих полного бэкапа.';
END

 

Similar Posts:

Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика