19.4.23

Tips for DBA: Замена для стандартного "Back Up Database Task"

Очень часто получается так, что реальные бизнес -требования оказываются сложнее, чем возможности мастеров программного инструментария, поставляемого разными производителями ПО для задач администрирования SQL Server 2008. Например, недавно мне стало недостаточно гибкости мастера создания задачи резервного копирования базы данных для стандартного плана обслуживания БД. У меня возникла необходимость делать копию в несколько фалов на разных дисковых массивах и поддерживать хронологию копий по единым правилам. В несколько файлов выполнять резервное копирование бывает необходимо для повышения производительности этой операции, например, как это рекомендовано в этой статье: "A Technical Case Study: Fast and Reliable Backup and Restore of Multi-Terabytes Database over the Network". Мастер SSMS может либо поддерживать хронологию для одного файла копий, либо копировать в фиксированные имена нескольких указанных файлов. К счастью, совершенно не составляет труда заменить задачу резервного копирования на задачу исполнения сценария T-SQL, в котором выполнить нужную работу. Ниже представлен соответствующий шаблон сценария, взяв который за основу можно составить необходимую задачу исполнения сценария T-SQL.

DECLARE @path varchar(128)
DECLARE @DBName AS nvarchar(4000) = 'ИМЯБАЗЫДАННЫХ'
DECLARE @File1 AS nvarchar(4000), @File2 AS nvarchar(4000), @File3 AS nvarchar(4000)
-- Если диск для копий один, и он корректно задан, узнать путь к папке копий можно так:
EXEC master..xp_regread
    @rootkey='HKEY_LOCAL_MACHINE',
    @key='SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer',
    @value_name='BackupDirectory',
    @value=@path OUTPUT
-- Формируем часть имени файла, в которой фиксируется имя БД и время создания копии
DECLARE @FileName AS nvarchar(4000) = @path + '\' + @DBName +'\' + @DBName + '_' + 'backup_' +
    CONVERT(nvarchar(4),YEAR(CURRENT_TIMESTAMP), 112 ) + '_' +
    CASE MONTH(CURRENT_TIMESTAMP)
        WHEN 1 THEN '01' WHEN 2 THEN '02' WHEN 3 THEN '03'
        WHEN 4 THEN '04' WHEN 5 THEN '05' WHEN 6 THEN '06'
        WHEN 7 THEN '07' WHEN 8 THEN '08' WHEN 9 THEN '09'
        ELSE CONVERT(nvarchar(2),MONTH(CURRENT_TIMESTAMP), 112 ) END
    + '_' +
    CASE DAY(CURRENT_TIMESTAMP)
        WHEN 1 THEN '01' WHEN 2 THEN '02' WHEN 3 THEN '03'
        WHEN 4 THEN '04' WHEN 5 THEN '05' WHEN 6 THEN '06'
        WHEN 7 THEN '07' WHEN 8 THEN '08' WHEN 9 THEN '09'
        ELSE CONVERT(nvarchar(2),DAY(CURRENT_TIMESTAMP), 112 ) END
    + '_' +
    REPLACE(REPLACE(CAST(CONVERT(time(7),CURRENT_TIMESTAMP, 109 ) AS nvarchar(14)),':',''),'.','_');
-- Добавляем к пути и имени файла идентификаторы и расширения
SELECT @File1 = @FileName + + '01.bak', @File2 = @FileName + + '02.bak', @File3 = @FileName + + '03.bak'
-- Запускаем резервное копирование в три файла.
BACKUP DATABASE [ИМЯБАЗЫДАННЫХ] TO
        DISK = @File1,
        DISK = @File2,
        DISK = @File3
WITH NOFORMAT, NOINIT, SKIP, REWIND, NOUNLOAD, COMPRESSION, STATS = 10

Комментариев нет:

Отправить комментарий