Temat: backup za pomocą sqlcmd
No to ja na ten moment skończyłem.
Batch działa następująco:
1) Sprawdza z grubsza poprawność parametrów, na tej podstawie ustawia odpowiednie katalogi
2) Wykonuje pełny backup zawierający w nazwie pliku rodzaj backupu, nazwę bazy, datę wykonania. Do pliku logu (na początku ;) dodaje odpowiedni wpis.
2a) Kopiuje najświeższy backup jako "czysty" awaryjny. Robię to, gdyż się okazało z niewiadomych na razie powodów, że "nadpisanie" backupu, nawet pełnego, trwa w moim przypadku około 4x szybciej, niż gdy nie ma pliku. Pozwoliło mi to odpuścić temat szybkiego backupu z kompresją za pomocą msbp.exe.
3) Po wykonaniu POPRAWNYM (wg logu) wykonaniu backupu batch kasuje pliki, jeśli są starsze niż... i jest ich więcej niż... Kasowanie też jest logowane.
4) Jeśli coś się nie uda, to batch wyświetla okienko z komunikatem.
Do poprawienia w przyszłości jest na pewno zastąpienie "zaszytych" w skrypcie ustawień parametrami przesyłanymi z zewnątrz - np. rodzaj backupu, czy graniczny wiek plików i ich ilość. Wtedy w harmonogramie zadań chodziłby ten sam skrypt, z różnymi parametrami. A na razie mam 3 wersje.
Chyba też lepiej byłoby gdyby batch sprawdzał w MS SQL (a nie wg zadanej z góry listy) poprawność nazwy bazy danych.
No i parę "estetycznych" poprawek bym zrobił, bo niektóre operacje wykonuję dookoła z powodu niewiedzy.
Ostatnie pytanie, jakie mi się nasuwa, to czy nie warto dopisać backupów SystemDatabases (master, model, msdb, tempdb). Czy to może ułatwić w przyszłości odtwarzanie danych?
Jeśli się komuś przyda to załączam poprawiony batch:
CLS
@@ echo off
SET _instancja="WINSERVER\INSERTGT"
SET _rodzaj=Dzienny
SET _MaxPlikow=7
SET _MaxWiek=7
SET _baza=platnik
CALL :rodzajOK
CALL :bazaOK
CALL :BackUp
CALL :Kasowanie
SET _baza=Studio
CALL :rodzajOK
CALL :bazaOK
CALL :BackUp
CALL :Kasowanie
:: tu można dodać kolejne bazy
goto :stop
:BackUp
SET _katalog=C:\PlikiUdostepnione\Ksiegowosc\NaszeDane\AABackupy\%_rodzaj%\
SET _katawaryjny=C:\PlikiUdostepnione\Ksiegowosc\NaszeDane\AABackupy\Awaryjny\
IF NOT EXIST "%_katalog%" MD "%_katalog%"
IF NOT EXIST %_katawaryjny% MD %_katawaryjny%
SET _data=%DATE%
SET _plik=%_katalog%BCKP_%_rodzaj%_%_baza%_%_data%.dat
sqlcmd -S %_instancja% -Q "BACKUP DATABASE %_baza% TO DISK = '%_plik%' WITH NAME = '%_baza%_backup', FORMAT" -o %_katalog%temp.txt
COPY %_katalog%temp.txt %_katalog%temperr.txt
ECHO "backup %_katalog%BCKP_%_rodzaj%_%_baza%_%DATE%.dat wykonany o %TIME%" >> %_katalog%temp.txt
ECHO "---" >> %_katalog%temp.txt
COPY /Y %_katalog%temp.txt + %_katalog%log.txt %_katalog%temp2.txt
COPY /Y %_katalog%temp2.txt %_katalog%log.txt
rem zdarzenia wylaczajace kasowanie starszych backupow
rem albo nie istnieje plik backupu albo log nie zawiera słowa "successfully"
SET _BackUpSukces=0
IF EXIST %_plik% SET _BackUpSukces=1
FIND /C "successfully" %_katalog%temperr.txt | FIND ": 0" 1>NUL && SET _BackUpSukces=0
IF %_BackUpSukces% EQU 0 MSG * "Cos poszlo nie tak. Nie powstal backup %_rodzaj% bazy @%_baza%@ w dniu %_data%, albo log.txt nie zawiera frazy 'successfully'"
COPY %_plik% %_katawaryjny%Awaryjny_%_baza%.dat
goto :eof
:Kasowanie
del /Q %_katalog%temp*.txt
FOR /f "tokens=*" %%P IN ('dir %_katalog%BCKP_%_rodzaj%_%_baza%_*.dat /A-d /b') do (set /a _IloscPlikow+=1)
IF %_BackUpSukces% EQU 0 goto :eof
IF %_IloscPlikow% LEQ %_MaxPlikow% goto :eof
IF %_rodzaj% EQU "Miesieczny" goto :eof
IF %_rodzaj% EQU "Awaryjny" goto :eof
FORFILES /P %_katalog% /M BCKP_%_rodzaj%_%_baza%_*.dat /D -%_MaxWiek% /C "cmd /C del /Q @file & ECHO 'skasowane dnia %_data%'>>temp.txt @file "
COPY /Y %_katalog%temp.txt + %_katalog%log.txt %_katalog%temp2.txt
COPY /Y %_katalog%temp2.txt %_katalog%log.txt
goto :eof
:rodzajOK
IF %_rodzaj% EQU Testowy goto :eof
IF %_rodzaj% EQU Awaryjny goto :eof
IF %_rodzaj% EQU Miesieczny goto :eof
IF %_rodzaj% EQU Tygodniowy goto :eof
IF %_rodzaj% EQU Dzienny goto :eof
MSG * "Nieprawidłowy rodzaj backupu. %_rodzaj% nierozpoznany." & goto :stop
:bazaOK
IF %_baza% EQU platnik goto :eof
IF %_baza% EQU Studio goto :eof
IF %_baza% EQU PlatArch goto :eof
MSG * "Nieprawidłowa baza danych. %_baza% nierozpoznana." & goto :stop
:stop
IF EXIST %_katalog%temp*.txt del /Q %_katalog%temp*.txt
EXIT /B
adam tkocz edytował(a) ten post dnia 01.12.11 o godzinie 10:33