Czy powinienem migrować dane przy użyciu odłączania / kopiowania / dołączania lub poprzez tworzenie kopii zapasowych-przywracanie-odtwarzanie?

17

Mam zamiar rozpocząć migrację plików bazy danych do nowej sieci SAN (ze starej sieci SAN) i mam kilka opcji, aby to zaimplementować. (1) Zasugerowano, żebym przyjrzał się poziomowi przywracania pełnej kopii zapasowej do nowej bazy danych na serwerze. Jednak (2) moim pierwotnym planem było skopiowanie plików ze starej sieci SAN do nowej sieci SAN poprzez odłączenie, a następnie ponowne podłączenie bazy danych.

Mój żołądek mówi mi, że wolę odłączyć, skopiować i dołączyć, ponieważ wydaje się bardziej bezpieczny w razie awarii, ale to może być moja naiwność. Nie chcę przegapić transakcji ani w jakiś sposób „coś zepsuć” podczas zmiany nazwy baz danych.

Wydaje mi się, że moje pytanie brzmi, czy jestem uzasadniony moim sceptycyzmem wobec opcji BACKUP-RESTORE-Replay i jakie są inne zalety lub ryzyko związane z tą opcją?

swasheck
źródło

Odpowiedzi:

16

Osobiście unikałbym mechanizmów odłączania / dołączania. Zwłaszcza w SQL Server 2000 po prostu nie ufam, że zawsze przywrócisz serwer i będziesz mógł załączyć te pliki. Słyszałem wiele historii, w których nie stało się to czysto - tylko dlatego, że masz Plan B, nie czyni automatycznie Planu A sensownym.

Dzięki kopii zapasowej / przywracaniu nie musisz ryzykować konieczności przejścia do planu B. Jeśli tworzenie kopii zapasowej się nie powiedzie, baza danych nadal działa. Jeśli przywracanie nie powiedzie się, Twoja stara baza danych nadal działa. W obu przypadkach możesz przywrócić działanie oryginalnej bazy danych i ponownie przejrzeć plan później. Oprócz dodatkowych zabezpieczeń związanych z zatrzymywaniem programu SQL Server i / lub odłączaniem, oznacza to również, że możesz przetestować hoo-has z metod tworzenia kopii zapasowych / przywracania (zakładając, że masz teraz miejsce na wykonanie kopii zapasowych i inną instancję do przetestowania przywracać). Naprawdę nie można przetestować metody odłączania bez odłączenia baz danych lub zatrzymania programu SQL Server, a to jest trudne do wykonania poza odpowiednim oknem konserwacji. I na koniec, przy innych podejściach, nie możesz nawet rozpocząć kopiowania plików, dopóki nie odłączysz lub nie obniżysz programu SQL Server.

Kolejna korzyść w porównaniu z metodą wyciągania napędu z SQL-Servera: dzięki funkcji tworzenia kopii zapasowych / przywracania możesz przenosić różne pliki na inne litery dysków niż wcześniej. Na przykład, gdy przeprowadziliśmy migrację do nowej sieci SAN, mogliśmy mieć więcej woluminów, abyśmy mogli przenieść tempdb do T: \ (który wcześniej nie istniał), niektóre dane i pliki dziennika na nowe litery dysków itp. aby lepiej wykorzystać całą naszą nową pojemność wejścia / wyjścia. Jeśli po prostu zamkniesz program SQL Server, a następnie wymienisz dyski, musisz mieć te same litery dysków i tę samą liczbę woluminów.

Aaron Bertrand
źródło
7

Kiedyś prawie zawsze przenosiłem bazy danych z powodu rekonfiguracji SAN i migracji.

Zakładając, że przenosisz cały serwer na raz, wybrałbym coś w rodzaju ścieżki 2. (Jeśli przenosisz jedną bazę danych na raz i ostatecznie robisz każdą bazę danych na serwerze, byłoby to bardziej problematyczne, ponieważ musiałbyś zmieniać ścieżki do plików.)

Pamiętaj, że „single_user” niekoniecznie oznacza CIEBIE. Możesz przejść do bazy danych DBCC CHECKDB i nie możesz wejść, ponieważ ktoś już tam jest. Przygotuj skrypt, który możesz uruchomić, aby uruchomić bazę „wszyscy oprócz ciebie” z bazy danych i trzymaj ją w poręcznym miejscu. Zauważ, że SQL 2000 nie ma takich samych funkcji „trzymaj wszystkich na dystans”, co nowsze wersje.

Jedną ze starych sztuczek jest wstrzymanie usługi SQL Server. Zapobiegnie to nowym logowaniom, ale każdy, kto jest już podłączony, może kontynuować jak zwykle. Więc: połącz przez okno SSMS, abyś mógł wykonać pracę, a następnie wstrzymaj usługę, a następnie wykasuj niepożądane połączenia, zrób to za pomocą okna poleceń SSMS (nie GUI, tworzy i zrywa wiele połączeń), a następnie anuluj pauzę Serwis. Ostrzeżenie: nie jestem pewien, jak to by się rozegrało w klastrze. Może być konieczne przełączenie awaryjne.

Przydaje się mieć sposób na powstrzymanie wszystkich użytkowników aplikacji od serwera, dopóki nie skończysz swojej pracy. W przeciwnym razie połączenia mogą zacząć pojawiać się podczas próby wykonania różnych czynności, co może prowadzić do rywalizacji o zasoby i / lub spowolnienia. W przeszłości korzystałem z następujących sposobów, w zależności od dokładnej sytuacji: Wyłączanie serwerów aplikacji Korzystanie z ALTER DATABASE .. SET RESTRICTED_USER (Jeśli konta aplikacji należą do ról db_owner, sysadmin lub dbcreator, to problem. ) Informowanie użytkowników, że system będzie w trybie offline o określonej godzinie, na przykład w niedzielę rano. (To nie będzie działać w „prawdziwym” środowisku 24x7). Odłączanie karty sieciowej, która jest skierowana do serwerów aplikacji lub użytkowników. (W takim przypadku mogłem wejść przez inną kartę sieciową podłączoną do sieci tylko dla administratora lub przez ILO).

Odłączanie dużej liczby baz danych i ponowne ich podłączanie może być bardzo pracochłonne. Jeśli to zrobisz, upewnij się, że masz wcześniej napisany skrypt „załącz”.

Miałem wiele sukcesów, zatrzymując SQL Server, kopiując wszystko, zmieniając litery dysków i uruchamiając SQL Server. Bez odłączania / dołączania. Tak długo, jak SQL Server jest wyłączony i kopiujesz pliki (nie MOVING), nie możesz wpakować się w zbyt duże problemy, nawet jeśli przenosisz systemowe bazy danych. Ponieważ ścieżki są takie same, SQL Server nie zda sobie sprawy, że nic się nie zmieniło, gdy usługa była wyłączona. Upewnij się tylko, że litery dysków są skierowane z powrotem do odpowiednich woluminów, w przeciwnym razie wszystko pójdzie źle.

Moim najczęstszym problemem było niepoprawne sprawdzenie list ACL w katalogach plików. Nowocześniejsze wersje SQL Server lepiej ustawiają tylko uprawnienia, których potrzebuje konto usługi, podczas gdy starsze wersje wydają się mniej wybredne. Jeśli zapomnisz ustawić listy ACL, a konto usługi nie jest administratorem lokalnym (nie polecam tego), jedna lub więcej baz danych może się nie otworzyć podczas uruchamiania instancji. Nie panikuj, po prostu zmień listy ACL i dołącz bazę danych.

Generalnie używam ROBOCOPY do wykonywania tego rodzaju pracy. Istnieje przełącznik linii poleceń, aby zachować listy ACL.

Korzystanie z obliczeń / weryfikacji CRC nie jest złym pomysłem, ale nigdy tego nie zrobiłem. Kiedy bazy danych wrócą, uruchamiam CHECKDB () na wszystkich z nich. Zazwyczaj przygotowuję skrypt na ten temat z wyprzedzeniem, zamiast polegać na ręcznym rozpoczęciu prac konserwacyjnych. W ten sposób mogę najpierw sprawdzić kilka mniejszych baz danych, zanim sprawdzę dużą bazę danych, której uruchomienie może zająć wiele minut lub godzin. Wątpię, aby kontrola CRC (lub narzędzie do porównywania danych Redgate) znalazła coś, czego nie sprawdziłby CHECKDB (), a gdyby tak się stało, SQL Server nie byłby w stanie tego naprawić.

Po skopiowaniu plików, ale przed ponownym uruchomieniem instancji, przejdę i nieznacznie zmienię ścieżkę plików folderów OLD, zmieniając nazwę jednego z folderów. Jest to dodatkowe sprawdzenie problemu „ups, serwer nadal wskazuje stare pliki”.

Nie spiesz się, aby upuścić stare pliki i odzyskać miejsce na starej pamięci i upewnij się, że Twoje pełne kopie zapasowe zostały pomyślnie uruchomione. Przetestuj przywróć kilka kopii zapasowych w innym miejscu. Gdy masz już dobre polecenia checkdb () i dobre pełne kopie zapasowe, możesz pomyśleć o porzuceniu starej pamięci i wyłączeniu Lefthand.

Najgorsze problemy z tymi migracjami miały miejsce po tym, jak myślałem, że to koniec. To byłby administrator SAN, który powiedziałby mi, że coś się stało, a moje systemy plików zostały zaszyfrowane. (Ponownie podzielony, sformatowany, ponownie skopiowany).

Innym zabawnym problemem jest powolna sieć SAN bez wyraźnego powodu. Jeśli uważasz, że skopiowanie danych potrwa 10 godzin, a kopiowanie odbywa się w 30% o godzinie 9, masz problem. Obserwuj czasy przesyłania (robocopy pokazuje% skopiowanych i podaje szacunkowe czasy, lub możesz użyć Perfmon) i mieć plan awaryjny, jeśli coś pójdzie nie tak.

Nie jestem również pewien, czy woluminy zostaną podzielone na partycje, ale możesz mieć pewność, że używają przesunięcia o 1 MB. W systemie Windows Server 2008 i nowszych nie powinno to stanowić problemu. Tak jest w starszych systemach operacyjnych. Jest w tym mnóstwo rzeczy do przejrzenia, a twoi ludzie z magazynu powinni o tym wiedzieć, ale zapytam.

cieśnina Darina
źródło
2

Najpierw przyjrzałbym się opcji po prostu użycia funkcji macierzy pamięci do obsługi przenoszenia danych. Jeśli nie są one dostępne, ponieważ dostawca ich nie obsługuje, nie kupiłeś go lub administrator SAN nie wie, jak to zrobić ...

Następnie po prostu skorzystam z następujących kroków.

  1. Zaprezentuj nowy magazyn SQL Serverowi.
  2. Zatrzymaj usługi SQL
  3. KOPIUJ wszystkie dane ze starego dysku na nowy dysk (nie zapomnij podać uprawnień, jeśli używasz robocopy)
  4. Usuń litery dysków ze starych dysków.
  5. Zmień litery dysków na nowych dyskach, aby pasowały do ​​starych liter dysków
  6. Uruchom usługi SQL

Otóż ​​to.

Nie ma potrzeby odłączania / dołączania, ponieważ o ile SQL Server wie, nic się nie zmieniło. A jeśli coś pójdzie strasznie nie tak, masz starą kopię baz danych siedzącą na starej jednostce LUN na starej macierzy pamięci. Awaria jest tylko kwestią zmiany liter dysku.

mrdenny
źródło