Strona Główna / Blog

Restore Bazy MS SQL w Amazon RDS? Pokazujemy, Jak to Zrobić!

Przemek Malak

Przemek Malak

AWS Architect (Development) w Chmurowisku. Ponad 18 lat w branży IT. Architekt rozwiązań chmurowych i mobilnych oraz Programista (przez duże P). Entuzjasta rozwiązań Serverless, posiadacz kilku certyfikacji AWS (Architect, Developer, SysOps).

Wiele aplikacji pracujących w chmurze korzysta z relacyjnych baz danych. A jeżeli już jesteśmy w chmurze, to dlaczego nie skorzystać z bazy zarządzanej przez dostawcę chmurowego?

W ten sposób pozbywamy się wielu żmudnych obowiązków takich jak backup czy konieczność dbania o system operacyjny lub oprogramowanie serwera DB. Warto ułatwiać sobie życie tam, gdzie jest taka możliwość.

W przypadku Amazon Web Services relacyjną bazą danych jest usługa Amazon RDS. A wśród obsługiwanych przez nią silników znajduje się… MS SQL.

Dzisiaj opowiem o tym, jak powiązać te dwa światy i wykonać natywny restore (i backup) danych z MS SQL na Amazon RDS. Pokażę Wam, jak wykonać następujące operacje:

  • Instalację bazy Amazon RDS – stworzenie grupy, wybór bucketa i przypisanie roli.
  • Odtworzenie danych na bazie.
  • Backup MS SQL do pliku bak w usłudze Amazon RDS.

MS SQL Server + AWS. Kilka powodów, dla których to ma sens.

Teoretycznie aplikacje współpracujące z MS SQL Server powinny korzystać z rozwiązań w chmurze Microsoft Azure. Nie zawsze jednak tak jest. Oto kilka powodów, dla których możecie potrzebować powiązać usługi AWS z silnikami MS SQL:

  • Brak wyboru. Czasami nasze rozwiązanie potrzebuje usług, które dostępne są wyłącznie w AWS.
  • Lepszy wybór. Niektóre usługi zostały przez Amazon lepiej zaimplementowane i w związku z tym bardziej nam odpowiadają.
  • Cena. A może cena rozwiązań od AWS jest korzystniejsza?

Tak naprawdę przyczyn może być więcej. Na szczęście nie obowiązuje tu żaden monopol.

Backup bazy MS SQL do pliku bak. Nie będzie aż tak łatwo…

Często zdarza się także, że nasza baza nie powstaje od podstaw. Możemy na przykład potrzebować odtworzyć istniejącą już wcześniej bazę danych. Robimy backup do pliku bak i chcemy z niego odtworzyć bazę w Amazon RDS.

Tworzymy więc bazę w AWS, uruchamiamy SQL Management Studio, łączymy się z usługą, klikamy prawy przycisk myszy na wybranej bazie danych i próbujemy zrobić restore… Niestety, aż tak łatwo nie będzie. Wystarczy jednak przejść przez kilka prostych kroków, które opisałem poniżej.

Jak odtworzyć bazę danych MS SQL z pliku bak w usłudze Amazon RDS?

Na początek kilka założeń. Scenariusz, który przedstawię, przyjmuje, że mamy już stworzoną bazę w usłudze RDS, a gdzieś na naszym dysku przechowujemy plik w formacie .bak z backupem bazy Microsoftu. Na potrzeby testów może to być na przykład ten plik.

Aby odtworzyć bazę, musimy spełnić trzy warunki:

  • Potrzebny nam bucket S3 do przechowywania naszego pliku
  • Musimy wyznaczyć rolę umożliwiającą dostęp do tego koszyka.
  • W opcjach naszej instancji RDS musimy dodać polecenie SQLSERVER_BACKUP_RESTORE.

Zatem do dzieła!

Krok 1. Przygotowujemy RDS

  1. Mamy przed sobą działającą instancję MS SQL Server. W naszym przypadku jest to MS SQL Server Express:

MySql-mydb-instance

W konsoli Amazon RDS wybieramy polecenie Option groups, aby rozpocząć konfigurację grupy dla naszej bazy (więcej o grupach opcji, w języku angielskim, możecie przeczytać w dokumentacji Amazona):

Amazon-RDB-MyOptions

  1. Następnie klikamy Create group, aby stworzyć nową grupę:Amazon-RDB-Create-Group
  2. Wpisujemy nazwę (np. BackupRestoreOption) oraz opis. Jako Engine wybieramy pozycję odpowiednią dla typu serwera, który wybraliśmy. W naszym przypadku będzie to sqlserver-ex:Amazon-RDB-Create-Option-Group
  3. W kolejnej sekcji wybieramy Engine version:Amazon-RDB-Create-Group-Engine-Version
  4. Następnie klikamy Create i nasza grupa jest prawie gotowa:Amazon-RDB-Create-Option-Group-Final

Pozostało nam jeszcze przypisać do niej opcję. Ponownie w menu RDS -> Option groups wybieramy naszą grupę, zaznaczamy ją i klikamy Add option.Amazon-RDB-Create-Option-Group-Add-Option

W naszym przypadku mamy tylko jedną pozycję, wybieramy więc opcję SQLSERVER_BACKUP_RESTORE, aby powiązać ją z grupą:Amazon-RDB-Create-Option-Group-SQL-Associate

Krok 2. Tworzymy nową rolę IAM

W następnym kroku musimy stworzyć nową rolę Identity and Access Management (IAM). Poniżej wybranej przed chwilą opcji wybieramy YES oraz  wpisujemy nazwę dla naszej nowej roli:

Amazon-RDB-IAM-Role

Krok 3. Przygotowujemy bucket S3

Kolejnym krokiem jest stworzenie bucketa S3 dla naszych plików bak. Co ważne, musimy go utworzyć w tym samym regionie, w którym mamy naszą instancję bazy w RDS. Oczywiście wrzucamy tam też nasz plik bak.

Jedna istotna sprawa: upewnijcie się, że plik nie jest dostępny dla wszystkich. Szczególnie w przypadku, gdy jest to kopia jakiejś ważnej bazy. W razie wątpliwości odsyłam do naszych artykułów o bezpiecznym przechowywaniu danych w Amazon S3 i zarządzaniu uprawnieniami.

Wracając do sedna:

  1. Wybieramy nasz bucket (jeżeli nie ma go na liście kliknięcie na Refresh powinno pomóc):Amazon-RDB-Choose-Bucket
  2. W zależności od potrzeb ustawiamy, kiedy nasze nowe ustawienia mają zostać wprowadzone. My śmiało ustawiamy opcję Yes – Apply immediately. Jeżeli ustawimy No, zmiany będą wprowadzone dopiero w czasie wykonywania następnych prac konserwacyjnych.MySql-mydb-instance Amazon-RDB-Apply-Immediately
  3. Klikamy Add option i wracamy do naszych instancji RDS. Wybieramy instancję, a następnie z menu Instance actions wybieramy Modify:Amazon-RDB-Modify-Option
  4. W oknie, które się pojawi, szukamy Option group:Amazon-RDB-Database-Optionsi wybieramy naszą grupę:Amazon-RDB-Modify-Option-Choose-GroupNa samym dole klikamy Continue, aby zatwierdzić.Po wykonaniu powyższych kroków jesteśmy gotowi na odtworzenie bazy w AWS.

    Odtwarzamy dane z MS SQL (rds_restore_database)

    Zanim przystąpimy do właściwej operacji, pobierzmy MS SQL Management Studio, za pomocą którego będziemy odtwarzali dane. Po pobraniu odpalamy narzędzie i zaczynamy!

    1. Łączymy się z naszym serwerem w AWS:Amazon-RDB-Server-Connect

Jeżeli będziecie mieli problemy z połączeniem, zweryfikujcie, czy serwer jest dostępny publicznie (chyba że łączycie się z VPC, w którym jest wasz MS SQL):

Amazon-RDB-Server-Public-Private

Sprawdźcie też, czy odpowiedni ruch jest dozwolony w Security Groups przypisanych do instancji RDS:

Amazon-RDB-Server-Traffic-Allowed

Kiedy się połączymy, zaznaczamy folder Databases i klikamy w opcję New Query:Amazon-RDB-Server-Data-QueryJeżeli rozwiniemy listę baz danych i popatrzymy na dostępne w bazie msdb procedury składowane, znajdziemy tam właśnie między innymi procedurę do odzyskiwania baz z plików bak. Mowa o rds_restore_database, którą za chwilę wykorzystamy:Amazon-RDB-rds_restore_database

Procedura rds_restore_database

Procedura ta przyjmuje trzy parametry, z czego wymagane są dwa – nazwa bazy danych oraz ścieżka do pliku, z którego będziemy odtwarzali bazę. Trzeci parametr to klucz KMS, z którego nie będziemy korzystali.

  1. Jako zapytanie do bazy wpisujemy:

W naszym przypadku wygląda ono następująco:

I naciskamy przycisk Execute.

W ten sposób, jeżeli wszystko poszło dobrze, rozpoczęliśmy proces odtwarzania bazy danych.

  1. Jako odpowiedź dostaniemy id procesu, który właśnie zainicjowaliśmy:Amazon-RDB-process-id
  2. Teraz musimy sprawdzić stan procesu. Możemy to zrobić za pomocą procedury rds_task_status. Jako parametr przekazujemy id naszego procesu. Wywołanie bez parametru zwróci stan wszystkich procesów.

    Amazon-RDB-rds_task_statusNa początku proces będzie miał status IN_PROGRESS., a po zakończeniu operacji, jeżeli nie wystąpią żadne problemy – SUCCESS:Amazon-RDB-rds_task_status-success
  3. W tym momencie nasza baza danych została odtworzona i możemy rozpocząć z nią pracę.Amazon-RDB-base-created

No dobrze, a co jeśli chcielibyśmy odwrócić sytuację i zrobić backup danych MS SQL do pliku bak w Amazon RDS? Da się? Da!

Jak wykonać backup MS SQL do pliku bak w usłudze Amazon RDS?

Jeżeli zrobiliśmy już restore bazy, to właściwie wszystko mamy gotowe. Jeżeli nie, to wróćmy do Kroku 1. Przygotowujemy RDS.

Do przywracania bazy używaliśmy polecenia rds_restore_database. Analogicznie, do backupu użyjemy procedury rds_backup_database.

Jej niezbędne parametry to sourcedbname oraz S3arntobackupto. W tym drugim musimy oczywiście podać także nazwę pliku, do którego wykonujemy nasz backup.

  1. Wpisujemy więc nasze polecenie:

  1. Po chwili sprawdzamy stan operacji:

  1. Jeżeli operacja zakończyła się sukcesem:Amazon-RDB-rds_backup_database

W naszym buckecie S3 powinniśmy teraz mieć backup bazy:Amazon-RDB-DB-Backup

MS SQL w Amazon RDS – Nie wszystko jest możliwe

Niestety scenariusz, który dziś omówiłem wiąże się z pewnymi ograniczeniami. Między innymi nie możemy (i jest to frustrujące) odtworzyć na jednej instancji RDS kilka razy tej samej bazy. Nawet jeżeli zmienimy nazwę bazy docelowej. A taka potrzeba wbrew pozorom powstaje stosunkowo często.

Nie mamy też możliwości odtwarzania bazy na tej samej instancji RDS, na której backup został wykonany. Ponadto nie możemy wykonać backupu w trakcie przerwy technicznej lub gdy Amazon robi snapshot naszej bazy.

Natywny backup nie taki straszny

Mimo tych ograniczeń, mam nadzieję, że udało mi się Was przekonać, że operacje natywnego backupu i odtworzenia danych MS SQL Server w Amazon RDS nie są takie straszne. Czasami naprawdę warto je wykonać.

Szczególnie opcja restore może być przydatna. Często bowiem zdarza się, że otrzymujemy plik bak z bazą, z którym przychodzi nam pracować.

Być może MS SQL Server nie jest najpopularniejszą usługą, jeżeli chodzi o Amazon Web Services, ale dobrze w razie potrzeby wiedzieć, że taki mechanizm jest i tam dostępny. I mimo pewnych ograniczeń umieć z niego korzystać. Teraz wiecie, od czego zacząć!

 

Dołącz do listy mailingowej!

Dołącz do naszego newslettera

Staramy się wysyłać tylko wartościowe informacje, np. co miesiąc dostaniesz spis najważniejszych nowości z chmur Azure, AWS i GCP, z krótkimi opisami i linkami.