Ćwiczenie — przywracanie do punktu w czasie
W tym ćwiczeniu dowiesz się, jak można odzyskać odzyskiwanie po typowym błędzie przy użyciu przywracania do punktu w czasie (PITR). Ten proces można łatwo wykonać w portalu lub programowo. W tym ćwiczeniu dowiesz się, jak to zrobić za pomocą interfejsu wiersza polecenia platformy Azure.
Konfiguracja: wdrażanie usługi Azure SQL Database przy użyciu skryptów
W terminalu po prawej stronie zobaczysz usługę Azure Cloud Shell, która jest sposobem interakcji z platformą Azure przy użyciu przeglądarki. Przed rozpoczęciem ćwiczeń musisz uruchomić tam skrypt w celu utworzenia środowiska: usługi Azure SQL Database, która zawiera bazę danych AdventureWorks. W skrypcie zostaną wyświetlone monity o podanie hasła i lokalnego adresu IP.
Wykonanie tych skryptów powinno zająć od trzech do pięciu minut. Pamiętaj, aby zanotować hasło, unikatowy identyfikator i region, ponieważ nie zostaną one ponownie wyświetlone.
Aby uzyskać wymagany adres IP, należy rozłączyć się z dowolną usługą sieci VPN i uruchomić polecenie
(Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content
w lokalnym oknie programu PowerShell (nie w tej przeglądarce). Zanotuj wynikowy adres IP.Uruchom poniższy skrypt w usłudze Azure Cloud Shell przy prawej krawędzi tej strony. Po wyświetleniu monitu wprowadź złożone hasło i publiczny adres IP.
$adminSqlLogin = "cloudadmin" $password = Read-Host "Your username is 'cloudadmin'. Please enter a password for your Azure SQL Database server that meets the password requirements" # Prompt for local IP address $ipAddress = Read-Host "Disconnect your VPN, open PowerShell on your machine and run '(Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content'. Please enter the value (include periods) next to 'Address': " # Get resource group and location and random string $resourceGroup = Get-AzResourceGroup | Where ResourceGroupName -like "<rgn>[sandbox resource group name]</rgn>" $resourceGroupName = "<rgn>[sandbox resource group name]</rgn>" $uniqueID = Get-Random -Minimum 100000 -Maximum 1000000 $storageAccountName = "mslearnsa"+$uniqueID $location = $resourceGroup.Location # The logical server name has to be unique in the system $serverName = "aw-server$($uniqueID)"
Uzyskaj dane wyjściowe i przechowaj (w pliku tekstowym lub podobnej lokalizacji) informacje, których będziesz potrzebować w całym module, uruchamiając następujący skrypt w usłudze Azure Cloud Shell. Prawdopodobnie po wklejeniu kodu trzeba będzie wybrać przycisk Enter, ponieważ ostatni wiersz nie zostanie uruchomiony domyślnie.
Write-Host "Please note your unique ID for future exercises in this module:" Write-Host $uniqueID Write-Host "Your resource group name is:" Write-Host $resourceGroupName Write-Host "Your resources were deployed in the following region:" Write-Host $location Write-Host "Your server name is:" Write-Host $serverName
Ważne
Pamiętaj o zanotowaniu hasła, unikatowego identyfikatora i regionu. Te informacje będą potrzebne w całym module.
Uruchom następujący skrypt, aby wdrożyć usługę Azure SQL Database i serwer logiczny z przykładem AdventureWorks. Ten skrypt dodaje również adres IP jako regułę zapory, włącza Microsoft Defender dla Chmury i tworzy konto magazynu do użycia w kolejnych lekcjach.
# The logical server name has to be unique in the system $serverName = "aw-server$($uniqueID)" # The sample database name $databaseName = "AdventureWorks" # The storage account name has to be unique in the system $storageAccountName = $("sql$($uniqueID)") # Create a new server with a system-wide unique server name $server = New-AzSqlServer -ResourceGroupName $resourceGroupName ` -ServerName $serverName ` -Location $location ` -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $adminSqlLogin, $(ConvertTo-SecureString -String $password -AsPlainText -Force)) # Create a server firewall rule that allows access from the specified IP range and all Azure services $serverFirewallRule = New-AzSqlServerFirewallRule ` -ResourceGroupName $resourceGroupName ` -ServerName $serverName ` -FirewallRuleName "AllowedIPs" ` -StartIpAddress $ipAddress -EndIpAddress $ipAddress $allowAzureIpsRule = New-AzSqlServerFirewallRule ` -ResourceGroupName $resourceGroupName ` -ServerName $serverName ` -AllowAllAzureIPs # Create a database $database = New-AzSqlDatabase -ResourceGroupName $resourceGroupName ` -ServerName $serverName ` -DatabaseName $databaseName ` -SampleName "AdventureWorksLT" ` -Edition "GeneralPurpose" -Vcore 2 -ComputeGeneration "Gen5" # Enable Azure Defender $azureDefender = Enable-AzSqlServerAdvancedDataSecurity ` -ResourceGroupName $resourceGroupName ` -ServerName $serverName # Create a storage account $storageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroupName ` -AccountName $storageAccountName ` -Location $location ` -Type "Standard_LRS"
Na komputerze lokalnym otwórz program SSMS i utwórz nowe połączenie z serwerem logicznym. W polu nazwy serwera wprowadź nazwę serwera logicznego usługi Azure SQL Database. Jeśli ta nazwa nie została przez Ciebie zanotowana, aby ją uzyskać, musisz odwiedzić witrynę Azure Portal. Na przykład:
aw-server\<unique ID>.database.windows.net
.Po przejściu do witryny Azure Portal w polu wyszukiwania możesz wprowadzić nazwę AdventureWorks, aby znaleźć bazę danych i skojarzony z nią serwer logiczny.
W polu Uwierzytelnianie wprowadź pozycję Uwierzytelnianie programu SQL Server. Wprowadź odpowiednie wartości w polach Identyfikator logowania i Hasło dla administratora serwera (podane podczas wdrażania w poprzednim ćwiczeniu).
Zaznacz pole Zapamiętaj hasło , a następnie wybierz pozycję Połącz.
Uwaga
W zależności od konfiguracji lokalnej (np. sieci VPN) adres IP klienta może się różnić od adresu IP, który był używany przez witrynę Azure Portal podczas wdrażania. W takim przypadku zostanie wyświetlony komunikat „Twój adres IP klienta nie ma dostępu do serwera. Zaloguj się do konta platformy Azure i utwórz nową regułę zapory, aby włączyć dostęp". Jeśli zostanie wyświetlony ten komunikat, zaloguj się przy użyciu konta używanego dla piaskownicy i dodaj regułę zapory dla adresu IP klienta. Te kroki można wykonać przy użyciu kreatora podręcznego w programie SSMS.
Wykonywanie przywracania do punktu w czasie
Przed kontynuowaniem ważne jest, aby zrozumieć zalecany proces przywracania do punktu w czasie:
- Tabela lub baza danych została przypadkowo usunięta.
- Określ czas, do którego należy wrócić; powinien to być przed wystąpieniami błędu.
- Wykonaj przywracanie do punktu w czasie za pomocą programu PowerShell lub witryny Azure Portal, aby wrócić do tego czasu. Ten proces spowoduje wdrożenie nowej bazy danych i przywrócenie kopii Twojej bazy danych. Na przykład: AdventureWorks-copy.
- Upewnij się, że nowa baza danych (na przykład AdventureWorks-copy) jest w prawidłowym stanie (tak jak przed wystąpieniem wypadku).
- Zmień nazwę oryginalnej bazy danych. Na przykład zmień nazwę AdventureWorks na AdventureWorks-old.
- Zmień nazwę nowej bazy danych na oryginalną nazwę. Na przykład zmień nazwę AdventureWorks-copy na AdventureWorks.
- Usuń oryginalną bazę danych. Na przykład: AdventureWorks-old.
W tym ćwiczeniu wykonasz te kroki.
Symulowanie usunięcia danych
Najpierw upewnijmy się, że tabela, którą przypadkowo usuniemy, istnieje i zawiera dane. Przyjrzyjmy się niektórym wartościom w tabeli SalesLT.OrderDetail.
Przejdź do programu SSMS i sprawdź/zaktualizuj połączenie. Wybierz pozycję Plik>Połącz Eksplorator obiektów, a następnie wybierz przycisk Opcje.
Upewnij się, że używane połączenie łączy się z serwerem logicznym, ale nie z określoną bazą danych. (Na przykład użyj polecenia <wartość domyślna> , jak pokazano na poniższym zrzucie ekranu). Upewnij się również, że karta Dodatkowe parametry połączenia nie zawiera żadnego tekstu.
Rozwiń folder Bazy danych, a następnie kliknij prawym przyciskiem myszy bazę danych AdventureWorks i wybierz pozycję Nowe zapytanie. Wprowadź następujące zapytanie i uruchom je, wybierając pozycję Wykonaj, a następnie przejrzyj wyniki:
SELECT TOP 10 * from SalesLT.SalesOrderDetail
Symuluj utratę danych przez usunięci tabeli w bazie danych.
W tym samym oknie zapytania uruchom to zapytanie, a następnie wybierz kartę Komunikaty w oknie Wyniki i zanotuj czas ukończenia:
DROP TABLE SalesLT.SalesOrderDetail
Ważne
Zapisz czas ukończenia. Będziesz jej potrzebować później. Oto przykład:
Completion time: 2020-06-22T09:20:27.1859237-07:00
.Na koniec przed rozpoczęciem kroków przywracania bazy danych uruchom następujący kod w usłudze Azure Cloud Shell po prawej stronie, aby skonfigurować środowisko:
$resourceGroup = Get-AzResourceGroup | Where ResourceGroupName -like <rgn>[sandbox resource group name]</rgn> $server = Get-AzureRmSqlServer -ResourceGroupName $resourceGroup.ResourceGroupName $logical_server = $server.ServerName $resource_group = $resourceGroup.ResourceGroupName # Specify your default resource group and Azure SQL Database logical server az configure --defaults group=$resource_group sql-server=$logical_server # Confirm the defaults are set az configure --list-defaults
Zwrócone parametry
group
isql-server
powinny być zgodne z nazwami grupy zasobów usługi Microsoft Learn i serwera logicznego usługi Azure SQL Database.
Identyfikowanie czasu przywracania bazy danych
Pierwszym krokiem jest ustalenie czasu przywrócenia bazy danych. Musisz wiedzieć, kiedy miała miejsce ostatnia „dobra” transakcja, zanim wystąpiła ta „zła”. Będziemy przywracać do momentu przed złą transakcją, ale po ostatniej dobrej.
Jednym ze sposobów określenia czasu upuszczania jest sprawdzenie czasu zakończenia instrukcji DROP, który został zanotowany w poprzednim kroku.
Alternatywnym sposobem jest użycie dzienników inspekcji w witrynie Azure Portal. W tym ćwiczeniu nie skonfigurowaliśmy inspekcji w usłudze Log Analytics, ale przyjrzyjmy się temu, co można zrobić, jeśli masz. Możesz przejść do bazy danych Azure SQL Database w witrynie Azure Portal. W okienku po lewej stronie w obszarze Zabezpieczenia możesz wybrać pozycję Inspekcja, a następnie wybrać pozycję Wyświetl dzienniki inspekcji. Następnie wybierając pozycję Log Analytics, zostaniesz przeniesiony do edytora zapytań, który umożliwia wykonywanie zapytań dotyczących dzienników przy użyciu język zapytań Kusto (KQL). Specjaliści ds. języka SQL mogą używać tego języka zapytań, aby łatwo wykonywać zapytania dotyczące dzienników.
Następnie można uruchomić następujące zapytanie KQL:
search database_name_s == "AdventureWorks" | where Category == 'SQLSecurityAuditEvents' and statement_s like 'DROP' | project format_datetime(event_time_t, 'yyyy-MM-dd hh:mm:ss.fff'), ResourceGroup, server_instance_name_s, database_name_s, statement_s, succeeded_s,client_ip_s, server_principal_name_s, application_name_s | sort by event_time_t desc
Wyniki powinny wyglądać podobnie do poniższych, ale z inną datą i godziną.
Uwaga
Wyświetlenie dzienników w tym miejscu może potrwać od 5 do 10 minut, więc na potrzeby tego ćwiczenia pominąliśmy go. Zamiast tego użyjesz czasu ukończenia zanotowany w poprzednim kroku. (Musisz przekonwertować go na GMT). W rzeczywistej sytuacji prawdopodobnie nie będziesz w stanie przejść do okna z czasem ukończenia, więc inspekcja może być świetną pomocą.
W tym przykładzie data/godzina pochodzi
2020-07-24 08:06:24.386
z usługi Log Analytics i2020-07-24T13:06:24.386-07:00
z programu SSMS. Wymagany format jest nieco inny. Użyj poniższego przykładu, aby określić poprawny format. Możesz również odjąć 0,001 sekundy, aby mieć pewność, że zostanie przywrócony stan przed wystąpieniem błędu.- Format usługi Log Analytics:
2020-07-24 08:06:24.386
- Format programu SSMS:
2020-07-24T13:06:24.386-07:00
- Wymagany format:
2020-07-24T20:06:24.385
- Format usługi Log Analytics:
Ustaw
$before_error_time
wartość wynikowa, podstawiając czas dla czasu w tym przykładzie:$before_error_time ="2020-07-24T20:06:24.385"
Przywracanie bazy danych i potwierdzanie brakujących danych
W tej sekcji użyjesz polecenia az cli db restore
, aby przywrócić bazę danych do czasu przed usunięciem tabeli.
Uruchom poniższy skrypt w terminalu po prawej stronie tego okna:
# Restore the database to a time before the database was deleted az sql db restore --dest-name "AdventureWorks-copy" --name "AdventureWorks" --time $before_error_time --verbose
Przywracanie potrwa od około 5 do 10 minut. Po uruchomieniu przywracania platforma Azure wdraża nową bazę danych usługi Azure SQL Database na serwerze logicznym usługi Azure SQL Database. Nowa baza danych ma takie same opcje konfiguracji, jak oryginalna. Po wdrożeniu bazy danych Azure SQL Database platforma Azure przywraca bazę danych do nowej bazy danych Azure SQL Database.
Aby sprawdzić stan, odśwież widok baz danych w programie SSMS. Kliknij prawym przyciskiem myszy folder Bazy danych i wybierz polecenie Odśwież. Po wdrożeniu bazy danych zobaczysz, że przywracanie jest w toku:
Po wyświetleniu, że przywracanie jest w toku, przywracanie powinno potrwać od dwóch do trzech minut. Po wykonaniu polecenia zostanie wyświetlony komunikat o jego ukończeniu. Ponadto po odświeżeniu obok kopii bazy danych nie będzie już wyświetlany komunikat „(Przywracanie...)”.
Jeśli zauważysz, że przywracanie trwa dłużej, niż podano powyżej, może to być spowodowane Twoim środowiskiem Microsoft Learn. Istnieje ograniczona liczba żądań przywracania, które mogą zostać przetworzone/przesłane jednocześnie w ramach jednej subskrypcji. Jeśli chcesz dowiedzieć się więcej o limitach i powiązanych szczegółach dotyczących punktu w czasie oczekiwania, zobacz Przywracanie bazy danych z kopii zapasowej w usłudze Azure SQL Database.
Teraz potwierdzisz, że nowa baza danych jest w poprawnym stanie (takim, jak przed wystąpieniem awarii). Kliknij prawym przyciskiem myszy serwer logiczny w programie SSMS, a następnie wybierz polecenie Odśwież, aby odświeżyć połączenie z serwerem logicznym usługi Azure SQL Database.
Kliknij prawym przyciskiem myszy nową bazę danych (na przykład AdventureWorks-copy), a następnie wybierz pozycję Nowe zapytanie.
Użyj tego zapytania, aby potwierdzić, że tabela istnieje:
SELECT TOP 10 * from SalesLT.SalesOrderDetail
Uzyskane wyniki powinny być podobne do wyników przedstawionych na poniższym zrzucie ekranu. Ten wynik potwierdza, że baza danych została przywrócona do miejsca, w którym powinna się znajdować.
Zamienianie baz danych i czyszczenie
Następnie zmienisz nazwę oryginalnej bazy danych na AdventureWorks-old , aby później zmienić nazwę nowej bazy danych na oryginalną nazwę bazy danych. Jeśli w aplikacjach zastosowano logikę ponawiania, dzięki tej zmianie nie będzie trzeba zmieniać parametrów połączenia.
Jeśli w jakimś momencie baza danych jest niedostępna (np. nie można nawiązać połączenia z bazami danych w programie SSMS w przypadku odświeżenia połączenia), może to być spowodowane wykonywaniem aktualizacji w tabeli DNS. Mimo że baza danych nie jest fizycznie niedostępna, jest nierozpoznawalna. Jeśli zaczekasz około minuty, powinno być możliwe wznowienie normalnych działań.
Użyj tego polecenia, aby zmienić nazwę bazy danych:
az sql db rename --name "AdventureWorks" --new-name "AdventureWorks-old"
Teraz, gdy oryginalna nazwa bazy danych nie jest już zajęta, można zmienić nazwę kopii bazy danych na oryginalną, używając usługi Azure Cloud Shell:
az sql db rename --name "AdventureWorks-copy" --new-name "AdventureWorks"
Nie potrzebujesz starej bazy danych, więc możesz ją usunąć za pomocą polecenia
az sql db delete
:az sql db delete --name "AdventureWorks-old" --yes Write-Host "Database deleted"
Możesz potwierdzić, że stara baza danych już nie istnieje, za pomocą tego polecenia:
az sql db list -o table
Teraz wiesz, jak można korzystać z przywracania do punktu w czasie w usłudze Azure SQL Database. Funkcja przywracania do punktu w czasie jest również dostępna w usłudze Azure SQL Managed Instance dla baz danych, ale nie dla całego wystąpienia. Możesz użyć niemal tych samych poleceń, z tą różnicą, że należy użyć polecenia az sql midb
zamiast polecenia az sql db
.