Cvičení – obnovení k určitému bodu v čase

Dokončeno

V tomto cvičení se dozvíte, jak se můžete zotavit z běžné chyby pomocí obnovení k určitému bodu v čase (PITR). Tento proces se snadno provádí na portálu nebo prostřednictvím kódu programu. V tomto cvičení se naučíte, jak ho provést pomocí Azure CLI.

Nastavení: Nasazení služby Azure SQL Database pomocí skriptů

V terminálu napravo uvidíte Azure Cloud Shell, což je způsob interakce s Azure pomocí prohlížeče. Před zahájením cvičení je nutné spustit skript, abyste si vytvořili prostředí: databázi Azure SQL Database, která obsahuje databázi AdventureWorks. Tento skript bude obsahovat výzvy k zadání hesla a místní IP adresy.

Spuštění těchto skriptů by mělo trvat 3 až 5 minut. Nezapomeňte si poznamenat heslo, jedinečné ID a oblast, protože se znovu nezobrazí.

  1. Aby bylo možné získat požadovanou IP adresu, musíte se odpojit od jakékoli služby VPN a spustit (Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content v místním okně PowerShellu (ne v tomto prohlížeči). Výslednou IP adresu si poznamenejte.

  2. V Azure Cloud Shellu na pravé straně této stránky spusťte následující skript. Po zobrazení výzvy zadejte složitější heslo a veřejnou IP adresu.

    $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)"
    
  3. Spuštěním následujícího skriptu v Azure Cloud Shellu si vytvořte výstup a uložte si informace, které budete potřebovat v průběhu tohoto modulu (do textového souboru nebo na podobné místo). Je možné, že budete muset po vložení kódu stisknout Enter, protože poslední řádek se ve výchozím nastavení nespustí.

    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
    

    Důležité

    Nezapomeňte si poznamenat heslo, jedinečné ID a oblast. Tyto informace budete potřebovat v celém modulu.

  4. Spuštěním následujícího skriptu nasaďte databázi Azure SQL a logický server s ukázkovou databází AdventureWorks. Tento skript také přidá vaši IP adresu jako pravidlo brány firewall, povolí Microsoft Defender for Cloud a vytvoří účet úložiště pro použití v nadcházejících lekcích.

    # 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"
    
  5. Na místním počítači otevřete nástroj SQL Server Management Studio a vytvořte nové připojení k logickému serveru. Jako název serveru zadejte název logického serveru Azure SQL Database. Pokud jste si tento název neuložili dříve, budete ho pravděpodobně muset získat z portálu Azure Portal. Příklad: aw-server<jedinečný ID.database.windows.net>.

    1. Když jste na portálu Azure Portal, můžete zadáním AdventureWorks do vyhledávacího pole najít svou databázi a přidružený logický server.

    2. V poli Ověřování zadejte Ověřování přes server SQL. Zadejte odpovídající přihlašovací jméno a heslo správce serveru (které jste zadali během nasazování v předchozím cvičení).

    3. Zaškrtněte políčko Zapamatovat heslo a vyberte Připojení.

    Screenshot that shows how to connect to SQL Database in SSMS.

    Poznámka:

    Podle toho, jaká je vaše místní konfigurace (například VPN), se vaše IP adresa klienta může lišit od IP adresy, kterou Azure Portal používal během nasazování. V takovém případě se vám zobrazí zpráva „Vaše IP adresa klienta nemá přístup k serveru. Přihlaste se k účtu Azure a vytvořte nové pravidlo brány firewall pro povolení přístupu. Pokud se zobrazí tato zpráva, přihlaste se pomocí účtu, který používáte pro sandbox, a přidejte pravidlo brány firewall pro vaši IP adresu klienta. Tyto kroky můžete provést v automaticky otevíraném průvodci v nástroji SQL Server Management Studio.

Dokončení obnovení k bodu v čase

Než budete pokračovat, je důležité seznámit se s doporučeným procesem obnovení k bodu v čase:

  1. Omylem dojde k odstranění tabulky nebo databáze.
  2. Určete čas, ke kterému se potřebujete vrátit; měla by být před chybou.
  3. Dokončete obnovení k vybranému bodu v čase přes PowerShell nebo portál Azure Portal. Tímto postupem se nasadí nová databáze a obnoví se kopie vaší databáze. Příklad: AdventureWorks-copy.
  4. Ověřte, že je nová databáze (například AdventureWorks-copy) ve správném stavu (jak tomu bylo před nehodou).
  5. Přejmenujte původní databázi. Například přejmenujte AdventureWorks na AdventureWorks-old.
  6. Přejmenujte novou databázi na původní název databáze. Například přejmenujte AdventureWorks-copy na AdventureWorks.
  7. Odstraňte původní databázi Příklad: AdventureWorks-old.

V tomto cvičení výše uvedené kroky provedete.

Simulace odstranění dat

Nejdříve ověříme, že tabulka, kterou neúmyslně odstraníme, existuje a obsahuje data. Pojďme se podívat na některé z hodnot v tabulce SalesLT.OrderDetail.

  1. Přejděte do nástroje SQL Server Management Studio a zkontrolujte nebo aktualizujte připojení. Vyberte Soubor> Připojení Průzkumník objektů a pak vyberte tlačítko Možnosti.

  2. Ujistěte se, že připojení, které používáte, se připojuje k logickému serveru, ale ne ke konkrétní databázi. (Použijte například <výchozí>, jak je znázorněno na následujícím snímku obrazovky.) Ověřte také, že karta Další Připojení parametry neobsahuje žádný text.

    Screenshot that shows the default connection.

  3. Rozbalte složku Databáze, klikněte pravým tlačítkem myši na databázi AdventureWorks a vyberte Nový dotaz. Zadejte následující dotaz a spusťte ho tak , že vyberete Spustit a zkontrolujete výsledky:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Screenshot that shows the sales order detail table.

  4. Nasimulujte ztrátu dat vyřazením tabulky z databáze.

    Ve stejném okně dotazu spusťte tento dotaz a pak v okně Výsledky vyberte kartu Zprávy a poznamenejte si čas dokončení:

    DROP TABLE SalesLT.SalesOrderDetail
    

    Důležité

    Zaznamenejte si čas dokončení. Budete ho totiž potřebovat později. Následuje příklad: Completion time: 2020-06-22T09:20:27.1859237-07:00.

  5. Nakonec před zahájením kroků obnovení databáze spusťte následující kód v Azure Cloud Shellu na pravé straně této stránky a nakonfigurujte prostředí:

    $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
    

    Vrácené parametry group a sql-server by se měly shodovat s názvem skupiny prostředků Microsoft Learn a logického serveru Azure SQL Database.

Určete čas, do kterého se má databáze obnovit.

Prvním krokem je zjištění času obnovení databáze. Musíte vědět, kdy došlo k poslední úspěšné transakci před první chybnou. Obnovení provedete k času před chybnou transakcí, ale po poslední úspěšné.

  1. Jedním ze způsobů, jak určit čas selhání, je podle času dokončení příkazu DROP, který jste si poznamenali v předchozím kroku.

    Alternativou je použití protokolů auditu na webu Azure Portal. V tomto cvičení jste nenakonfigurovali auditování pro Log Analytics, ale pojďme se podívat, co byste mohli dělat, pokud byste měli. Na webu Azure Portal můžete přejít do databáze Azure SQL. V levém podokně v části Zabezpečení můžete vybrat Auditování a pak můžete vybrat Zobrazit protokoly auditu. Když pak vyberete Log Analytics, přejdete do editoru dotazů, který umožňuje dotazovat protokoly pomocí dotazovací jazyk Kusto (KQL). Odborníci na SQL se můžou pomocí tohoto dotazovacího jazyka snadno dotazovat na protokoly.

    Pak můžete spustit následující dotaz 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
    

    Výsledky by měly být podobné následujícím výsledkům, ale s jiným datem a časem.

    Screenshot that shows Log Analytics results.

    Poznámka:

    Zobrazení protokolů může trvat 5 až 10 minut, takže pro účely tohoto cvičení jsme ho vynechali. Místo toho použijete čas dokončení, který jste si poznamenali v předchozím kroku. (Musíte ho převést na GMT.) V reálné situaci se pravděpodobně nebudete moct dostat do okna s časem dokončení, takže auditování může být skvělou nápovědou.

  2. V tomto příkladu je 2020-07-24 08:06:24.386 datum a čas z Log Analytics a 2020-07-24T13:06:24.386-07:00 ze služby SSMS. Požadovaný formát je mírně odlišný. K určení správného formátu použijte následující příklad. Je také vhodné odečíst 0,001 sekund, abyste měli jistotu, že obnovíte stav k okamžiku před chybou:

    • Formát Log Analytics: 2020-07-24 08:06:24.386
    • Formát SSMS: 2020-07-24T13:06:24.386-07:00
    • Požadovaný formát: 2020-07-24T20:06:24.385
  3. Nastavte $before_error_time výslednou hodnotu a nahraďte čas časem v tomto příkladu:

    $before_error_time ="2020-07-24T20:06:24.385"
    

Obnovení databáze a potvrzení chybějících dat

V této části použijete az cli db restore k obnovení databáze k času před odstraněním tabulky.

  1. V terminálu na pravé straně tohoto okna spusťte následující skript:

    # 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
    

    Obnovení bude trvat přibližně 5 až 10 minut. Když spustíte obnovení, Azure nasadí do vašeho logického serveru Azure SQL Database novou databázi Azure SQL. Nová databáze má stejné možnosti konfigurace jako ta původní. Jakmile se databáze Azure SQL nasadí, Azure ji obnoví do nové databáze Azure SQL.

  2. Stav můžete zjistit aktualizováním zobrazení databází v Management Studiu. Klikněte pravým tlačítkem myši na složku Databáze a vyberte Aktualizovat. Po nasazení databáze uvidíte, že probíhá obnovení:

    Screenshot that shows a database restoring in SSMS.

    Jakmile zjistíte, že obnovení probíhá, mělo by trvat ještě dvě až tři minuty. Že proces je hotový, poznáte podle toho, že se příkaz dokončí. Když provedete aktualizaci, také už vedle kopie dané databáze neuvidíte poznámku (Obnovování…).

    Pokud zjistíte, že obnovení trvá déle, než je výše uvedená doba, může to být kvůli vašemu prostředí Microsoft Learn. Počet požadavků na obnovení, které lze zpracovat nebo odeslat najednou v rámci jednoho předplatného, je omezený. Pokud chcete získat další informace o limitech a souvisejících podrobnostech o obnovení k určitému bodu v čase čekání, přečtěte si téma Obnovení databáze ze zálohy ve službě Azure SQL Database.

  3. Nyní potvrdíte, že je nová databáze ve správném stavu (tedy ve stejném stavu jako před selháním). Pravým tlačítkem myši klikněte na logický Server v Management Studiu a pak vyberte Aktualizovat, abyste aktualizovali připojení k logickému serveru Azure SQL Database.

  4. Klikněte pravým tlačítkem na svou novou databázi (například AdventureWorks-copy) a potom vyberte Nový dotaz.

    Screenshot that shows how to create a query.

  5. Pomocí tohoto dotazu ověřte, že tabulka existuje:

    SELECT TOP 10 * from SalesLT.SalesOrderDetail
    

    Měli byste získat výsledky podobné výsledkům uvedeným na následujícím snímku obrazovky. Tento výsledek potvrdí, že se databáze obnovila tam, kde má být.

    Screenshot that shows the sales order detail table.

Prohození a vyčištění databází

V dalším kroku přejmenujete původní databázi na AdventureWorks starou , abyste později mohli novou databázi přejmenovat tak, aby používala původní název databáze. Pokud vaše aplikace používají logiku pro opakování, nebudete díky této změně muset měnit žádné připojovací řetězce.

Pokud se vaše databáze bude jevit jako nedostupná (například se k ní po aktualizaci připojení v nástroji Management Studio nebudete moct připojit), příčinou mohou být aktualizace prováděné v tabulce DNS. V takovém případě není databáze fyzicky nedostupná, ale nedá se rozpoznat. Chvíli počkejte, brzy byste měli být schopni s databázi znovu normálně pracovat.

  1. Pomocí tohoto příkazu změňte název databáze:

    az sql db rename --name "AdventureWorks" --new-name "AdventureWorks-old"
    
  2. Když už se původní název databáze nepoužívá, můžete kopii databáze přejmenovat, aby se nazývala stejně jako ta původní. Znovu použijte Azure Cloud Shell:

    az sql db rename --name "AdventureWorks-copy" --new-name "AdventureWorks"
    
  3. Starou databázi nepotřebujete, takže ji můžete odstranit pomocí az sql db delete:

    az sql db delete --name "AdventureWorks-old" --yes
    Write-Host "Database deleted"
    
  4. Pomocí tohoto příkazu si můžete ověřit, že původní databáze už neexistuje:

    az sql db list -o table
    

Naučili jste se použít obnovení k bodu v čase v Azure SQL Database. Obnovení k bodu v čase se používá i ve službě Azure SQL Managed Instance pro databáze, ale ne pro celé instance. Můžete použít skoro stejné příkazy s tím rozdílem, že je potřeba místo az sql midb použít az sql db.