Skrypt do backupu Microsoft SQLa
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 :-)