SQL Server. Odtwarzanie baz danych. Utwórz bazę danych CW. Utwórz w niej tabelę T1(p1 INT PRIMARY KEY, p2 INT) i wpisz wiersz (1,100). Sprawdź ścieżkę dostępu do plików bazy (np. we właściwościach bazy danych). CREATE DATABASE CW CREATE TABLE T1(p1 INT PRIMARY KEY, p2 INT) INSERT INTO T1 VALUES (1,100) Zadanie 1 Odtwarzanie systemu bazy danych po awarii dysku z danymi (zakładamy, że dysk z dziennikiem transakcji nie uległ uszkodzeniu). 1) Utwórz pełną kopię zapasową bazy CW do pliku tymczasowego CW_pelna.bak. BACKUP DATABASE CW TO DISK='C:\...\CW_pelna.bak' (np. na pulpit) 2) Dopisz wiersz (2,200) do tabeli T1. 3) Wykonaj różnicową kopię zapasową bazy CW do pliku tymczasowego CW_roznicowa1.bak. BACKUP DATABASE CW TO DISK='C:\...\CW_roznicowa1.bak' WITH DIFFERENTIAL 4) Dopisz wiersz (3,300) do tabeli T1. 5) Wykonaj drugą różnicową kopię zapasową bazy CW do pliku tymczasowego CW_roznicowa2.bak BACKUP DATABASE CW TO DISK='C:\...\CW_roznicowa2.bak' WITH DIFFERENTIAL 6) Dopisz wiersz (4,400) do tabeli T1. 7) Wykonaj kopię dziennika transakcji do pliku CW_log1.bak. BACKUP LOG CW TO DISK='C:\...\CW_log1.bak' 9) Dopisz wiersz (5,500) do tabeli T1. 10) Wykonaj kopię dziennika transakcji do pliku CW_log2.bak. BACKUP LOG CW TO DISK='C:\...\CW_log2.bak' 11) Dopisz wiersz (6,600) i (7,700) do tabeli T1. Zmieo bazę danych na MASTER. 12) Zatrzymaj serwer. Wykonaj symulację awarii: usuo plik CW.MDF.
13) Odtwórz bazę danych po awarii. Strategia odtwarzania: 1) Uruchom serwer. 2) Wykonaj kopię zapasową dziennika transakcji bazy CW, do pliku CW_log3.bak (koniecznie z opcją WITH NO_TRUNCATE!!! tylko z taką opcją można robid kopię w przypadku, gdy baza danych jest uszkodzona). BACKUP LOG CW TO DISK='C:\...\CW_log3.bak' WITH NO_TRUNCATE 3) Odtwórz bazę z kopii pełnej, można z opcją WITH NORECOVERY lub z WITH STANDBY='C:\Temp\x.xxx' (miejsce na dysku oraz nazwa pliku może byd dowolna, plik ten zostanie automatycznie skasowany). Ta ostatnia opcja umożliwia połączenie z bazą i odczytanie zawartości właśnie odtworzonego fragmentu bazy danych, np. RESTORE DATABASE CW FROM DISK='C:\...\CW_pelna.bak' Zamiast powyższego zdania SQL można byłoby wykonad takie (tylko baza nie byłaby dostępna nawet w trybie tylko do odczytu): RESTORE DATABASE CW FROM DISK='C:\...\CW_pelna.bak' WITH NORECOVERY Przy założeniu, że została użyta opcja STANDBY, do bazy można zaglądnąd: Uwaga! Przed dalszym odtwarzaniem należy "wrócid" do bazy MASTER (). 4) Odtwórz bazę z ostatniej kopii różnicowej (z opcją WITH NORECOVERY lub z WITH STANDBY='C:\Temp\x.xxx'). Możesz sprawdzid co zostało odtworzone. Zwród uwagę na to, że pierwsza kopia różnicowa nie jest potrzebna (druga zawiera wszystkie zmiany wykonane w bazie danych po utworzeniu ostatniej pełnej kopii zapasowej). RESTORE DATABASE CW FROM DISK='C:\...\CW_roznicowa2.bak' 5) Odtwórz bazę z pliku CW_log1.bak (z opcją WITH NORECOVERY lub z WITH STANDBY='C:\Temp\x.xxx'). Możesz sprawdzid co zostało odtworzone. Przy odtwarzaniu bazy
z kopii dziennika transakcji należy użyd wszystkich kopii dziennika (inaczej jak w przypadku kopii różnicowych). RESTORE DATABASE CW FROM DISK='C:\...\CW_log1.bak' 6) Odtwórz bazę z pliku CW_log2.bak (z opcją WITH NORECOVERY lub z WITH STANDBY='C:\Temp\x.xxx'). Możesz sprawdzid co zostało odtworzone. RESTORE DATABASE CW FROM DISK='C:\...\CW_log1.bak' 7) Odtwórz bazę danych z pliku CW_log3.bak z opcją WITH RECOVERY. RESTORE DATABASE CW FROM DISK='C:\...\CW_log3.bak' WITH RECOVERY Zadanie 2 Odtwarzanie systemu bazy danych do pewnego momentu. Odtwarzanie częściowe (wybranych grup plików). 1) Dodaj grupę plików o nazwie Grupa2 i umieśd w niej plik CW_gr2.ndf o nazwie logicznej CW_2. W grupie plików Grupa2 utwórz tabelę T2 (x1 int, x2 int). Dodaj grupę plików Grupa3 i umieśd w niej plik CW_gr3.ndf o nazwie logicznej cw_3, następnie w tej grupie utwórz tabelę T3(y1 int, y2 int). ADD FILEGROUP GRUPA2 ADD FILE (NAME = 'CW_2', FILENAME = 'C:\...\CW_GR2.NDF') TO FILEGROUP GRUPA2 ADD FILEGROUP GRUPA3 ADD FILE (NAME = 'CW_3', FILENAME = 'C:\...\CW_GR3.NDF') TO FILEGROUP GRUPA3
CREATE TABLE T2(x1 INT PRIMARY KEY, x2 INT) ON GRUPA2 CREATE TABLE T3(y1 INT PRIMARY KEY, y2 INT) ON GRUPA3 Wpisz do T2 i T3 jednakowe wiersze (1,100). INSERT INTO T2 VALUES(1,100) INSERT INTO T3 VALUES(1,100) 8) Zrób pełną kopię zapasową bazy CW. Dodaj do T2 i T3 wiersze (2,200) i (3,300). BACKUP DATABASE CW TO DISK='C:\...\CW_KOPIA.BAK' INSERT INTO T2 VALUES(2,200) INSERT INTO T3 VALUES(2,200) 9) Zapisz datę z godziną: SELECT GetDate() (możesz np. użyd tabeli pomocniczej). CREATE TABLE #POMOCNICZA(NR INT IDENTITY(1,1) PRIMARY KEY, CZAS DATETIME) INSERT INTO #POMOCNICZA(CZAS) VALUES(GETDATE()) SELECT * FROM #POMOCNICZA 10) Skasuj tabelę T2. Wstaw do T3 wiersze (4,400) i (5,500). DROP TABLE T2 INSERT INTO T3 VALUES(3,300) INSERT INTO T3 VALUES(4,400) 11) Odtwórz tabelę T2. Strategia odtwarzania tabeli T2 nie może byd oparta na odtworzeniu bazy danych z pełnej kopii i potem z kopii dziennika z zatrzymaniem na godzinie sprzed skasowania tabeli T2, ponieważ zostałyby utracone wszystkie inne transakcje z bazy danych wykonane po tej godzinie (w naszym przypadku jest to wstawienie wierszy (3,300) i (4,400) to T3). Właściwa strategia polega na odtworzeniu bazy danych do innej bazy i potem skopiowaniu tabeli T2. W przypadku dużych baz danych podzielonych na grupy plików można nawet nie odtwarzad całej bazy (mogłoby to zając nawet kilka godzin), tylko wybrane grupy plików. Uwaga grupa o nazwie PRIMARY (z plikiem *.MDF) musi byd zawsze odtworzona. Taka strategia będzie użyta w tym dwiczeniu. Należy zrobid kopię zapasową bieżącego dziennika transakcji z opcją COPY_ONLY (żeby bieżący dziennik nie został obcięty). BACKUP LOG CW TO DISK='D:\TEMP\CW_LOG.BAK' WITH COPY_ONLY Należy odtworzyd bazę danych CW z pełnej kopii do bazy z inną nazwą, np. CWA (zastosowane opcje to MOVE oraz NORECOVERY). Następnie należy odtworzyd bazę (a właściwie grupę plików PRIMARY i GRUPA2) z dziennika transakcji z opcją STOPAT = (tu podad zapisaną wcześniej godzinę). RESTORE DATABASE CWA FILEGROUP = 'GRUPA2'
FROM DISK='D:\TEMP\CW_KOPIA.BAK' WITH PARTIAL, NORECOVERY, MOVE 'CW' TO 'C:\...\CWA.MDF', -- grupa PRIMARY musi być zawsze odtworzona MOVE 'CW_2' TO 'C:\...\CWA_2.NDF', MOVE 'CW_LOG' TO 'C:\...\CWA_LOG.LDF' dziennik transakcji DECLARE @CZAS DATETIME SET @CZAS=(SELECT CZAS FROM #POMOCNICZA WHERE NR=1) RESTORE LOG CWA FROM DISK='C:\...\CW_LOG.BAK' WITH STOPAT = @CZAS, RECOVERY SELECT * INTO t2 FROM CWA.dbo.T2 Zadanie 3 Odtwarzanie systemu bazy danych do wybranej transakcji nazwanej. Bazę danych można odtworzyd do pewnej transakcji (włącznie lub wyłącznie), wykorzystując nazwane transakcje i opcja odtwarzania STOPATMARK lub STOPBEFOREMARK. Ilustrują to poniższe przykłady z Books Online: USE AdventureWorks BEGIN TRANSACTION ListPriceUpdate WITH MARK 'UPDATE Product list prices';-- opis podany w apostrofach jest opcjonalny UPDATE Production.Product SET ListPrice = ListPrice * 1.10 WHERE ProductNumber LIKE 'BK-%'; COMMIT TRANSACTION ListPriceUpdate; -- Time passes. Regular database -- and log backups are taken. -- An error occurs in the database. USE master -- Poniżej zastosowano odtwarzanie z tzw. trwałego pliku kopii zapasowych. -- Taki plik jest określany mianem device lub urządzenie i należy go -- najpierw utworzyć procedurą sp_addumpdevice. Jest to plik, który -- może być traktowany jak urządzenie, do którego można wstawić wiele kopii -- zapasowych bazy danych i dziennika transakcji. Kopie te są ponumerowane. -- Polecenie RESTORE HEADERONLY wypisuje zawartość -- takiego pliku urządzenia. RESTORE DATABASE AdventureWorks FROM AdventureWorksBackups podano tu nazwę urządzenia (pliku trwałego) WITH FILE = 3, NORECOVERY; -- 3 oznacza trzecią kopię w pliku kopii RESTORE LOG AdventureWorks FROM AdventureWorksBackups WITH FILE = 4, RECOVERY,
STOPATMARK = 'ListPriceUpdate'; Proszę przedwiczyd powyższy schemat odtwarzania na bazie danych CW.