none
глубина бэкапа RRS feed

  • Вопрос

  • Имеется небольщая сеть на Win XP Pro в которой автоматически делается бэкап при помощи ntbackup. Все последующие архивы добавляются к одному .bkf файлу. Когда есть необходимость восстановить какую-то предыдущую копию, то открываю этот .bkf файл и выбираю нужную копию. Но, в целях предотвращения разрастания этого архива нужно автоматически поддерживать некоторый уровень глубины бэкапа (кол-во копий). Знаю, что есть скрипт (не могу найти), который держит n копий бэкапов в файле и в случае превышения этого числа n затирает самую старую копию. Скажем, есть 7 копий бэкапа. И при записи 8-й копии скрипт из файла удаляет самую старую копию, поддерживая тем самым постоянное число 7.

    2 ноября 2007 г. 8:40

Ответы

  • Честно говоря, не заморачивался с backup-ом в один файл. И поступил ТУПО (по принципу KISS):

     

    Образец кода

    @echo off
    setlocal ENABLEDELAYEDEXPANSION

    rem Path to backup place. In this place need exist backup job file "Backup User.bks"
    set BackPath=\\BackupSvr\Backup

     

    rem Number of rotations days
    set BDays=7

     

    ntbackup.exe backup "@%BackPath%\Backup User.bks" /n "Backup home of User" /d "Backup set for User home" /v:no /r:no /rs:no /hc:off /m normal /j "Daily backup User home" /l:n /f "%BackPath%\User.bkf"
    if ERRORLEVEL 1 exit %ERRORLEVEL%

     

    del %BackPath%\User-%BDays%.bkf

    for /L %%i in ( %BDays% ,-1,1 ) do (
         Set /A Prev=%%i-1
         ren "%BackPath%\User-!Prev!.bkf" User-%%i.bkf
    )

    ren "%BackPath%\User.bkf" User-0.bkf

     

     

     

    Вот так и ротирует. Если backup был не удачен, то логи не ротируют, поддерживая указанное количество файлов (backup-ов)

    24 декабря 2007 г. 15:21

Все ответы

  •  

    Сейчас как раз работаю над подобной задачей.

    Только решил реализовать несколько другую схему: в воскресенье делается полный бэкап, в течении недели - инкрементарный. Перед полным бэкапом .bkf-файл предыдущей недели жмется и скидывается на внешний накопитель, где хранится в течении необходимого времени (у нас - полгода).

    Скрипт (вернее - два скрипта) использующие ntbackup для резервного копирования почти дописал. Если интересна такая схема - как закончу, могу выложить.

    20 декабря 2007 г. 20:00
  • Для бухгалтерии решал похожую задачу... Нужны были бекапы полные, в течении месяца хранить, а чтобы самому не делать, да еще и дата была не одного и того же имени по стандартному ntbackup сделал следующее:

    (Писал на Visual C++ Express, который бесплатно с сайта майкрософт качается)

     

    Образец кода

    // regex_parse.cpp

    // compile with: /clr

    #using <system.dll>

    #include "stdafx.h"

    #include <stdio.h>

    #include "process.h"

    #include <time.h>

    #include "string.h"

    #include < stdlib.h >

    #include < vcclr.h >

    using namespace System;

    using namespace System::Text::RegularExpressions;

    int main()

    {

    /* Создание бекапа*/

    printf ("Creating BackUp\n");

    system ("ntbackup backup d:\\Base8.0 /f D:\\4Backup\\backup.bkf");

    /*struct tm *newtime;

    __time64_t long_time;

    _time64( &long_time );

    newtime = _localtime64( &long_time ); // C4996

    char buff[30];

    asctime_s( buff, sizeof(buff), newtime );

    printf ("Done BackUp at %.19s\n", buff);*/

    /*Операции с датой и именем*/

    char tmpbuf[9];

    /* printf ("Date=%s\n", _strdate(tmpbuf));*/

    _strdate(tmpbuf);

    /* Конверт чара в стринг */

    String ^systemstring = gcnew String(tmpbuf);

    String^ before = systemstring;

    /*Console::WriteLine("{0}", before);*/

    delete systemstring;

    /*Замена / на . */

    Regex^ digitRegex = gcnew Regex("(/)");

    String^ after = digitRegex->Replace(before, ".");

    /*Console::WriteLine("replace : {0}", after);*/

    String^ exep=".bkf"; /*Добавление .bkf в хвост*/

    String^ pris="\\\\filecenter\\e$\\Buhgalteriya\\"; /*Добавление сетевого пути в начало, !!!нельзя!!! руские буквы!*/

    String^ temp = pris+after+exep;

    Console::WriteLine("+exep : {0}", temp);

    /* Конверт с стринга на чар*/

    pin_ptr<const wchar_t> wch = PtrToStringChars(temp);

    /*printf_s("%S\n", wch);*/

    size_t convertedChars = 0;

    size_t sizeInBytes = ((temp->Length + 1) * 2);

    errno_t err = 0;

    char *ch = (char *)malloc(sizeInBytes);

    err = wcstombs_s(&convertedChars,

    ch, sizeInBytes,

    wch, sizeInBytes);

    if (err != 0)

    printf_s("wcstombs_s failed!\n");

    /*printf_s("%s\n", ch);*/

    /*Переименовка файла с фигни на дату*/

    char old [] = "D:\\4Backup\\backup.bkf";

    int result = rename( old, ch );

    if( result != 0 )

    printf( "Could not rename '%s'\n", old );

    else

    printf( "File '%s' renamed to '%s'\n", old, ch );

     

    /*Console::ReadKey();*/

    return 0;

    }

     

     

    Это первый скрипт, создающий бекапы так как мне надо, далее работает второй скрипт - который здесь в форуме уже описан, на PS - задача - удаление всех файлов, которым больше 30 дней...

    Ну так как я не особо грамотей в этом деле - возможно много лишнего или неправильно с точки зрения програмирования, у меня цель была чтобы работало и я мог только изредка посматривать правильность работы Smile

    P.S.: Все принтфы - лишние, меня просто ломало их коментарить, так как скрипт все равно по шедуллеру выполняется, плюс к этому, сначало организуется бекап на той же машине где и сами базы, а потом переносится с переименованием по сети на другую машину... Благо между ними 1Гб/с, могу себе даже больше позволить Smile

    24 декабря 2007 г. 12:48
  • Честно говоря, не заморачивался с backup-ом в один файл. И поступил ТУПО (по принципу KISS):

     

    Образец кода

    @echo off
    setlocal ENABLEDELAYEDEXPANSION

    rem Path to backup place. In this place need exist backup job file "Backup User.bks"
    set BackPath=\\BackupSvr\Backup

     

    rem Number of rotations days
    set BDays=7

     

    ntbackup.exe backup "@%BackPath%\Backup User.bks" /n "Backup home of User" /d "Backup set for User home" /v:no /r:no /rs:no /hc:off /m normal /j "Daily backup User home" /l:n /f "%BackPath%\User.bkf"
    if ERRORLEVEL 1 exit %ERRORLEVEL%

     

    del %BackPath%\User-%BDays%.bkf

    for /L %%i in ( %BDays% ,-1,1 ) do (
         Set /A Prev=%%i-1
         ren "%BackPath%\User-!Prev!.bkf" User-%%i.bkf
    )

    ren "%BackPath%\User.bkf" User-0.bkf

     

     

     

    Вот так и ротирует. Если backup был не удачен, то логи не ротируют, поддерживая указанное количество файлов (backup-ов)

    24 декабря 2007 г. 15:21