Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Резервное копирование MSSQL Express с помощью консольных ути

Автор: SvetlanaNikit
Дата сообщения: 30.01.2009 11:44
Ребят, прошу прощения, если тема подобная была - никак не соображу даже, как сформулировать запрос поисковику

суть вопроса вот в чем: поскольку в 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 ругается, что файл, имя которого ему подсунуто скриптом на архивацию, не найден...
и самого файла резервной копии, похоже, в самом деле не создается...
Автор: FL0od13
Дата сообщения: 30.01.2009 12:51
В чужом шаблоне, лично мне, лень разбираться...
Тем более такой батник очень страшно выглядит.

Я использую такой SQL-скрипт:
[more]

Код:
USE Master

DECLARE
    @curday        VARCHAR(2),        --Текущий день, для формирования имени файла нового архива
    @curmonth    VARCHAR(2),        --Текущий месяц, для формирования имени файла нового архива
    @curyear    VARCHAR(4),        --Текущий год, для формирования имени файла нового архива
    @oldday        VARCHAR(2),        --День, для формирования имени файла старого архива на удаление
    @oldmonth    VARCHAR(2),        --Месяц, для формирования имени файла старого архива на удаление
    @oldyear    VARCHAR(4),        --Год, для формирования имени файла старого архива на удаление
    @cmdrar        VARCHAR(1500),    --Команда для создания архива
    @cmdmkdir    VARCHAR(200),    --Команда для создания папки для архива
    @cmddel        VARCHAR(1500), --Команда на удаление старых архивов
    @dbname        VARCHAR(30),    --Имя базы для архивирования
    @archname    VARCHAR(30),    --Имя файла куды архивировать
    @archpath    VARCHAR(50),    --Путь к файлу архива
    @dayint        int,            --Интервал в днях для удаления старых архивов
    @daynum        int,            --День месяца, когда архивы будут записаны в папку месяца
    @pathtooutput VARCHAR(50)    --Путь к файлу для аттача к мылу

SELECT
    @dbname        = 'DB_NAME',
    @dayint     = 8,
    @daynum        = 15,
    @archpath    = '\\archive\Backups$\1c_sql\',
    @curday        = DATEPART(DD, GETDATE()),
    @curmonth    = DATEPART(MM, GETDATE()),
    @curyear    = DATEPART(YYYY, GETDATE()),
    @oldday        = DATEPART(DD, DATEADD(DD,-@dayint,GETDATE())),
    @oldmonth    = DATEPART(MM, DATEADD(DD,-@dayint,GETDATE())),
    @oldyear    = DATEPART(YYYY, DATEADD(DD,-@dayint,GETDATE())),
    @pathtooutput = 'd:\BackupDB.txt'

IF LEN(@curday) < 2
    BEGIN
        SELECT @curday = '0' + @curday
    END
IF LEN(@curmonth) < 2
    BEGIN
        SELECT @curmonth = '0' + @curmonth
    END
IF LEN(@oldday) < 2
    BEGIN
        SELECT @oldday = '0' + @oldday
    END
IF LEN(@oldmonth) < 2
    BEGIN
        SELECT @oldmonth = '0' + @oldmonth
    END

    BEGIN
        SELECT @archname = 'd:\' + @dbname + '.bak'
        BACKUP DATABASE @dbname TO DISK=@archname
        IF @curday = @daynum --Если день месяца равен заданному значению, то бэкапим в папку \\archive\Backups$\1c_sql_month\ + <ГОД>.<МЕСЯЦ>
            BEGIN
                SELECT @cmdmkdir = 'xp_cmdshell ''mkdir ' + '\\archive\Backups$\1c_sql_month\' + @curyear + '.' + @curmonth + ''''
                SELECT @cmdrar = 'xp_cmdshell ''"C:\Program Files\WinRAR\winrar.exe" a ' + '\\archive\Backups$\1c_sql_month\' + @curyear + '.' + @curmonth + '\' + @dbname + '-' + @curday + '-' + @curmonth + '-' + @curyear + '.rar ' + @archname + ' -m5 -df -ep -ibck -ilog' + @pathtooutput+' -y'''
                EXEC (@cmdmkdir)
                EXEC (@cmdrar)
            END
        ELSE -- Если день месяца не удовлетворяет условиям, то бэкапим в стандартную папку
            BEGIN
                SELECT @cmdrar = 'xp_cmdshell ''"C:\Program Files\WinRAR\winrar.exe" a ' + @archpath + @dbname + '-' + @curday + '-' + @curmonth + '-' + @curyear + '.rar ' + @archname + ' -m5 -df -ep -ibck -ilog' + @pathtooutput+' -y'''
                SELECT @cmddel = 'xp_cmdshell ''del "' + @archpath + @dbname + '-' + @oldday + '-' + @oldmonth + '-' + @oldyear + '.rar"''' --Пытаемся удалить старый бэкап
                exec (@cmdrar)
                EXEC (@cmddel)
            END
    END
GO
Автор: terry777
Дата сообщения: 15.05.2009 12:47
Попробуйте для этой цели Handy Backup Удобная вещь!

Страницы: 1

Предыдущая тема: Ошибка: [0x80004005-0x0004b9-0x000501]


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.