Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
— |
ru:technical_manual:app:script_example [2023/03/16 12:20] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Пример скрипта создания резервных копий баз данных ====== | ||
+ | Запуск скрипта с необходимой периодичностью осуществляется на сервере баз данных с помощью "Назначенных заданий" 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". | ||
+ | |||
+ | Скрипт работает по следующей схеме: | ||
+ | |||
+ | - Создается резервная копия, имя файла при этом формируется следующим образом: "Имя_базы_ДД_ММ_ГГГГ.db". База сохраняется локально, путь к базе данных указывается в переменной %BACKUP%. Создаются лог-файлы резервного копирования для каждой базы в виде "log_autobackupsql_<Имя_базы>.txt" и общий лог-файл "backup_log.txt", путь к папке для хранения лог-файлов указывается в переменной %LOG%. \\ | ||
+ | - Созданный файл запаковывается архиватором. Расположение архиватора указывается переменной %RAR%.\\ | ||
+ | - Созданный архив копируется на два указанных сетевых источника хранения архивов: переменные %PATH01% и %PATH02%. Если путь не указан, копирование архива не производится. \\ | ||
+ | - Архивы, созданные ранее определенного количества дней, удаляются. Утилита для удаления указывается в переменной %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=," <nowiki>%%</nowiki>i in (Bases.txt) do ( | ||
+ | |||
+ | set Database=<nowiki>%%</nowiki>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=. " <nowiki>%%</nowiki>i in %%('%%date /t') do set longdate=<nowiki>%%</nowiki>i<nowiki>%%</nowiki>j<nowiki>%%</nowiki>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 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | [<contextnavigator>] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | {(rater>id=ru_technical_manual_app_script_example|name=Пример скрипта создания резервных копий баз данных|type=vote|trace=ip|headline=off)} |