Automatyczne tworzenie kopii baz w MSSQL Express

MSSQL Express pozbawionych jest części funkcjonalności pełnej wersji MSSQL Server stąd tworzenie kopii zapasowych musi dobywać się inaczej.

Założenia

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.

Skrypty

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"

Tworzenie kopii

Dodajemy nasz plik bat do harmonogramu zadań by wykonywał kopię codziennie o zadanej godzinie

Zgrywaie kopii

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

Poprzedni wpis Następny wpis