Ребят, прошу прощения, если тема подобная была - никак не соображу даже, как сформулировать запрос поисковику
суть вопроса вот в чем: поскольку в MSSQL Express отсутствуют встроенные средства автоматизации резервного копировани, мне необходимо отработать скрипт, с помощью которого можно было бы осуществлять резервное копирование баз с него. Нашла шаблон подобного скрипта, но никак не удается заставить его работать. Мог бы кто-нибудь оценить, где в скрипте закралась ошибка?
Для работы скрипта используются:
• архиватор, в примере используется «WinRar»;
• утилита для удаления файлов, в примере используется «Forfiles.exe»
• файл «Bases.txt» со списком имен баз данных. Имя каждой базы записывается с новой строки.
Скрипт запускается непосредственно на SQL Server'e, имя инстанции SQL Server указывается в переменной %SQLSERVER%. Код SQL запускается с помощью утилиты «SQL Query Tool», путь к утилите указывается в переменной %ISQL%
Скрипт работает по следующей схеме:
1. Создается резервная копия, имя файла при этом формируется следующим обра-зом: «Имя_базы_ДД_ММ_ГГГГ.db». База сохраняется локально, путь к базе дан-ных указывается в переменной %BACKUP%. Создаются лог-файлы резервного копирования для каждой базы в виде «log_autobackupsql_<Имя_базы>.txt» и об-щий лог-файл «backup_log.txt», путь к папке для хранения лог-файлов указыва-ется в переменной %LOG%.
2. Созданный файл запаковывается архиватором. Расположение архиватора указы-вается переменной %RAR%.
3. Созданный архив копируется на два указанных сетевых источника хранения ар-хивов: переменные %PATH01% и %PATH02%. Если путь не указан, копирование архива не производится.
4. Архивы, созданные ранее определенного количества дней, удаляются. Утилита для удаления указывается в переменной %FORFILES%. Количество дней указывается в переменной %DAYS%.
============================================================
@echo off
set SQLSERVER=SQLEXPRESS
set ISQL=C:\Program Files\Microsoft SQL Server\90\Tools\Binn\OSQL.EXE
set BACKUP=C:\backup
set LOG=C:\backup\LOG
set RAR=C:\Program Files\WinRAR\Rar.exe
set FORFILES=C:\Program Files\forfiles\Forfiles.exe
set DAYS=3
rem Set PATH01=
rem Set PATH02=
rem Директория в которой будет создан SQL скрипт
set temp=C:\temp
rem Считывание названий баз из файла Bases.txt
for /F "eol=; tokens=1 delims=," %%i in (C:\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 change the value ISQL in the batch!
goto :EOF)
IF NOT EXIST "%RAR%" (echo Архиватор "%RAR%" не найден!
echo change the value RAR in the batch!
goto :EOF)
IF NOT EXIST "%FORFILES%" (echo Утилита "%FORFILES%" не найдена!
echo change the value FORFILES in the batch!
goto :EOF)
IF NOT EXIST "%BACKUP%" (echo Каталог бэкапов "%BACKUP%" не найден!
echo change the value BACKUP in the batch!
goto :EOF)
rem if NOT '%PATH01%'=='' (IF NOT EXIST "%PATH01%" (echo Каталог бэкапов "%PATH01%" не найден!
rem echo Поправьте значение переменной PATH01 в командном файле!
rem echo %date% %time% Поправьте значение переменной PATH01 в командном файле! >> %LOG%\backup_log.txt
rem set PATH01=)
rem )
rem if NOT '%PATH02%'=='' (IF NOT EXIST "%PATH02%" (echo Каталог бэкапов "%PATH02%" не найден!
rem echo Поправьте значение переменной PATH02 в командном файле!
rem echo %date% %time% Поправьте значение переменной PATH02 в командном файле! >> %LOG%\backup_log.txt
rem set PATH02=)
rem )
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 Date: %FileName%
echo SQL Server: %SQLServer%
echo DataBase: %Database%
echo.
echo 1. Making a back copie...
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%
rem ============================= 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. Archivating the back copie...
cd "%BACKUP%"
"%RAR%" a "%BACKUP%\%Database%_%FileName%" "%BACKUP%\*%FileName%.db" -rr -c -ep -av -idp -id -idc
echo.
echo 3. copying copies to the netstore...
if not '%PATH01%'=='' Call :CopyProc "%PATH01%"
if not '%PATH02%'=='' Call :CopyProc "%PATH02%"
echo.
echo 4. log
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 backup accomplished
if /i %i% NEQ 0 (Call elete)
goto :EOF
elete
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
===========================================================
в результате выполнения скрипта winrar в передается имя файла резервной копии, который подлежит архивированию, но winrar ругается, что файл, имя которого ему подсунуто скриптом на архивацию, не найден...
и самого файла резервной копии, похоже, в самом деле не создается...
суть вопроса вот в чем: поскольку в MSSQL Express отсутствуют встроенные средства автоматизации резервного копировани, мне необходимо отработать скрипт, с помощью которого можно было бы осуществлять резервное копирование баз с него. Нашла шаблон подобного скрипта, но никак не удается заставить его работать. Мог бы кто-нибудь оценить, где в скрипте закралась ошибка?
Для работы скрипта используются:
• архиватор, в примере используется «WinRar»;
• утилита для удаления файлов, в примере используется «Forfiles.exe»
• файл «Bases.txt» со списком имен баз данных. Имя каждой базы записывается с новой строки.
Скрипт запускается непосредственно на SQL Server'e, имя инстанции SQL Server указывается в переменной %SQLSERVER%. Код SQL запускается с помощью утилиты «SQL Query Tool», путь к утилите указывается в переменной %ISQL%
Скрипт работает по следующей схеме:
1. Создается резервная копия, имя файла при этом формируется следующим обра-зом: «Имя_базы_ДД_ММ_ГГГГ.db». База сохраняется локально, путь к базе дан-ных указывается в переменной %BACKUP%. Создаются лог-файлы резервного копирования для каждой базы в виде «log_autobackupsql_<Имя_базы>.txt» и об-щий лог-файл «backup_log.txt», путь к папке для хранения лог-файлов указыва-ется в переменной %LOG%.
2. Созданный файл запаковывается архиватором. Расположение архиватора указы-вается переменной %RAR%.
3. Созданный архив копируется на два указанных сетевых источника хранения ар-хивов: переменные %PATH01% и %PATH02%. Если путь не указан, копирование архива не производится.
4. Архивы, созданные ранее определенного количества дней, удаляются. Утилита для удаления указывается в переменной %FORFILES%. Количество дней указывается в переменной %DAYS%.
============================================================
@echo off
set SQLSERVER=SQLEXPRESS
set ISQL=C:\Program Files\Microsoft SQL Server\90\Tools\Binn\OSQL.EXE
set BACKUP=C:\backup
set LOG=C:\backup\LOG
set RAR=C:\Program Files\WinRAR\Rar.exe
set FORFILES=C:\Program Files\forfiles\Forfiles.exe
set DAYS=3
rem Set PATH01=
rem Set PATH02=
rem Директория в которой будет создан SQL скрипт
set temp=C:\temp
rem Считывание названий баз из файла Bases.txt
for /F "eol=; tokens=1 delims=," %%i in (C:\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 change the value ISQL in the batch!
goto :EOF)
IF NOT EXIST "%RAR%" (echo Архиватор "%RAR%" не найден!
echo change the value RAR in the batch!
goto :EOF)
IF NOT EXIST "%FORFILES%" (echo Утилита "%FORFILES%" не найдена!
echo change the value FORFILES in the batch!
goto :EOF)
IF NOT EXIST "%BACKUP%" (echo Каталог бэкапов "%BACKUP%" не найден!
echo change the value BACKUP in the batch!
goto :EOF)
rem if NOT '%PATH01%'=='' (IF NOT EXIST "%PATH01%" (echo Каталог бэкапов "%PATH01%" не найден!
rem echo Поправьте значение переменной PATH01 в командном файле!
rem echo %date% %time% Поправьте значение переменной PATH01 в командном файле! >> %LOG%\backup_log.txt
rem set PATH01=)
rem )
rem if NOT '%PATH02%'=='' (IF NOT EXIST "%PATH02%" (echo Каталог бэкапов "%PATH02%" не найден!
rem echo Поправьте значение переменной PATH02 в командном файле!
rem echo %date% %time% Поправьте значение переменной PATH02 в командном файле! >> %LOG%\backup_log.txt
rem set PATH02=)
rem )
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 Date: %FileName%
echo SQL Server: %SQLServer%
echo DataBase: %Database%
echo.
echo 1. Making a back copie...
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%
rem ============================= 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. Archivating the back copie...
cd "%BACKUP%"
"%RAR%" a "%BACKUP%\%Database%_%FileName%" "%BACKUP%\*%FileName%.db" -rr -c -ep -av -idp -id -idc
echo.
echo 3. copying copies to the netstore...
if not '%PATH01%'=='' Call :CopyProc "%PATH01%"
if not '%PATH02%'=='' Call :CopyProc "%PATH02%"
echo.
echo 4. log
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 backup accomplished
if /i %i% NEQ 0 (Call elete)
goto :EOF
elete
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
===========================================================
в результате выполнения скрипта winrar в передается имя файла резервной копии, который подлежит архивированию, но winrar ругается, что файл, имя которого ему подсунуто скриптом на архивацию, не найден...
и самого файла резервной копии, похоже, в самом деле не создается...