Natywny restore MSSQL w Amazon RDS
Artykuł ukazał się pierwotnie na blogu Chmurowiska.
Wiele aplikacji pracujących w chmurach korzysta z relacyjnych baz danych. Jeżeli już idziemy w chmury, to dlaczego nie skorzystać z baz danych zarządzanych przez dostawcę chmurowego. Zdejmuje to z nas wiele obowiązków takich jak backup czy dbanie o system operacyjny czy samo oprogramowanie serwera DB. Warto korzystać z takich dobrodziejstw.
W przypadku Amazon Web Services to usługa Amazon RDS. A wsród obsługiwanych silników baz danych jest…
MS SQL Server
Teoretycznie aklikacje współpracujące z MS SQL Server powinny korzystać z chmury Microsoft Azur. Pewnie tak. Ale nie zawsze można. Czasami reszta potrzebnych usług, z których korzysta nasze rozwiązanie jest dostępna tylko w AWS. Lub jest przez Amazon lepiej zaimplementowana, lepiej działa. Może jest też tańsza. Powodów, dla których chcielibyśmy skorzystać z MS SQL Servera w AWS może być wiele.
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 RMB (right mouse button) na wybranej bazie danych i próbujemy zrobić restore. Niestety, tak się nie da.
Jak odtworzyć bazę danych MS SQL z pliku bak w usłudze Amazon RDS
Wbrew pozorom nie jest to trudne. Możemy użyć natywnego restore z MS SQL. Trzeba przejść przez kilka kroków, ale się da.
Zakładam, że mamy już stworzoną bazę w usłudze RDS i jest gdzieś na naszym dysku plik bak z backupem bazy Microsoftu. Do testów może to być na przykład ten plik.
Będziemy potrzebowali trzech rzeczy:
- bucketa S3 do przechowywania naszego pliku bak
- roli umożliwiającej dostęp do tego koszyka
- w opcjach naszej instancji RDS dodaną SQLSERVER_BACKUP_RESTORE
Przygotowujemy nasz RDS.
- Mamy działającą instancję MS SQL Server. W naszym przypadku jest to MS SQL Server Express
- W konsoli RDS wchodzimy do OPTION GROUPS
- Klikam Create group
- Wpisujemy nazwę oraz opis. Jako Initial group (sqlserver-ex) – wybieramy odpowiednią dla naszego typu servera, który wybraliśmy. W naszym przypadku będzie to sqlserver-ex
- Wybieramy Engine version
Następnie klikamy Create
- Nasza OPTIONGROUP jest gotowa. No prawie.
Zaznaczamy ją i wybieramy Select group – > Add option
- Nie mamy za wielkiego wyboru, bierzemy więc opcję SQLSERVER_BACKUP_RESTORE
- Tworzymy nową rolę IAM
Create a new role
- Tutaj tworzymy bucket S3 dla naszych plików bak. Trzeba go utworzyć w tym samym regionie, w którym mamy naszą instancję bazy w RDS. Oczywiście wrzucamy tam też nasz plik bak.
Upewnijcie się proszę, że plik nie jest dostępny dla wszystkich. Szczególnie w przypadku, gdy jest to kopia jakiejś ważnej bazy. W razie czego przeczytajcie to i ewentualnie to.
- Wybieramy nasz bucket.
Jeżeli nie ma go na liście, przycisk Refresh powinien pomóc.
- W zależności od potrzeb ustawiamy, kiedy zmiana opcji ma się odbyć. My śmiało ustawiamy Yes – Apply immediately Jeżeli ustawimy No to zmiany będą wprowadzone dopiero w czasie wykonywania następnego maintenance.
- Klikamy ADD option I wracamy do liars naszych instancji RDS. Wybieramy naszą instancję, z menu Actions wybieramy Modify
i szukamy Option Group
w którym wybieramy oczywiście naszą grupę
i na samym dole klikamy Continue
Odtwarzamy dane
Tutaj przyda nam się MS SQL Management Studio, za pomocą którego będziemy odtwarzali dane. Można je pobrać na przykład tutaj.
- Łączymy się z naszym serwerem w AWS
Jeżeli nie będziecie mogli połączyć się z serwerem, sprawdzcie czy jest on dostępny publicznie (chyba że łączycie się z VPC, w którym jest wasz MS SQL)
oraz, że odpowiedni ruch jest dozwolony w Security Groups przypiętych do instancji RDS
- Zaznaczamy Databases i klikamy w New Query
Jeżeli rozwiniemy listę baz danych i popatrzymy w dostępne w bazie msdb procedury składowane
to znajdziemy tam właśnie między innymi procedurę do „restorowania” baz z plików bak. Mowa o rds_restore_database, którą za chwilę wykorzystamy.
Procedura ta przyjmuje 3 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.
- Wpisujemy więc jako zapytanie do bazy
exec msdb.dbo.rds_restore_database
@restore_db_name = <nazwa_bazy_danych>, @s3_arn_to_restore_from='<ścieżka_do_pliku_bak';
co w naszym przypadku wygląda następująco
exec msdb.dbo.rds_restore_database
@restore_db_name = 'myrestoreddb', @s3_arn_to_restore_from='arn:aws:s3:::sqlserverrestorebucket/WWideWorldImporters-Standard.bak';
i naciskamy przycisk Execute.
W ten sposób, jeżeli wszystko poszło dobrze, rozpoczęliśmy proces odtwarzania bazy danych.
Jako odpowiedź dostaniemy id procesu, który właśnie zainicjowaliśmy.
- Sprawdzamy 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.
exec msdb.dbo.rds_task_status @task_id = 3
Na początku będzie miał status INPROGRESS., a po zakończeniu operacji, jeżeli nie było żadnych problemów SUCCESS.
- W tym momencie nasza baza danych powinna być odtworzona i możemy rozpocząć z nią pracę.
A gdybyśmy chcieli w drugą stronę?
Jak wykonać backup MS SQL do pliku bak w usłudze Amazon RDS
Jeżeli robiliśmy restore, to właściwie wszystko mamy gotowe. Jeżeli nie to wróćcie do kroku Przygotowujemy nasz RDS
Robimy backup
Służy do tego procedura składowana rds_backup_database. Niezbędne parametry to sourcedbname oraz S3arntobackupto. W drugim musimy oczywiście podać także nazwę pliku, do którego wykonujemy nasz backup.
Wpisujemy więc nasze polecenie:
exec msdb.dbo.rds_backup_database @source_db_name='myrestoreddb', @S3_arn_to_backup_to='arn:aws:s3:::sqlserverrestorebucket/file.bak'
po chwili sprawdzamy stan operacji
exec msdb.dbo.rds_task_status @task_id = 5
i jeżeli jest zakończona sukcesem
w naszym buckecie S3 powinniśmy mieć backup naszej bazy
Czego się nie da zrobić
Między innymi nie da się, i to jest frustrujące, odtworzyć na jednej instancji RDS kilka razy tej samej bazy. Nawet jeżeli zmienimy nazwę bazy docelowej. A taka potrzeba wbrew pozorom zdarza się często.
Nie można więc także odtworzyć bazy, na tej samej instancji RDS, na której ten backup został wykonany.
Nie da się także np. wykonać backupu w oknie maintenance lub gdy Amazon robi snapshota z naszej bazy.
Natywny backup nie taki straszny
Jak widać operacje natywnego backupu i restore SQL Server w Amazon RDS nie są takie straszne i , może nie zawsze, ale można je dość łatwo wykonać.
Myślę, że szczególnie opcja restore może być przydatna. Często bowiem, podczas prac dostajemy plik bak z bazą i mamy nią pracować.
Być może MS SQL Server nie jest najpopularniejszą usługą, jeżeli chodzi o Amazon Web Services, ale dobrze jest w razie potrzeby wiedzieć, że taki mechanizm jest i tam dostępny. I mimo ograniczeń z niego korzystać.