none
Скрипт обслуживания баз SQL RRS feed

  • Вопрос

  • Добрый день.

    Помогите, пожалуйста, написать скриптик на SQL Server 2008 для обслуживания баз...

    

    Необходимо хранить полный бэкап с возможностью отката на любой момент времени трое суток в папке C:\backup\bk\day. Создать папки C:\backup\bk\week, C:\backup\bk\week\month, где хранить резервные копии за неделю со сроком хранения 4 недели и месячные копии за весь год( скажем за 27 число каждого месяца).

    Есть наброски.

    Создание резервной копии в определённый момент времени на 3 дня.

    declare @s nvarchar (255)
    set @s = N'C:\backup\bk\day\test_'+CONVERT(nvarchar(255),GETDATE(),112)
    backup database test to disk = @s WITH  COPY_ONLY,  RETAINDAYS = 3, NOFORMAT, NOINIT,  NAME = N'full_test_backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

    Но никак не пойму, как организовать "возможность отката на любой момент времени"... это как вообще делается если это возможно... в самом SQL если нажать на нужную базу правой кнопкой выбрать Восстановить.. то там будет только восстановление на последнее доступное состояние...

    Подскажите, пожалуйста, как быть...

    31 января 2014 г. 11:27

Ответы

  • Добрый день.

    Бэкап с возможностью отката на любой момент времени - это полная резервная копия + разностная резервная копия + резервная копия журналов транзакций. В это цепочке именно наличие  резервной копии журналов транзакций отвечает за возможность отката на любой момент времени. В предложенном вами скрипте нет такой возможности, потому что если инструкция BACKUP DATABASE используется с параметром COPY_ONLY, то создается полная резервная копия, которая не может быть использована в качестве базовой копии для разностного копирования. Если вам нужно восстановить базу за последний час или последние 15 или 30 минут, то вам необходимо иметь цепочку из резервных копий журналов транзакций. Разберитесь для начала с моделью восстановления вашей базы Модели восстановления (SQL Server) 

    В предложенной вами схеме папки day и week  являются лишними. Создайте одну папку с названием например backup\month\Full и эту папку укажите при создании ежедневной полной резервной копии. Создаем план обслуживания (Maintanans Plan), в который включаем задачи  "создание полной резервной копии" и "Очистка после обслуживания (Maintatnans Cleanup Task)", в последней задаче указываем созданную нами папку и срок хранения резервных копий 1 месяц. Ставим schedule 1 раз в день 08:00 AM. Далее создаем папку backup\month\Differential. Создаем второй план обслуживания, в который включаем задачи "создание разностной резервной копии" и "Очистка после обслуживания (Maintatnans Cleanup Task)" в этой папке, в ней указываем срок хранения копий 1 месяц. Ставим schedule каждые 4 часа. Далее создаем папку backup\month\Transaction. Создаем третий план обслуживания, в который включаем задачи "создание резервной копии журналов транзакций" и "Очистка после обслуживания (Maintatnans Cleanup Task)", в ней указываем срок хранения копий 1 месяц. Ставим schedule каждые 30 минут.  Теперь у нас есть бэкап за 1 месяц, для того чтобы восстановить базу на любой момент времени за этот месяц и даже за последние 30 минут. В зависимости от места на дисковом массиве можете менять срок хранения и выставить там 12 месяцев или сделать бат файл для копирования содержимого папки Backup в другую папку в течение 12 месяцев.

    Удачи 



    31 января 2014 г. 13:07

Все ответы

  • Добрый день.

    Бэкап с возможностью отката на любой момент времени - это полная резервная копия + разностная резервная копия + резервная копия журналов транзакций. В это цепочке именно наличие  резервной копии журналов транзакций отвечает за возможность отката на любой момент времени. В предложенном вами скрипте нет такой возможности, потому что если инструкция BACKUP DATABASE используется с параметром COPY_ONLY, то создается полная резервная копия, которая не может быть использована в качестве базовой копии для разностного копирования. Если вам нужно восстановить базу за последний час или последние 15 или 30 минут, то вам необходимо иметь цепочку из резервных копий журналов транзакций. Разберитесь для начала с моделью восстановления вашей базы Модели восстановления (SQL Server) 

    В предложенной вами схеме папки day и week  являются лишними. Создайте одну папку с названием например backup\month\Full и эту папку укажите при создании ежедневной полной резервной копии. Создаем план обслуживания (Maintanans Plan), в который включаем задачи  "создание полной резервной копии" и "Очистка после обслуживания (Maintatnans Cleanup Task)", в последней задаче указываем созданную нами папку и срок хранения резервных копий 1 месяц. Ставим schedule 1 раз в день 08:00 AM. Далее создаем папку backup\month\Differential. Создаем второй план обслуживания, в который включаем задачи "создание разностной резервной копии" и "Очистка после обслуживания (Maintatnans Cleanup Task)" в этой папке, в ней указываем срок хранения копий 1 месяц. Ставим schedule каждые 4 часа. Далее создаем папку backup\month\Transaction. Создаем третий план обслуживания, в который включаем задачи "создание резервной копии журналов транзакций" и "Очистка после обслуживания (Maintatnans Cleanup Task)", в ней указываем срок хранения копий 1 месяц. Ставим schedule каждые 30 минут.  Теперь у нас есть бэкап за 1 месяц, для того чтобы восстановить базу на любой момент времени за этот месяц и даже за последние 30 минут. В зависимости от места на дисковом массиве можете менять срок хранения и выставить там 12 месяцев или сделать бат файл для копирования содержимого папки Backup в другую папку в течение 12 месяцев.

    Удачи 



    31 января 2014 г. 13:07
  • Спасибо большое.

    Прошу тему не закрывать только :)

    3 февраля 2014 г. 4:42
  • Здравствуйте Александр!

    Здесь нет практики закрывать темы, так что если у Вас возникнут дополнительные вопросы спокойно можете дописать их здесь (если они связаны с темой) или открыть новую (если вопрос уже другой).

    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    3 февраля 2014 г. 6:40
    Модератор
  • Возникла проблема.

    Как сделать это без "Планов обслуживания" :(

    Я создал три джоба, по отдельности на полное, разностное и транзакции.

    Но не знаю что прописать для очистки (удаления)...

    3 февраля 2014 г. 7:12
  • Добрый день

    Для того, чтобы создать задание по очистке после обслуживания с помощью T-SQL скрипта:

    EXECUTE master.dbo.xp_delete_file
       0
     , N'D:\Backup\'
     , N'bak'
     , N'2014-01-03T01:05:34'

     , 1

    Замените путь D:\Backup\ на путь к вашей папке с бэкапами и дату на необходимую вам дату

    Смотрите подробнее здесь:  EXECUTE master.dbo.xp_delete_file in Sql Server 2008

    Удачи 


    3 февраля 2014 г. 12:53
  • Но не знаю что прописать для очистки (удаления)...


    Можно использовать шаг джоба для запуска скриптов на PowerShell

    http://www.t-sql.ru

    5 февраля 2014 г. 3:30
    Отвечающий

  • to Rauf Khalafov

    Спасибо :) У меня просто нет доступа в "Планы обслуживания".

    to Alexey Knyazev

    Попробовал, но он ругается, что нет учётной записи посредника... Попробовал создать учётную запись эту... возникли трудности... Вкладка - Общие, поле "Учётное имя"... жму "...", но там пусто, нет вообще ничего... не даёт создать :(




    • Изменено Alexander JA 5 февраля 2014 г. 9:11
    5 февраля 2014 г. 6:17
  • Разобрался с этой проблемой, всё заработало.

    Встал вопрос такой.

    Как скопировать файлы за неделю с помощью бат-файла?

    Точнее не как скопировать, как задать такое условие.. на проверку такого периода... :( не могу понять как...

    Понятно, что там должен быть if else... типо если файлы удовлетворяют этой маске, то их копировать... нет то нет....

    А вот какое условие должно быть...

    Подскажите, пожалуйста..

    6 февраля 2014 г. 12:09
  • Пишите на нормальном скриптовом языке(PS, WSH) - не надо мучаться с батниками.
    6 февраля 2014 г. 12:54
  • К сожалению, в SQL Server 2008 студио, мне доступен только CmdExec :(

    Поэтому и спрашиваю.

    6 февраля 2014 г. 12:56
  • Добрый день 

    Вот пример простого скрипта для cmd: 

    на локальный диск: 

    XCOPY D:\Backup E:\BacupArxiv /S /Y /D  

    и на сетевой диск:

    XCOPY D:\Backup \\имя_сервера\\имя_расшаренного_диска /S /Y /D

    Данный скрипт копирует все новые файлы из папки D:\Backup в папку E:\BacupArxiv.

    Или 

    robocopy "D:\Backup" "\\NAS\BACKUP\Week" /maxage:7 /minage:1

    Скопировать файлы, измененные за последние 7 дней (исключая сегодня).

    Удачи 



         


    6 февраля 2014 г. 14:04
  • Мм..

    Спасибо за робокопи :) не знал про неё, честно.. т.е. одной командой можно скопировать кучку файлов за нужный период... но как прописать маску на эти файлы..

    т.е.

    вот пример: robocopy C:\backup\bk\day C:\backup\bk\week\ /maxage:7 /minage:1 - он тупо скопирует нужные файлы... но в той папке хранятся полные (test_2014XXXX), разностные (test_raznost_2014XXXX) и транзакции (test_tranz_2014XXXX).... хочу перенести только полные.... подписываю так: C:\backup\bk\day\test_2014* - ругается... пишу так: C:\backup\bk\day "-m test_2014*" - ругается... или она так не умеет... не я конечно понимаю, что все эти части можно разделить и скинуть в отдельные папки, и из нужной папки копировать уже.. тут вопросов нет... а если не так... какую маску эта команда понимает? :( уже что только не пробовал.. отсюда: http://www.nncron.ru/nnbackup/help/RU/working/masks.htm

    7 февраля 2014 г. 12:32
  • Ну так дёргайте оттуда нормальный скрипт
    7 февраля 2014 г. 13:12
  • Добрый день.

    Лучше разделить на 3 разные папки. 

    Для достижения цели, которую вы поставили - 

    (Как скопировать файлы за неделю с помощью бат-файла?

    Точнее не как скопировать, как задать такое условие.. на проверку такого периода... :( не могу понять как...)

    и чтобы в этой папке оставались только файлы за неделю и больше ничего одним cmd скриптом вам не обойтись. 

    1. Первый очень простой скрипт для копирования всех новых файлов из папки D:\Backup в папку E:\BacupArxiv:   

    XCOPY D:\Backup E:\BacupArxiv /S /Y /D  

    2. И второй vbs скрипт для удаления старых файлов, в вашем случае поставьте 7 дней.

    Удаление старых файлов 

    Удачи 


    8 февраля 2014 г. 7:31
  • Rauf Khalafov

    Спасибо.

    Я решил попробовать сделать так.

    job1

    rem копирую недельные файлы, расписание запуска каждый понедельник

    robocopy «C:\backup\bak\day\full» «C:\backup\bk\week» /maxage:7 /minage:1

    job2

    rem копирую месячные файлы, запуск "один раз" 28 числа каждого месяца в определённое время

    copy C:\backup\bk\day\test_2014**28 C:\backup\bk\month\

    job3

    rem удаляю недельные копии старше 4 недель

    FORFILES /P C:\backup\bk\week /D -28 /C "cmd /c del @path"

    job4

    rem удаляю месячные копии старше года

    FORFILES /P C:\backup\bk\month /D -356 /C "cmd /c del @path"

    Всё так хорошо, но робокопи выдаёт ошибку:

    Сообщение
    Выполняется от имени пользователя: domen\user.-------------------------------------------------------------------------------     ROBOCOPY     ::     Robust File Copy for Windows  -------------------------------------------------------------------------------      Начало: Mon Feb 10 13:35:00 2014        Источник : C:\backup\bk\day\full\    Назначение : C:\backup\bk\week\         Файлы: *.*             Параметры: *.* /COPY:DAT /MAXAGE:7 /MINAGE:1 /R:1000000 /W:30     ------------------------------------------------------------------------------                          

    1    C:\backup\bk\day\full\      *ДОПОЛНИТЕЛЬНАЯ папка        -1    C:\backup\bk\week\month\    ------------------------------------------------------------------------------                  

    Всего        Скопировано Пропущено      Несоответствие      СБОЙ    Дополнения 

    Каталогов :         1                  0                           1                      0                0               1   

    Файлов :              1                  0                           1                      0                0               0     

    Байт :    3.03 m         0    3.03 m         0         0         0     Время :   0:00:00   0:00:00                       0:00:00   0:00:00    Окончание : Mon Feb 10 13:35:00 2014.  Код завершения процесса 2.  Шаг завершился с ошибкой.

    => Чтобы это может значить? :( ошибки синтаксиса нет...

    10 февраля 2014 г. 10:05
  • Добрый день

    Особенностью robocopy является то что, хотя копирование завершается успешно, выдается код завершения с ошибкой. Коды 1, 2 и 4 не указывают на какую-либо серьезную ошибку, коды 8  и 16 свидетельствуют об ошибке. Коды завершения robocopy вызывают ошибки завершения SQL заданий. Решение данной проблемы вы найдете здесь robocopy fix for exit code of 2  и здесь Fixing Robocopy for SQL Server Jobs

    Удачи

    10 февраля 2014 г. 12:11
  • Добрый день.

    Rauf Khalafov

    С этим разобрался, всё получилось... но... вот смотрите, образовалась непонятная ситуация..

    Джоб такой.

    Шаг 1.

    robocopy C:\backup\bk\day\full C:\backup\bk\week /maxage:7 /minage:1
    set/A errlev="%ERRORLEVEL% & 24"
    exit/B %errlev%

    Шаг 2. Команда удаления старых файлов.

    FORFILES -p "C:\backup\bk\week" -s -m * -d -2 -c "CMD /C if @isdir==FALSE DEL /f /q @path"
    EXIT /B 0

    Запускаю из среды SQL этот джоб. Задание успешно выполнено. Лезу в журнал. Ошибок нет. Запуска снова это же задание. Завершается с ошибкой. Лезу в журнал. Ошибка на шаге 1, т.е. на робокопи:

    ================================================

    ROBOCOPY     ::     Robust File Copy for Windows  -------------------------------------------------------------------------------      Начало: Fri Feb 14 11:24:07 2014        Источник : C:\backup\bk\day\full\    Назначение : C:\backup\bk\week\         Файлы: *.*             Параметры: *.* /COPY:DAT /MAXAGE:7 /MINAGE:1 /R:1000000 /W:30     ------------------------------------------------------------------------------                           5    C:\backup\bk\day\full\          Новый файл            3.0 m    test_20140210   0%    16%    32%    49%    65%    82%    98%   100%            Новый файл            1.5 m    test_20140211   0%    16%    32%    49%    65%    82%    98%   100%            Новый файл            1.5 m    test_20140212   0%    16%    32%    49%    65%    82%    98%   100%      ------------------------------------------------------------------------------                   ВсегоСкопировано ПропущеноНесоответствие      СБОЙДополнения  Каталогов :         1         0         1         0         0         0    Файлов :         5         3         2         0         0         0      Байт :    9.11 m    6.07 m    3.04 m         0         0         0     Время :   0:00:00   0:00:00                       0:00:00   0:00:00      Скорость :           455277714 Байт/сек.  Скорость :           26051.199 МБ/мин.    Окончание : Fri Feb 14 11:24:07 2014.  Код завершения процесса 1.
    =================================================

    Т.е. из 2 раз запуска джоба, 1 с ошибкой, причём чередуется... 1 раз норм, второй ошибка.. и т.к. далее...

    Не могу понять в чём проблема... почему так... не хочется ставить на задание в свойствах шага, действие при ошибке - "завершить задание с успехом"...

    Добавление кода 1 в строчку

    set/A errlev="%ERRORLEVEL% & 124"

    ... результата не даёт...

    14 февраля 2014 г. 7:54
  • Добрый день, Alexander

    Наверно вы запускаете команду robocopy в джобе. Так делать не рекомендуется.  

    Вам надо сделать bat файл для 1-го джоба. В задании (джобе) сделайте вызов данного bat файла.

    Сделайте bat файл для  

    robocopy C:\backup\bk\day\full C:\backup\bk\week /maxage:7 /minage:1
    set/A errlev="%ERRORLEVEL% & 24"
    exit/B %errlev%

    или воспользуйтесь примером robocop.bat

    14 февраля 2014 г. 11:27
  • Добрый день.
    Спасибо.
    Опробовал этот способ. Не могу выполнить, т.к. нет прав на выполнение EXEC. Пишет ошибку SQL.

    step1.bat
    =========================
    robocopy C:\backup\bk\day\full C:\backup\bk\week /maxage:7 /minage:1
    if errorlevel 16 exit /b 1
    if errorlevel 15 exit /b 1
    if errorlevel 14 exit /b 1
    if errorlevel 13 exit /b 1
    if errorlevel 12 exit /b 1
    if errorlevel 11 exit /b 1
    if errorlevel 10 exit /b 1
    if errorlevel 9 exit /b 1
    if errorlevel 8 exit /b 1
    if errorlevel 7 exit /b 0
    if errorlevel 6 exit /b 0
    if errorlevel 5 exit /b 0
    if errorlevel 4 exit /b 0
    if errorlevel 3 exit /b 0
    if errorlevel 2 exit /b 0
    if errorlevel 1 exit /b 0
    if errorlevel 0 exit /b 0
    =========================
    Ну т.е. при созданиия шага джоба, выбираю "Сценарий T_SQL" ввожу: exec xp_cmdshell 'C:\backup\step1.bat' и получаю ошибку, мол у вас нет прав, грубо говоря.

    Права мне никто сейчас дать не сможет, т.к. этот человек в командировке.

    Отсюда возникает вопрос.

    Можно ли сделать на самом sql скриптик, который бы проверял файлы по дате и удалял бы их, ну те, которые подошли бы под условие..

    • Изменено Alexander JA 17 февраля 2014 г. 8:01
    17 февраля 2014 г. 8:00