Резервное копирование начинается через план обслуживания.
С настройкой службой оповещения вы сможете ознакомиться по ссылке Настройка Database Mail в MS SQL Server 2005 и старше
Далее из панели элементов добавляем нужную задачу и помещаем в свой план обслуживания.
- Добавляем "самый главный" блок "Проверка целостности базы данных", указываем только одну базу данных.
В нашем примере это будет база с именем "ZUP"
В качестве обработки ошибки рекомендую добавить блок "Уведомление оператора". Блок простой и при правильной настройке Database Mail SQL прост в настройке.
У вас должна получиться конструкция:
- При успешной обработке блока "Проверка целостности БД", добавляем блок "Выполнение инструкции T-SQL"
Инструкция SQL создает нужные каталоги на вашем "СХД" Системы хранения данных
Скрипт не обязателен, но полезно, если вы меняете носители, для меня же было любопытно посмотреть, на что способен SQL при работе с накопителями.
Скрипт:SET NOCOUNT ON DECLARE @BasesValue varchar (200); --Имя базы --Путь к новому каталогу... Set @BasesValue = 'zup'; --Имя базы данных DECLARE @FileName varchar(500) DECLARE @FileName_FULL varchar(500) DECLARE @FileName_Little varchar(500) DECLARE @FileNameCreat varchar(500) Set @FileName_FULL ='G:\BackupDB\'+@BasesValue+'\FULL' Set @FileName_Little ='G:\BackupDB\'+@BasesValue+'\Little' DECLARE @FileExists TABLE (File_Exists int ,File_is_a_Directory int ,parent_directory_exists int) Set @FileName = @FileName_FULL Set @FileNameCreat = 'MD '+@FileName INSERT INTO @FileExists (File_Exists, file_is_a_directory, parent_directory_exists) EXEC Master.dbo.xp_fileexist @FileName If EXISTS(SELECT * FROM @FileExists Where File_is_a_Directory = 0) Begin exec sp_configure 'show advanced',1 reconfigure with override exec sp_configure 'xp_cmdshell',1 reconfigure with override BEGIN TRY Select 'Создать папку' EXEC xp_cmdshell @FileNameCreat END TRY BEGIN CATCH -- Execute error retrieval routine. Select 'Ошибка, каталог не создан или что-то пошло не так!' END CATCH; exec sp_configure 'xp_cmdshell',0 reconfigure with override exec sp_configure 'show advanced',0 reconfigure with override End --Проверим папку для короткого архива DELETE FROM @FileExists Set @FileName = @FileName_Little Set @FileNameCreat = 'MD '+@FileName INSERT INTO @FileExists (File_Exists, file_is_a_directory, parent_directory_exists) EXEC Master.dbo.xp_fileexist @FileName If EXISTS(SELECT * FROM @FileExists Where File_is_a_Directory = 0) Begin exec sp_configure 'show advanced',1 reconfigure with override exec sp_configure 'xp_cmdshell',1 reconfigure with override BEGIN TRY Select 'Создать папку' EXEC xp_cmdshell @FileNameCreat END TRY BEGIN CATCH -- Execute error retrieval routine. Select 'Ошибка, каталог не создан или что-то пошло не так!' END CATCH; exec sp_configure 'xp_cmdshell',0 reconfigure with override exec sp_configure 'show advanced',0 reconfigure with override End GO
По окончании выполнение блока задание продолжает выполнение вне зависимости от результата. Т.е. условие выполнения блока "Завершение".
- Следующим добавляем блок "Выполнение инструкции T-SQL".
Инструкция SQL проверяет, сколько дней прошло, после того, как выполнялось полное резервное копирование, соответствие размера полной и разностной резервной копии, наличие полной резервной копии в каталоге.
В зависимости от настроек проверяется:
- было ли выполнено резервное копирование в нужную папку;
- существует ли файл полного резервирования в нужной папке;
- соотношение размера файла полного копии к разностной.
Данный блок выполняет роль семафора. При ошибке будет выполнен блок плана по полному резервному копированию. При успешном выполнении инструкции, последует выполнение блока по разностному резервному копированию.
Данная инструкция функционал семафора выполняет по вызову исключения:
RAISERROR ('Эмуляция ошибки, для блока условия: Будет сформирован полный BackUp', -- Message text. 16, -- Severity. 1 -- State. );
Скрипт:DECLARE @BasesValue varchar (200), --Имя базы @BasesPathFULL varchar (500), --Путь к бекапам FULL @BasesPathLittle varchar (500), --Путь к бекапам Little @BasesSizeProc numeric(20, 0), --Процент разницы базы @CountDay numeric(20, 0) --Количество дней, после которых будет произведен полный бекап DECLARE @FindFullFile numeric(20, 0), --Проверять присутствие файла @TestFullBackUp numeric(20, 0) --Проверять Файл полного бекапа на возможность восстановить (заметил, что железо может подвести, а SQL не отмечает ошибки при проверке) Set @BasesValue = 'zup' --Имя базы данных Set @BasesSizeProc = 80; --разница в процентах от полного бекапа и частичного бекапа Set @CountDay = 15; --Через н-ое кол-во дней будет сформирован полный бекап, если ноль, то дни не участвуют. Set @FindFullFile = 1; --1 = проверять файл полного бекапа (FULL), 0 = пропустить проверку, 2 = всегда делать полный бекап (любое число) Set @TestFullBackUp = 1; --1 = проверять файл на возможность восстановить данные, 0 = данная проверка пропускается... (RESTORE VERIFYONLY) Set @BasesPathFULL = 'G:\BackupDB\'+@BasesValue+'\FULL\' --Путь к полному бекапу, (обязателен!) Set @BasesPathLittle = 'G:\BackupDB\'+@BasesValue+'\Little\' --Путь к короткому бекапу (пока не используется) --Для файла DECLARE @FileName_FULL varchar(500), --Путь к искомому файлу, он получается из БД @IsFindFile numeric(20, 0); --Признак того, что файл найден или нет DECLARE @FileExists TABLE (File_Exists int ,File_is_a_Directory int ,parent_directory_exists int) --Таблица содержащая последний бекап... с признаком "Только резервное копирование" = 0 DECLARE @LastBackUp TABLE (R_database_name nvarchar(128), R_backup_size numeric(20, 0), R_compressed_backup_size numeric(20, 0), R_physical_device_name nvarchar(260), R_backup_start_date datetime, R_is_copy_only bit, R_checkpoint_lsn numeric(25, 0), R_database_backup_lsn numeric(25, 0), R_type char(1), R_user_name nvarchar(128), R_backup_set_uuid uniqueidentifier, R_differential_base_lsn numeric(25, 0), R_differential_base_guid uniqueidentifier) --Таблица содержащая последний Полный бекап, с признаком "Только резервное копирование" = 0 DECLARE @LastFullBackUp TABLE (R_database_name nvarchar(128), R_backup_size numeric(20, 0), R_compressed_backup_size numeric(20, 0), R_physical_device_name nvarchar(260), R_backup_start_date datetime, R_is_copy_only bit, R_checkpoint_lsn numeric(25, 0), R_database_backup_lsn numeric(25, 0), R_type char(1), R_user_name nvarchar(128), R_backup_set_uuid uniqueidentifier, R_differential_base_lsn numeric(25, 0), R_differential_base_guid uniqueidentifier) --Результирующая таблица для определения условия выполнения полного бекапа или короткого... DECLARE @ResultBackUp TABLE (ProcFULL numeric(20, 0), TypeBackUp char(1), BasesSizeProc numeric(25, 18), CountDayLittleBackUp numeric(20, 0), DataBackUp datetime, FullPath nvarchar(260), DayFullBackUp numeric(20, 0)) Use [master] --Последний бекап, обычно короткий, но один раз полный INSERT @LastBackUp (R_database_name, R_backup_size, R_compressed_backup_size, R_physical_device_name, R_backup_start_date, R_is_copy_only, R_checkpoint_lsn, R_database_backup_lsn, R_type, R_user_name, R_backup_set_uuid, R_differential_base_lsn, R_differential_base_guid) SELECT TOP 1 s.database_name as R_database_name, --имя базы s.backup_size as R_backup_size, --размер базы во время бекапа s.compressed_backup_size as R_compressed_backup_size, --Размер бекапа после сжатия, файл bak m.physical_device_name as R_physical_device_name, --Путь бекапирования s.backup_start_date as R_backup_start_date, --Дата и время создания бекапа s.is_copy_only as R_is_copy_only, --Режим бекапирования, 1-только копия, 0-при полном бекапировании программа сбрасывает счетчик s.checkpoint_lsn as R_checkpoint_lsn, --ИД бекапа s.database_backup_lsn as R_database_backup_lsn, --ИД последнего бекапа s.[type] as R_type, --Тип резервного копирования 'D'='Full', 'I'='Differential', 'L'='Transaction Log' s.[user_name] as R_user_name, --Имя пользователя s.backup_set_uuid as R_backup_set_uuid, --УИД бекапа s.differential_base_lsn as R_differential_base_lsn, --ИД бекапа владельца s.differential_base_guid as R_differential_base_guid --УИД бекапа владельца FROM msdb.dbo.backupset s INNER JOIN msdb.dbo.backupmediafamily m ON s.media_set_id = m.media_set_id --WHERE s.database_name = DB_NAME() -- Remove this line for all the database Where s.database_name = @BasesValue and s.is_copy_only = 0 and s.[type] <> 'L' ORDER BY backup_start_date DESC, backup_finish_date --Получение полного бекапа, для сверки, что бы не пропустить момент, когда могли упаковать бекап... (без галочки ТОЛЬКО рервное копирование) INSERT @LastFullBackUp (R_database_name, R_backup_size, R_compressed_backup_size, R_physical_device_name, R_backup_start_date, R_is_copy_only, R_checkpoint_lsn, R_database_backup_lsn, R_type, R_user_name, R_backup_set_uuid, R_differential_base_lsn, R_differential_base_guid) SELECT TOP 1 s.database_name as R_database_name, --имя базы s.backup_size as R_backup_size, --размер базы во время бекапа s.compressed_backup_size as R_compressed_backup_size, --Размер бекапа после сжатия, файл bak m.physical_device_name as R_physical_device_name, --Путь бекапирования s.backup_start_date as R_backup_start_date, --Дата и время создания бекапа s.is_copy_only as R_is_copy_only, --Режим бекапирования, 1-только копия, 0-при полном бекапировании программа сбрасывает счетчик s.checkpoint_lsn as R_checkpoint_lsn, --ИД бекапа s.database_backup_lsn as R_database_backup_lsn, --ИД последнего бекапа s.[type] as R_type, --Тип резервного копирования 'D'='Full', 'I'='Differential', 'L'='Transaction Log' s.[user_name] as R_user_name, --Имя пользователя s.backup_set_uuid as R_backup_set_uuid, --УИД бекапа s.differential_base_lsn as R_differential_base_lsn, --ИД бекапа владельца s.differential_base_guid as R_differential_base_guid --УИД бекапа владельца FROM msdb.dbo.backupset s INNER JOIN msdb.dbo.backupmediafamily m ON s.media_set_id = m.media_set_id --WHERE s.database_name = DB_NAME() -- Remove this line for all the database Where s.database_name = @BasesValue and s.is_copy_only = 0 and s.[type] = 'D' ORDER BY backup_start_date DESC, backup_finish_date --Формируем окончательный бекап... INSERT @ResultBackUp (ProcFULL, TypeBackUp, BasesSizeProc, CountDayLittleBackUp, DataBackUp, FullPath, DayFullBackUp) Select Case When LBFU.R_compressed_backup_size is Null or LBFU.R_compressed_backup_size = 0 Then 0 When ROUND(LBUP.R_compressed_backup_size/LBFU.R_compressed_backup_size * 100,0) >= @BasesSizeProc THEN 1 Else 0 End as [ProcFULL] ,LBUP.R_type as TypeBackUp ,LBUP.R_compressed_backup_size/LBFU.R_compressed_backup_size as BasesSizeProc ,DATEDIFF(dd,LBFU.R_backup_start_date,GETDATE()) as CountDayLittleBackUp ,LBFU.R_backup_start_date as DataBackUp ,LBFU.R_physical_device_name as FullPath ,DATEDIFF(dd,LBFU.R_backup_start_date,GETDATE()) as DayFullBackUp From @LastBackUp as LBUP Left outer JOIN @LastFullBackUp as LBFU on --Продолжение делать короткие бекапы, пока не наступит условие LBUP.R_differential_base_lsn = LBFU.R_checkpoint_lsn and LBUP.R_type = 'I' and (Case When (LBFU.R_compressed_backup_size is Null) or (LBFU.R_compressed_backup_size = 0) Then 0 When ROUND(LBUP.R_compressed_backup_size/LBFU.R_compressed_backup_size * 100,0) >= @BasesSizeProc THEN 1 Else 0 End) = 0 And (@CountDay = 0 or DATEDIFF(dd,LBFU.R_backup_start_date,GETDATE()) < @CountDay) And LBFU.R_physical_device_name Like @BasesPathFULL+'%' --Начали делать короткие бекапы, после большого or LBUP.R_checkpoint_lsn = LBFU.R_checkpoint_lsn and LBUP.R_type = 'D' and DATEDIFF(dd,LBFU.R_backup_start_date,GETDATE()) <= 3 And LBFU.R_physical_device_name Like @BasesPathFULL+'%' Where not LBFU.R_checkpoint_lsn IS NULL --Проверим присутствие файлов Set @IsFindFile = 0; --По умолчанию файла нет Set @FileName_FULL = (Select Top 1 LB.FullPath From @ResultBackUp as LB); If EXISTS(Select * From @ResultBackUp as LB) and @FindFullFile = 1 Begin INSERT INTO @FileExists (File_Exists, file_is_a_directory, parent_directory_exists) EXEC Master.dbo.xp_fileexist @FileName_FULL If EXISTS(SELECT * FROM @FileExists Where File_Exists = 1 and file_is_a_directory = 0) Begin --Select * FROM @FileExists Where File_Exists = 1 and file_is_a_directory = 0 Set @IsFindFile = 1; End End --Выполним проверку и соответственно запрос... If EXISTS(Select * From @ResultBackUp as LB) And (@FindFullFile = 0 Or @FindFullFile = 1 and @IsFindFile = 1) Begin Select * From @ResultBackUp as LB End Else Begin --Select 100 / 0 as Error RAISERROR ('Эмуляция ошибки, для блока условия: Будет сформирован полный BackUp', -- Message text. 16, -- Severity. 1 -- State. ); End --Выполним проверку самого главного файла, т.к. он есть на носителе, но может содержать ошибки, а ошибок нам ненадо!!! -- Недавно столкнулся с тем что СХД в организации СТАРАЯ, старая КАРЛ!!! (админ её еще не заменил) If @TestFullBackUp = 1 Begin Select @FileName_FULL --просто визуализация для отладки запроса... RESTORE VERIFYONLY FROM DISK = @FileName_FULL End GO
Должно получиться, что-то вроде:
Далее пойдем по красной ветке, пункт № 4. А затем по зеленой ветке, пункт № 9
- Начнем процесс выполнения блоков полного резервного копирования (красная ветка).
Сперва идет блок восстановления индексов.
Единственное, что нужно сделать, это выбрать нужную базу данных. Все остальное остается по умолчанию.
По окончанию выполнения задания в блоке, просто продолжаем выполнение следующего блока. Т.е. выставляем свойство "Завершение"
- После восстановления индексов следует блок "Обновление статистики".
В блоке выбирается только база данных.
По окончанию выполнения задания в блоке, просто продолжаем выполнение следующего блока. Т.е. выставляем свойство "Завершение". Нам не надо останавливать выполнения плана обслуживания, если что-то пойдет не так, то продолжаем.
- По окончании обновлении статистики рекомендовано выполнить очистку кэша.
Добавляем блок "Выполнение инструкции T-SQL".
Описание чистки кэш можно ознакомиться на сайтах:
Очистка процедурного КЭШа (DBCC FREEPROCCACHE).
SQL. Настройка резервного копирования.
По команде "DBCC FLUSHPROCINDB(8)", значение "8" у вас будет другое!!!
нужно выполнить запрос SQL:
select name, database_id from sys.databases
Скрипт:--Получить ИД какой либо БД --Команда USE не использовалась --Сайт: http://memory1c.blogspot.com/2012/09/dbcc-freeproccache.html --Сайт: //infostart.ru/public/199760/ --select name, database_id from sys.databases USE [zup] GO DBCC FLUSHPROCINDB(8) GO
По окончанию выполнения задания в блоке, просто продолжаем выполнение следующего блока. Т.е. выставляем свойство "Завершение".
- Добавляем блок "Резервное копирование базы данных"
В данном блоке выполняем полное резервное копирование.
Указать:
- тип резервной копии "Полное"
- Выбрать базу данных
В целевом объекте указать:
- каталог, куда делать резервные копии
- расширение должно оканчиваться на ".bak", иначе при восстановлении из архива вам придется его переименовывать, другие расширения SQL не видит.
В параметрах указываем:
- Сжимать резервные копии
- Срок действия резервной копии нужен только если вы воспользуетесь блоком "Удаление старых архивов"
- Проверка целостности резервной копии не помешает, мало-ли что могло пойти не так.
В качестве обработки ошибки рекомендую добавить блок "Уведомление оператора".
Примерно должно получиться:
- При успешном резервном копировании нам необходимо выполнить последние две операции:
"Очистка после обслуживания" и "Выполнить инструкцию SQL по урезанию журнала транзакций" (последнее вы можете не добавлять, как говорят специалисты, журнал транзакций формируется автоматически и не растет бесконечно, в моем случае в виду ограниченности дискового пространства, приходится его урезать)
"Очистка после обслуживания" - удаляет старые файлы, которые предположительно потеряли свою актуальность.
Указываем путь к резервным копиям и указываем имя расширения файлов.
Пунктом "Возраст файлов" мы ограничиваем период, за который будут удалены файлы.
В моем случае это год, т.к. в дальнейшем полные резервные копии должны будут формироваться два раза в месяц. У вас возможно другой взгляд и возможность хранения резервных копий.
Скрипт по отрезанию журнала транзакций:DECLARE @BasesValue varchar(200), --Имя базы @BasesLog varchar(200) Set @BasesValue = 'zup'; Set @BasesLog = @BasesValue + '_log'; If EXISTS(SELECT name, recovery_model_desc FROM sys.databases WHERE name = @BasesValue and recovery_model_desc = 'FULL') Begin USE [zup] ALTER DATABASE [zup] SET RECOVERY SIMPLE DBCC SHRINKFILE (@BasesLog, 1); ALTER DATABASE [zup] SET RECOVERY FULL End SELECT name, recovery_model_desc FROM sys.databases WHERE name = @BasesValue ; GO
- Начнем выполнение разностное резервное копирование (зеленая ветка).
Добавляем блок "Выполнение инструкции T-SQL".
Инструкция SQL проверяет, через сколько дней выполнить обновление статистики базы данных.
Данный блок выполняет роль семафора. При ошибке будет выполнен блок обновления статистики. При успешном выполнении инструкции, последует выполнение блока по разностного резервного копирования без обновления статистики.
Данная инструкция функционал семафора выполняет по вызову исключения:
RAISERROR ('Эмуляция ошибки, для блока условия: Будет сформирован полный BackUp', -- Message text. 16, -- Severity. 1 -- State. );
Скрипт:DECLARE @BasesValue varchar (200), --Имя базы @CountDay numeric(20, 0) --Количество дней, после которых будет обновлен индекс Set @BasesValue = 'zup' --Имя базы данных Set @CountDay = 8; --Через н-ое кол-во дней будет обновлен индекс --Таблица содержащая последний бекап... с признаком "Только резервное копирование" = 0 DECLARE @LastBackUp TABLE (R_database_name nvarchar(128), R_backup_size numeric(20, 0), R_compressed_backup_size numeric(20, 0), R_physical_device_name nvarchar(260), R_backup_start_date datetime, R_is_copy_only bit, R_checkpoint_lsn numeric(25, 0), R_database_backup_lsn numeric(25, 0), R_type char(1), R_user_name nvarchar(128), R_backup_set_uuid uniqueidentifier, R_differential_base_lsn numeric(25, 0), R_differential_base_guid uniqueidentifier) --Таблица содержащая последний Полный бекап, с признаком "Только резервное копирование" = 0 DECLARE @LastFullBackUp TABLE (R_database_name nvarchar(128), R_backup_size numeric(20, 0), R_compressed_backup_size numeric(20, 0), R_physical_device_name nvarchar(260), R_backup_start_date datetime, R_is_copy_only bit, R_checkpoint_lsn numeric(25, 0), R_database_backup_lsn numeric(25, 0), R_type char(1), R_user_name nvarchar(128), R_backup_set_uuid uniqueidentifier, R_differential_base_lsn numeric(25, 0), R_differential_base_guid uniqueidentifier) --Результирующая таблица для определения условия выполнения полного бекапа или короткого... DECLARE @ResultBackUp TABLE (TypeBackUp char(1), CountDayLittleBackUp numeric(20, 0), DataBackUp datetime, FullPath nvarchar(260)) Use [master] --Последний бекап, обычно короткий, но один раз полный INSERT @LastBackUp (R_database_name, R_backup_size, R_compressed_backup_size, R_physical_device_name, R_backup_start_date, R_is_copy_only, R_checkpoint_lsn, R_database_backup_lsn, R_type, R_user_name, R_backup_set_uuid, R_differential_base_lsn, R_differential_base_guid) SELECT TOP 1 s.database_name as R_database_name, --имя базы s.backup_size as R_backup_size, --размер базы во время бекапа s.compressed_backup_size as R_compressed_backup_size, --Размер бекапа после сжатия, файл bak m.physical_device_name as R_physical_device_name, --Путь бекапирования s.backup_start_date as R_backup_start_date, --Дата и время создания бекапа s.is_copy_only as R_is_copy_only, --Режим бекапирования, 1-только копия, 0-при полном бекапировании программа сбрасывает счетчик s.checkpoint_lsn as R_checkpoint_lsn, --ИД бекапа s.database_backup_lsn as R_database_backup_lsn, --ИД последнего бекапа s.[type] as R_type, --Тип резервного копирования 'D'='Full', 'I'='Differential', 'L'='Transaction Log' s.[user_name] as R_user_name, --Имя пользователя s.backup_set_uuid as R_backup_set_uuid, --УИД бекапа s.differential_base_lsn as R_differential_base_lsn, --ИД бекапа владельца s.differential_base_guid as R_differential_base_guid --УИД бекапа владельца FROM msdb.dbo.backupset s INNER JOIN msdb.dbo.backupmediafamily m ON s.media_set_id = m.media_set_id --WHERE s.database_name = DB_NAME() -- Remove this line for all the database Where s.database_name = @BasesValue and s.is_copy_only = 0 and s.[type] <> 'L' ORDER BY backup_start_date DESC, backup_finish_date --Получение полного бекапа, для сверки, что бы не пропустить момент, когда могли упаковать бекап... (без галочки ТОЛЬКО рервное копирование) INSERT @LastFullBackUp (R_database_name, R_backup_size, R_compressed_backup_size, R_physical_device_name, R_backup_start_date, R_is_copy_only, R_checkpoint_lsn, R_database_backup_lsn, R_type, R_user_name, R_backup_set_uuid, R_differential_base_lsn, R_differential_base_guid) SELECT TOP 1 s.database_name as R_database_name, --имя базы s.backup_size as R_backup_size, --размер базы во время бекапа s.compressed_backup_size as R_compressed_backup_size, --Размер бекапа после сжатия, файл bak m.physical_device_name as R_physical_device_name, --Путь бекапирования s.backup_start_date as R_backup_start_date, --Дата и время создания бекапа s.is_copy_only as R_is_copy_only, --Режим бекапирования, 1-только копия, 0-при полном бекапировании программа сбрасывает счетчик s.checkpoint_lsn as R_checkpoint_lsn, --ИД бекапа s.database_backup_lsn as R_database_backup_lsn, --ИД последнего бекапа s.[type] as R_type, --Тип резервного копирования 'D'='Full', 'I'='Differential', 'L'='Transaction Log' s.[user_name] as R_user_name, --Имя пользователя s.backup_set_uuid as R_backup_set_uuid, --УИД бекапа s.differential_base_lsn as R_differential_base_lsn, --ИД бекапа владельца s.differential_base_guid as R_differential_base_guid --УИД бекапа владельца FROM msdb.dbo.backupset s INNER JOIN msdb.dbo.backupmediafamily m ON s.media_set_id = m.media_set_id --WHERE s.database_name = DB_NAME() -- Remove this line for all the database Where s.database_name = @BasesValue and s.is_copy_only = 0 and s.[type] = 'D' ORDER BY backup_start_date DESC, backup_finish_date --Формируем окончательный бекап... INSERT @ResultBackUp (TypeBackUp, CountDayLittleBackUp, DataBackUp, FullPath) Select LBUP.R_type as TypeBackUp ,DATEDIFF(dd,LBFU.R_backup_start_date,GETDATE()) as CountDayLittleBackUp ,LBFU.R_backup_start_date as DataBackUp ,LBFU.R_physical_device_name as FullPath From @LastBackUp as LBUP Left outer JOIN @LastFullBackUp as LBFU on --Продолжение делать короткие бекапы, пока не наступит условие LBUP.R_differential_base_lsn = LBFU.R_checkpoint_lsn and LBUP.R_type = 'I' And (@CountDay = 0 or DATEDIFF(dd,LBFU.R_backup_start_date,GETDATE()) > 0 And DATEDIFF(dd,LBFU.R_backup_start_date,GETDATE()) % @CountDay = 0) Where not LBFU.R_checkpoint_lsn IS NULL --Выполним проверку и соответственно запрос... If not EXISTS(Select * From @ResultBackUp as LB) Begin Select * From @ResultBackUp as LB End Else Begin --Select 100 / 0 as Error Select * From @ResultBackUp as LB RAISERROR ('Эмуляция ошибки, для блока условия: Будет обновлен индекс', -- Message text. 16, -- Severity. 1 -- State. ); End GO
В итоге у вас получится следующая конструкция.
В названии фигурирует переиндексация, но в виду того что у меня при этом происходил катастрофический рост журнала транзакции, блок по обновлению индексов был исключен. (но вы всегда можете пойти другим путем)
Внимание!!!
В дальнейшем, две ветки отличаются только обновлением статистики, но в виду того, что план обслуживания примитивен и не позволяет ссылаться на один и тот же блок "Резервного копирования", вам придется выполнять один и тот же набор настроек несколько раз. (SQL ошибок не выдает, но и копий не делает, просто нечего не происходит, как будто для SQL ваших блоков, к которым вы ссылаетесь из нескольких мест, не существует)
- Добавим блоки по обновлению статистики (красная ветка).
Подробнее по обновлению статистики вы можете посмотреть в пунктах № 5 и № 6
В данном случае они идентичны.
В итоге у вас получится небольшая конструкция:
- Окончание красной ветки и продолжение зеленой ветки.
Добавляем блок "Резервное копирование базы данных"
(и помним, что нам нужно сделать два идентичных блока по резервированию, т.к. планировщик SQL не позволяет оптимизировать настройку)
Общая настройка:
Целевой объект:
Как вы можете заметить, расширение файла содержит те самые буквы с точкой ".bak"
В качестве обработки ошибки рекомендую добавить блок "Уведомление оператора".
В дальнейшем настройка примет вид:
- При успешном резервном копировании нам необходимо выполнить последнюю операцию,
"Очистка после обслуживания"
"Очистка после обслуживания" - удаляет старые файлы, которые предположительно потеряли свою актуальность.
Как вы могли заметить я установил для промежуточных резервных копий всего 3 месяца в виду того, что они как правило занимают не так много места на носителях.
В оригинале у вас получится вот такая конструкция промежуточного копирования:
- Результатом будет небольшой план обслуживания, который реализован немного не традиционно в виду недостатков настройки.
- Ссылки на материал, который я почерпнул для данного резервного копирования:
- Настройка плана обслуживания MS SQL Server для 1С Предприятия.
- Всё о сокращении Transaction Log для MS SQL 2008/2012
- Как через t-sql получить уникальный ID сервера(компьютера)
- File Validation in SQL Server with xp_fileexist stored procedure
- Создать папку
- КАК ПРАВИЛЬНО НАСТРОИТЬ MS SQL SERVER ДЛЯ «1С»: ПЛАНЫ ОБСЛУЖИВАНИЯ
- Резервное копирование и восстановление информационной базы 1С
- Настройка Microsoft SQL Server для 1С Предприятие (Maintenance Plans)
- Лекция 5: Полная модель восстановления
- Набор скриптов для знакомства с SQL Server - Дополнительно...
Скрипт для оптимизации пункта № 6, предоставил Виталий Кривенко (v.krivenko)use <база>; DECLARE @DB_ID int; SET @DB_ID = DB_ID(); DBCC FLUSHPROCINDB(@DB_ID)
Описывать настройку расписания не буду, там до примитивности просто, дерзайте.
Может кому пригодится.