MSSQL Express pozbawionych jest części funkcjonalności pełnej wersji MSSQL Server stąd tworzenie kopii zapasowych musi dobywać się inaczej.
Kopie będziemy wykonywać wywołując odpowiednie polecenie SQL w bazie danych - wykorzystamy do tego sqlcmd.exe. Odopwiednie polecenia umieściemy w skryptach BAT, które będą wywoływane z harmonogramu zadań. Ważnym jest by użytkownik w którego harmonogramie znajdą się wywołania skryptów mógł łączyć się do bazy MSSQL za pomocą uwierzytelniania Windows.
Tworzymy odpowiednie pliki BAT zawierające polecenie utworzenia pliku z bazą:
sqlcmd -E -S KOMPUTER\OPTIMA -Q "BACKUP DATABASE nazwa_bazy TO DISK = N'c:\bck\nazwa_bazy.BAC' WITH NOFORMAT, NOINIT, NAME = 'nazwa_bazy', SKIP, NOREWIND, STATS=10"
Poniższy wariant dodaje do nazwy pliku z kopią datę i godzinę utworzenia pliku.
sqlcmd -E -S KOMPUTER\OPTIMA -Q "BACKUP DATABASE nazwa_bazy TO DISK = N'c:\bck\nazwa_bazy_%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%.BAC' WITH NOFORMAT, NOINIT, NAME = 'nazwa_bazy', SKIP, NOREWIND, STATS=10"
Windows domyślnie podaje godzinę w formacie HMM wstawiając spację przed godzinę jeśli godzina jest jednocyfrowa - bardzo utrudnia to sortowanie po nazwie pliku. Problem ten można rozwiązać w następujący sposób:
set tmptime=%time: =0%
i używając tmptime zamiast TIME, poniżej zmodyfikowany przykład:
set tmptime=%time: =0%
sqlcmd -E -S KOMPUTER\OPTIMA -Q "BACKUP DATABASE nazwa_bazy TO DISK = N'c:\bck\nazwa_bazy_%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%tmptime:~0,2%%tmptime:~3,2%.BAC' WITH NOFORMAT, NOINIT, NAME = 'nazwa_bazy', SKIP, NOREWIND, STATS=10"
Dodajemy nasz plik bat do harmonogramu zadań by wykonywał kopię codziennie o zadanej godzinie
Korzystając z WSL instalujemy na Windowsie jakąś dystrybucję Linuxa w której instalujemy ssh. Następnie na maszynie, która będzie zbierała i składowała pliki z kopiami dodajemy do crontaba skrypt:
#!/bin/bash
SOURCE="tomek@HOST_Z_WINDOWS:/mnt/c/bck/"
DESTINATION="/backup/WSL"
while [ 1 ]
do
rsync \
-z # jeśli korzystamy z połączenia przez Internet
--delete \
--omit-dir-times \
--archive \
--compress \
--progress \
--partial \
--human-readable \
"$SOURCE" \
"$DESTINATION"
# if [ "$?" -gt 128 ] ; then
# echo "*** Kod błędu -gt 128: $?"
# echo "SIGINT detected. Breaking while loop and exiting."
# break
# elif [ "$?" -eq 0 ] ; then
if [ "$?" -eq 0 ] ; then
echo "rsync completed normally for /mnt/c/bck/"
ssh tomek@192.168.246.106 rm /mnt/c/bck/*
exit
else
echo "rsync failure for /mnt/c/bck. reestablishing connection after 5 seconds"
sleep 5
fi
done