Пример скрипта создания резервных копий баз данных

Запуск скрипта с необходимой периодичностью осуществляется на сервере баз данных с помощью "Назначенных заданий" Windows. Учетная запись, под которой запускается скрипт, должна обладать всеми необходимыми разрешениями для выполнения операции резервного копирования на сервере SQL, а также для записи файлов в указанные папки. Учетная запись, под которой запускается скрипт, должна обладать всеми необходимыми разрешениями для выполнения операции резервного копирования на сервере SQL, а также для записи файлов в указанные папки.

Для работы скрипта необходимы:

  • архиватор, в примере используется "WinRar";
  • утилита для удаления файлов, в примере используется "Forfiles.exe" из Windows Resource Kit;
  • файл "Bases.txt" со списком имен баз данных. Имя каждой базы записывается с новой строки.

Скрипт запускается непосредственно на SQL Server'e, имя инстанции SQL Server указывается в переменной %SQLSERVER%. Код SQL запускается с помощью утилиты "SQL Query Tool", путь к утилите указывается в переменной %ISQL%, например "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\OSQL.EXE".

Скрипт работает по следующей схеме:

  1. Создается резервная копия, имя файла при этом формируется следующим образом: "Имя_базы_ДД_ММ_ГГГГ.db". База сохраняется локально, путь к базе данных указывается в переменной %BACKUP%. Создаются лог-файлы резервного копирования для каждой базы в виде "log_autobackupsql_<Имя_базы>.txt" и общий лог-файл "backup_log.txt", путь к папке для хранения лог-файлов указывается в переменной %LOG%.
  2. Созданный файл запаковывается архиватором. Расположение архиватора указывается переменной %RAR%.
  3. Созданный архив копируется на два указанных сетевых источника хранения архивов: переменные %PATH01% и %PATH02%. Если путь не указан, копирование архива не производится.
  4. Архивы, созданные ранее определенного количества дней, удаляются. Утилита для удаления указывается в переменной %FORFILES%. Количество дней указывается в переменной %DAYS%.

Пример

@echo off

set SQLSERVER=<Имя_инстанции_SQL_Server>

set ISQL=<Имя_OSQL>

set BACKUP=<Путь_к_локальному_каталогу_резервных_копий>

set LOG=<Путь_к_папке_лог_файлов>

set RAR=%CD%\Rar.exe

set FORFILES=%CD%\Forfiles.exe

set DAYS=<Количество_дней>

Set PATH01=<Путь_сетевого_ресурса_1>

Set PATH02=<Путь_сетевого_ресурса_2>

 

remДиректория в которой будет создан SQL скрипт

set temp=%cd%

remСчитывание названий баз из файла Bases.txt

for /F "eol=; tokens=1 delims=," %%i in (Bases.txt) do (

set Database=%%i

call :BackUp)

goto :EOF

 

:BackUp

rem Проверки

IF NOT EXIST "%ISQL%" (echo Microsoft SQL Server Command Line Tool "%ISQL%" не найден!

echoПоправьте значение переменной ISQL в командном файле!

goto :EOF)

IF NOT EXIST "%RAR%" (echo Архиватор "%RAR%" не найден!

echoПоправьте значение переменной RAR в командном файле!

goto :EOF)

IF NOT EXIST "%FORFILES%" (echo Утилита "%FORFILES%" не найдена!

echoПоправьте значение переменной FORFILES в командном файле!

goto :EOF)

IF NOT EXIST "%BACKUP%" (echo Каталог бэкапов "%BACKUP%" не найден!

echoПоправьте значение переменной BACKUP в командном файле!

goto :EOF)

if NOT '%PATH01%'=='' (IF NOT EXIST "%PATH01%" (echo Каталог бэкапов "%PATH01%" не найден!

  echo Поправьте значение переменной PATH01 в командном файле!

  echo %date% %time% Поправьте значение переменной PATH01 в командном файле! » %LOG%\backup_log.txt

  set PATH01=)

)

if NOT '%PATH02%'=='' (IF NOT EXIST "%PATH02%" (echo Каталог бэкапов "%PATH02%" не найден!

  echo Поправьте значение переменной PATH02 в командном файле!

  echo %date% %time% Поправьте значение переменной PATH02 в командном файле! » %LOG%\backup_log.txt

  set PATH02=)

)

 

for /f "tokens=1-4 delims=. " %%i in ('date /t') do set longdate=%%i%%j%%k

 

set FileName=%longdate:~0,2%_%longdate:~2,2%_%longdate:~4,4%

rem дата в формате 2003_04_12

echoДата: %FileName%

echo SQL Server: %SQLServer%

echo База данных: %Database%

echo.

 

echo 1. Создание резервной копии…

set ArcSQL=%temp%\arcsrv.sql

echo USE master > %ArcSQL%

echo EXEC sp_addumpdevice 'disk', '%Database%_Backup', '%BACKUP%\%Database%_%FileName%.db' » %ArcSQL%

echo BACKUP DATABASE %DataBase% TO %Database%_Backup » %ArcSQL%

echo exec sp_dropdevice '%Database%_Backup' » %ArcSQL%

"%ISQL%"  -E -S %SQLServer% -d master -i %ArcSQL% -n -o %log%\log_autobackupsql_%Database%.txt

echo.

 

echo 2. Архивирование резервной копии…

cd "%BACKUP%"

"%RAR%" a "%BACKUP%\%Database%_%FileName%" "%BACKUP%\*%FileName%.db" -rr -c -ep -av -idp -id -idc

echo.

 

echo 3. Копирование резервных копий в сети…

if not '%PATH01%'=='' Call :CopyProc "%PATH01%"

if not '%PATH02%'=='' Call :CopyProc "%PATH02%"

echo.

 

echo 4. Лог результата копирования

set i=0

IF EXIST "%BACKUP%\%Database%_%FileName%.rar" (set /a i=%i%+1)

IF EXIST "%PATH01%\%Database%_%FileName%.rar" (set /a i=%i%+1)

IF EXIST "%PATH02%\%Database%_%FileName%.rar" (set /a i=%i%+1)

echo %Date% %time% - Backup %Database% завершен! Готово архивов: %i% из 3 » %log%\backup_log.txt

echo.

 

echo Резервное копирование завершено

 

if /i %i% NEQ 0 (Call :Delete)

goto :EOF

 

:Delete

echo Удаление…

"%forfiles%"  -p"%Backup%"  -s -m*.rar -d-%DAYS% -c"CMD /C del @PATH\@FILE"

if not '%PATH01%'=='' ("%forfiles%"  -p"%PATH01%"  -s -m*.rar -d-90 -c"CMD /C del @PATH\@FILE")

if not '%PATH02%'=='' ("%forfiles%"  -p"%PATH02%"  -s -m*.rar -d-90 -c"CMD /C del @PATH\@FILE")

del"%BACKUP%\*.db"

goto :EOF

 

:CopyProc

echo Копирование… %1

copy "%BACKUP%\%Database%_%FileName%.rar" %1

goto :EOF

 

:EOF

 

 
Driven by DokuWiki