Skrypt do backupu Microsoft SQLa

31 lipca, 2012 (09:15) | windows | By: konrad

O tym, że kopie zapasowe są niezbędnym elementem każdego środowiska IT, nie trzeba chyba przekonywać nikogo. Nawet najbardziej oporni na wiedzę techniczną dyrektorzy zdają sobie sprawę, że sprzęt to materia na tyle złośliwa, że potrafi się popsuć w najmniej odpowiednim momencie. No, chyba że ja miałem do tej pory wyjątkowe szczęście i spotykałem na swojej drodze wyjątkowo rozsądnych ludzi, ale z tego powodu płakał jakoś specjalnie nie będę. Jednak pomimo sporej świadomości kadry zarządzającej o konieczności tworzenia kopii zapasowych, próba wydania jakichkolwiek pieniędzy na oprogramowanie służące temu celowi często kończy się porażką.

Narzędzi do wykonywania kopii zapasowych samych systemów, jak i poszczególnych jego części, jest bardzo wiele. W przypadku Microsoft SQLa jest BackupExec Symanteca, jest Data Protection Manager Microsoftu i pewnie wiele innych produktów, które – poza tym, że potrafią wykonać tytułową kopię bezpieczeństwa – łączy jedna cecha – są płatne. O ile w przypadku dużej korporacji, przekonanie działu finansowego do takiego wydatku jest jak najbardziej realne, to dla małych, kilkuosobowych firm, DPM (lub inny tego typu produkt) może być znaczącą pozycją w budżecie IT. Jeżeli takowy w ogóle istnieje. Na szczęście jest kilka metod, za pomocą których możemy wykonywać kopie zapasowe, nie kupując specjalizowanego oprogramowania.

W przypadku MSSQLa najłatwiej wykonać taką operację za pomocą skryptu w T-SQL uruchamianego z poziomu Windowsowego Harmonogramu Zadań. Ponieważ jestem zbyt leniwy, żeby pisać coś samemu, poprosiłem Wujka Google o gotowca i w odpowiedzi na moje błagania dostałem takiego oto linka. To, co prezentuję poniżej to bardzo delikatnie zmieniony skrypt ze wspomnianej przed chwilą strony:

-- slightly modified script from www.mssqltips.com site
-- (http://www.mssqltips.com/sqlservertip/1070/simple-script-to-backup-all-sql-server-databases)
DECLARE	@hostname VARCHAR(20)		-- hostname of a server
DECLARE	@db_name VARCHAR(50)		-- database name 
DECLARE	@backup_path VARCHAR(256)	-- path for backup files 
DECLARE	@backup_file VARCHAR(256)	-- filename for backup 
DECLARE	@current_date VARCHAR(20)	-- used for file name

SET @backup_path = 'd:\backup' 
SET @current_date = CONVERT(VARCHAR(20), GETDATE(), 112)
SET @hostname = HOST_NAME()

DECLARE db_cursor CURSOR FOR 
  SELECT name 
    FROM master.dbo.sysdatabases 
    WHERE name NOT IN ('master','model','msdb','tempdb') 

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @db_name
WHILE @@FETCH_STATUS = 0  
BEGIN 
  SET @backup_file = @backup_path + "\" + @hostname + '-' + @current_date + '-' + @db_name + '.BAK' 
  BACKUP DATABASE @db_name TO DISK = @backup_file
  FETCH NEXT FROM db_cursor INTO @db_name
END  

CLOSE db_cursor  
DEALLOCATE db_cursor

Jak to wykorzystać w praktyce? Najłatwiej umieścić w jakimś pliku (u mnie jest to c:\scripts\mssql_backup.sql) i dodać do harmonogramu cykliczne wywołanie, np. za pomocą sqlcmd. Niemiłą niespodzianką, która może nas przy takiej konfiguracji spotkać, to brak miejsca na dysku z kopiami zapasowymi, ponieważ powyższy mechanizm nie umie kasować najstarszych plików z utworzonymi przed siebie kopiami. Żeby sobie poradzić także z tym problemem, napisałem jeszcze jeden, prościutki skrypt, który wygląda tak:

forfiles -p "d:\backup" -s -m *.* -d -15 -c "cmd /c del @path"
sqlcmd -S NAZWA_SERWERA_MSSQL -i "c:\scripts\mssql_backup.sql" -o "c:\scripts\mssql_backup_last.txt"

Wystarczy już tylko „zaplanować” odpowiednie zadanie, i kopie zapasowe baz danych będą się robić automagicznie. Musimy oczywiście zadbać o to, żeby pliki z kopiami znalazły się na innej maszynie niż ta, którą zabezpieczamy, bo inaczej robienie kopii ma niewielki sens :-)

Trackback URL: http://konrad.bechler.pl/2012/07/skrypt-do-backupu-microsoft-sqla/trackback/

«

»

Write a comment





*