Piaskownica programu SQL Server

9

Próbuję skonfigurować piaskownicę dla naszych programistów raportów, aby mogli w nich pracować. Mój obecny plan polega na „resetowaniu” bazy danych każdego wieczoru, ale nie jestem pewien, jak to zrobić. Przez reset rozumiem to, że zasadniczo chcę usunąć tabele użytkowników, widoki, procedury składowane itp. Ze wszystkich baz danych na serwerze oprócz jednej. Przypuszczam, że inną opcją byłoby również usunięcie i ponowne utworzenie bazy danych, ale jestem pewien, że oznaczałoby to także ponowne uzyskanie dostępu do wszystkich odpowiednich grup / osób z AD.

Naprawdę nie wiem, jaki byłby najlepszy sposób na zrobienie tego, więc mam nadzieję, że niektórzy z was będą w stanie przedstawić kilka dobrych pomysłów / sugestii. Dzięki.

Dla jasności zasadniczo chcemy to zrobić z naszą bazą danych: http://try.discourse.org/t/this-site-is-a-sandbox-it-is-reset-every-day/57 . Jedyną różnicą jest to, że nie chcemy codziennie odtwarzać naszych użytkowników.

Wersja: SQL Server 2008
Edition: Developer & Enterprise

Kocięta 0124
źródło

Odpowiedzi:

8

Innym pomysłem byłoby po prostu skonfigurowanie nocnego zadania, które tworzy kopię zapasową tylko i kopiuje i przywraca je na serwerze deweloperskim (lub na tym samym serwerze, jeśli masz tylko jeden, ale nie jest to świetny pomysł). Zaletą tego jest to, że przywracanie może przejść na dowolny serwer (lub wiele serwerów) i może być całkowicie oddzielone od dowolnej aktywności w podstawowej bazie danych.

Na serwerze 1:

BACKUP DATABASE db TO DISK = '\\someshare\file.bak' 
  WITH COPY_ONLY, INIT, COMPRESSION;

Na serwerze 2:

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY;

Może być konieczne dodanie MOVEpoleceń, jeśli układ dysku między serwerami jest inny (lub jeśli umieszczasz kopię na tym samym serwerze).

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'data_file_name' TO 'D:\somepath\somefile.mdf',
  MOVE 'log_file_name'  TO 'E:\somepath\somefile.ldf';

Jeśli przywracasz na tym samym serwerze, nie powinieneś mieć żadnych problemów z użytkownikami. Jeśli przywrócisz inny serwer, użytkownicy będą istnieć, ale logowania na poziomie serwera mogą nie istnieć. Istnieją skrypty, które to rozwiązują , oraz nowa funkcja w SQL Server 2012 ( Zawarte bazy danych ), która całkowicie eliminuje problem.

Aaron Bertrand
źródło
Mamy dev / prod, ale dev jest jedynym serwerem, na którym to się dzieje. Prod jest przeznaczony tylko do procesów gotowych do produkcji.
Kittoes0124
Jest to rozwiązanie, które wybrałbym, pamiętaj tylko, że w większości przypadków nie chcesz po prostu kopiować produkcji do środowiska programistycznego. Przygotuj środek (skrypt?), Który na przykład usunie lub zasłoni adresy e-mail użytkowników, dane kontaktowe itp. Nie chcesz, aby Twoi twórcy przypadkowo zaczęli wysyłać wiadomości e-mail do użytkowników.
zeroDivisible
5

Ponieważ masz instancję z silnikiem Enterprise Edition, użyłbym migawek bazy danych .

Umożliwi to szybkie i łatwe wycofanie zmian wprowadzonych w ciągu dnia, bez konieczności przywracania całej bazy danych.

Pamiętaj, że jeśli programiści planują ładowanie dużych zbiorów danych (brzmi, jakby nie byli?), Może to nie być odpowiednie.

Jon Seigel
źródło
Dlaczego nie byłoby właściwe, gdyby robili ładowanie dużych zbiorów danych? Nasz może załadować powiedzmy ... 8 milionów wierszy po 100 kolumn co jakiś czas (nawet jeśli „nie powinny” być), ale niekoniecznie chcemy im to uniemożliwić. Jedyne, na czym nam zależy, to to, że pod koniec dnia wszystko zostanie zniszczone.
Kittoes0124
2
@ Kittoes, ponieważ migawka musi być utrzymywana podczas zmiany danych źródłowych. W przypadku zmiany źródła musi pobrać istniejące strony ze źródła, aby zachować widok „przed”. Nie robi tego, dopóki dane źródłowe się nie zmienią (migawka używa rzadkiego pliku, który jest pusty, z wyjątkiem delt). Ta konserwacja może stać się dość droga. Zobacz, jak działają migawki bazy danych .
Aaron Bertrand
@AaronBertrand Ok, więc jeśli baza danych wzrośnie do 8 GB w ciągu dnia, to po przywróceniu migawki wszystkie nowe dane zostaną usunięte, ale baza danych nadal będzie mieć rozmiar 8 GB? Czy też nie rozumiem?
Kittoes0124
@Kittoes migawka jest tylko do odczytu, więc można tylko ładować nowe dane do źródłowej bazy danych. Jeśli dodać 8GB w ciągu dnia, to będzie nie być widoczny na migawce. Kiedy cofniesz / upuścisz migawkę, źródłowa baza danych będzie nadal miała 8 GB danych i będzie odpowiednio dopasowana. Jeśli następnie wykonasz kolejną migawkę, nowe dane będą widoczne. Jeśli usuniesz 8 GB w ciągu dnia, zostanie ono dodane do migawki.
Aaron Bertrand
1
@ Kittoes, jeśli masz na myśli, że chcesz cofnąć ładowanie danych o pojemności 8 GB, przywracając moment do momentu zrobienia migawki, tak, powinien przywrócić pliki danych do ich rozmiaru (czy naprawdę chcesz, aby pliki były znowu małe, więc możesz po prostu zwiększyć automatycznie, gdy jutro ponownie załadujesz 8 GB to kolejny problem). Ale nie przetestowałem tego scenariusza wprost. I jak wspomniałem w artykule, do którego nawiązałem, nie musi to być w pełni niezawodne, ponieważ zależy również od niezawodności podstawowej pamięci. Kopia zapasowa jest bezpieczniejszym sposobem na zrobienie tego.
Aaron Bertrand
0

Pozwól mi dodać kilka centów, aby zobaczyć, czy to ci pomoże:

W mojej firmie mamy tę samą sytuację, że każdej nocy programiści chcą odświeżyć bazy danych, z których korzystali przez cały dzień. Oznacza to, że mamy zestaw baz danych, których Dev nie dotyka - powiedzmy A i inny zestaw baz danych, które są dokładną kopią A, ale robią swoje, ale chcą się odświeżać każdej nocy - powiedzmy B . Dzieje się tak na 1 instancji pojedynczego serwera.

To, co wdrożyłem, to PROCES NOCNEGO PRZYWRACANIA, aby to osiągnąć. Oto jak to działa:

Utwórz tabelę sterowników z listą baz danych, które należy przywracać każdego wieczoru (jak wspomniałeś).

Tabela: nightly_restore (OriginalDB, RestoreDB, kopie zapasowe, enabled_YN, wyniki, PASS_FAIL)

Następnie możesz napisać trochę kodu TSQL, który będzie przeglądał listę baz danych z powyższej tabeli, a następnie przeprowadzać przywracanie i rejestrować wszelkie sukcesy lub niepowodzenia w wynikach i nieco 1 = pozytywny lub 0 = negatywny. Enabled_YN określi, czy baza danych wymaga przywrócenia, czy nie.

Jeśli w przyszłości pojawi się więcej baz danych, musisz po prostu wstawić je do tabeli i ustawić bit enable_YN na Y (włączony).

W ten sposób proces będzie bardziej elastyczny i łatwiej zarządzalny.

Jeśli chcesz SQL, który napisałem (jestem pewien, będziesz mógł go napisać :-)), po prostu ping mnie lub dodaj komentarz i podzielę się nim.

HTH

Kin Shah
źródło