Jak utorzyć snapshot bazy danych i jak z nim pracować?

18-Cze-2011

Snapshot to migawka. Snapshot bazy danych to jej stan z danej chwili. Można by powiedzieć, że kiedy wykonujesz kopię bazy danych to właściwie też tworzysz jej migawkę. Jednak wykonanie kopii potrafi zająć dłuższy czas, podczas gdy słowo migawka, kojarzy się nam chyba raczej z czymś błyskawicznym. Na czym więc polega snapshot i kiedy można z niego skorzystać?

Snapshot z punktu widzenia serwera SQL to pewna specyficzna baza danych. Na początku nie zawiera ona w sobie żadanych danych. Wszystkie dane znajdują się w oryginalnej bazie danych. Dopiero z czasem, kiedy oryginalna baza danych ulega zmianom, stare zawartości modyfikowanych stron bazy danych są przenoszone do pliku migawki.

Jeżeli oryginalna baza danych miała 3 pliki, w których przechowuje swoje dane, to migawka również będzie się składała z 3 plików. Przyjrzyjmy się przykładowi:

CREATE DATABASE AdventureWorksLT_SS
ON
(NAME=’AdventureWorksLT_Data’, FILENAME=’c:\temp\AdventureWorksLT_Data.ss’)
AS SNAPSHOT OF AdventureWorksLT

 Polecenie to utworzyło snapshot bazy danych AdventureWorksLT. Snapshot nazywa się AdventureWorksLT_SS. Ponieważ baza danych AdventureWorksLT posiadała tylko jeden plik z danymi, to snapshot też składa się tylko z jednego pliku. Migawki nie można modyfikować, a co za tym idzie nie jest jej potrzebny plik loga transakcyjnego. Snapshot odnajdziesz w SQL Server Management studio w okienku Object Explorer:

Plik snapshot ma teraz niewielki rozmiar, ale jeżeli podejrzysz jego właściwości w Exploratorze Windows zobaczysz:

Chociaż na dysku plik migawki zajmuje niewiele miejsca, to zarezerwowano dla niego już tyle miejsca ile zawiera oryginalny plik bazy danych. Jeżeli administrator zapomni o migawce, pojedzie na urlop, a użytkownicy będą normalnie pracować na bazie danych, to w efekcie wszystkie modyfikowane strony będą musiały przewędrować do pliku migawki.
Zaobserwujmy to:

USE AdventureWorksLT
UPDATE SalesLT.Product
 SET Name=UPPER(Name)

Rekordy w oryginalnej bazie danych zostały zmienione, a oryginalne strony są przenoszone do pliku migawki.

Można teraz porównać zawartość nowej tabeli (z oryginalnej bazy danych) z jej starą wersją (w migawce):
SELECT o.Name AS ‚Old name’, n.Name AS ‚New name’
FROM SalesLT.Product n
JOIN AdventureWorksLT_SS.SalesLT.Product o
ON n.ProductID = o.ProductID

Jak to się dzieje, że ze snapshota można odczytywać dane? Otóż kiedy zapytujesz o rekordy, które znajdują się na stronach już przeniesionych do pliku migawki, sprawa jest prosta. Serwer odczytuje potrzebne dane z migawki. Jeżeli zaś chcesz odczytać dane, które jeszcze nie zostały przeniesione do pliku migawki, to serwer dochodzi do wniosku, że widocznie te dane nie zmieniły się od chwili wykonania migawki, więc znajdują się w… oryginalnej bazie danych.

Wynika stąd wniosek, że snapshot nie nadaje się do wykonania kopii zapasowej na wypadek awarii dysku. Wszystkie dane znajdują się bowiem najprawdopodobniej w oryginalnym pliku bazy danych. Jeżeli oryginalny plik się uszkodzi, tracisz wszystkie znajdujące się w nim dane, zostaną jedynie strony, które zmieniły się od momentu wykonania migawki, a i znich w tym przypadku marna korzyść.

 Usunięcie migawki odbywa się poprzez polecenie:
DROP DATABASE AdventureWorksLT_SS

Komentarze:

  1. Mobilo » Blog Archive » Odtwarzanie bazy danych ze Snapshot-a napisał,

    […] Jak utorzyć snapshot bazy danych i jak z nim pracować? […]

Dodaj komentarz:

Autor: Rafał Kraik