Restaurar el Paquete de Microsoft Azure: Sitios web

 

Se aplica a: Windows Azure Pack

Se recomienda encarecidamente que realice la restauración en servidores que tengan los mismos nombres y cuentas administrativas que durante la copia de seguridad. Para que la restauración se realice correctamente, el servidor de archivos y SQL Server deben ser exactos en cuanto a la configuración, los usuarios y los permisos que tenían durante la copia de seguridad. Al restaurar el servicio Sitios web, use el orden siguiente:

1. Restauración de bases de datos de SQL Server

2. Restaurar el servidor de archivos

3. Restaurar el controlador de sitios web

4. Ejecutar una reparación en todos los roles

Puede utilizar scripts para realizar las operaciones de restauración. A continuación se describen con detalle los pasos necesarios.

1. Restauración de bases de datos de SQL Server

Restaure las bases de datos de hospedaje, de medición de recursos y maestra de SQL Server. El equipo con SQL Server debe tener el mismo nombre que cuando se hizo la copia de seguridad.

Script de restauración de SQL de ejemplo

El siguiente script de ejemplo se proporciona con fines ilustrativos únicamente y no se ofrece soporte técnico del mismo. El script que cree debe ejecutarse con privilegios administrativos.

Nota:

Microsoft no ofrece soporte técnico para este script.

param ([string] $backupUser = "Administrator", $backupPassword, $sqlServer, $sqlUser = "sa", $sqlPassword, $backupLocation = "\\backupMachine\c$\backup" )
net use $backupLocation /user:$backupUser $backupPassword
xcopy /Y /q \\$backupMachine\c$\$backupLocation\Hosting.bak C:\HostingOfflineFeed\
xcopy /Y /q \\$backupMachine\c$\$backupLocation\ResourceMetering.bak C:\HostingOfflineFeed\
xcopy /Y /q $backupLocation\master.bak C:\HostingOfflineFeed\
net start "SQL Server (MSSQLSERVER)" /f
sqlcmd -S $sqlServer -U $sqlUser -P $sqlPassword -Q "RESTORE DATABASE [master] FROM DISK='C:\HostingOfflineFeed\master.bak' WITH REPLACE"
net stop "SQL Server (MSSQLSERVER)"
net start "SQL Server (MSSQLSERVER)"
sqlcmd -S $sqlServer -U $sqlUser -P $sqlPassword -Q "RESTORE DATABASE [Hosting] FROM DISK='C:\HostingOfflineFeed\Hosting.bak' WITH REPLACE"
sqlcmd -S $sqlServer -U $sqlUser -P $sqlPassword -Q "RESTORE DATABASE [ResourceMetering] FROM DISK='C:\HostingOfflineFeed\ResourceMetering.bak' WITH REPLACE"
del C:\HostingOfflineFeed\Hosting.bak
del C:\HostingOfflineFeed\ResourceMetering.bak
del C:\HostingOfflineFeed\master.bak

2. Restaurar el servidor de archivos

El servidor de archivos debe tener el mismo nombre que tenía cuando se hizo la copia de seguridad. Debe restaurar los componentes del servidor de archivos en el orden siguiente:

  1. Restaurar el recurso compartido de certificados

  2. Restaurar el recurso compartido WebSites

  3. Volver a aplicar las ACL si es necesario

  4. Volver a aplicar las cuotas de FSRM en el recurso compartido WebSites

Se proporcionan dos scripts de ejemplo: uno para los pasos a a c anteriores y otro para volver a aplicar las cuotas de FSRM en el recurso compartido WebSites.

Script de ejemplo para restaurar el servidor de archivos

El siguiente script de ejemplo incluye los pasos a-c anteriores (no restaura las cuotas de FSRM). El script se proporciona con fines ilustrativos únicamente y no se ofrece soporte técnico del mismo. El script que cree debe ejecutarse con privilegios administrativos.

Nota:

Microsoft no ofrece soporte técnico para este script.

param ([string] $backupUser = "Administrator", $backupPassword, $certificateFolder = "C:\Certificates", $websiteFolder = "C:\websites", $backupLocation = "\\backupMachine\c$\backup" )
net use $backupLocation /user:$backupUser $backupPassword
mkdir $certificateFolder
mkdir $websiteFolder
xcopy /Y /q /E $backupLocation\ $certificateFolder
xcopy /Y /q /E $backupLocation\ $websiteFolder

Script de ejemplo para restaurar cuotas de FSRM

El script de ejemplo siguiente restaura las cuotas de FSRM. El script se proporciona con fines ilustrativos únicamente y no se ofrece soporte técnico del mismo. El script que cree debe ejecutarse con privilegios administrativos.

Nota

Microsoft no ofrece soporte técnico para este script.

param ([string] $backupUser = "Administrator", $backupPassword, $backupLocation = "\\backupMachine\c$\backup" )
net use $backupLocation /user:$backupUser $backupPassword
xcopy /Y /q $backupLocation\templates.xml C:\templates.xml
dirquota template import /File:C:\templates.xml
net stop srmReports
net stop srmSvc
net stop quota
net stop Datascrn
robocopy $backupLocation\SRM "C:\System Volume Information\SRM" /E /ZB /R:3 /W:5
net start Datascrn
net start quota
net start srmSvc
net start srmReports

3. Restaurar el controlador de sitios web

Para restaurar el controlador de Sitios web, puede utilizar el script Restore.ps1 de PowerShell que se presenta en esta sección.

Copie el script Restore.ps1 al controlador de Sitios web y ejecute el comando siguiente con privilegios de administrador:

net use /Y $backupLocation /user:$backupMachineAdmin $backupMachinePassword
.\Restore.ps1 $backupLocation $encryptionKey

Nota

La marca $encryptionKey solo es necesaria si la utilizó durante la copia de seguridad.

A continuación se muestra el script Restore.ps1.

##  Re-install and restore the controller from a backup

param ($backupPath,$password)

function ShowHelp
{
    Write-Host '===================== RESTORE.PS1 HELP ====================='
    Write-Host 'This is a script that restores based on a backup from the Hosting VSS writer'
    Write-Host 'Invoke it using .\Restore.ps1'
    Write-Host 'It can also be invoked as follows:'
    Write-Host '.\Restore.ps1 <backup path (e.g. \\backupmachine\C$\backuplocation)> <password for keys file>' 
    Write-Host ("Note: before running this script you may need to run:`r`n" + ' "net use /Y <backup path> /user:<username> <password>"')
    Write-Host '============================================================'
}

function CreateFeedWebAppIfNeeded ([string] $localFeedLocation)
{
    import-module WebAdministration
    $app = Get-WebApplication -Name HostingOfflineFeed 
    if ($app -eq $null) 
    {
        New-WebApplication -Name HostingOfflineFeed -Site 'Default Web Site' -PhysicalPath $localFeedLocation -ApplicationPool DefaultAppPool -Force
    }
    # Add mime types needed for downloading .msp files for offline installations
    $msp = Get-WebConfiguration //staticContent/* | where {$_.fileExtension -eq '.msp'}
    if ($msp -eq $null) 
    {
        Add-WebConfiguration //staticContent -Value @{fileExtension=".msp";mimeType="application/octet-stream"}
    }

    # Add mime types needed for downloading .msu files for offline installations
    $msu = Get-WebConfiguration //staticContent/* | where {$_.fileExtension -eq '.msu'}
    if ($msu -eq $null) 
    {
        Add-WebConfiguration //staticContent -Value @{fileExtension=".msu";mimeType="application/octet-stream"}
    }
}

function InstallController ([string]$offlineFeedUrl, [string]$customFeed) 
{
    $WebPiCmd = ([System.Environment]::ExpandEnvironmentVariables("%ProgramW6432%\Microsoft\Web Platform Installer\WebpiCmd.exe"))    
    if (!(Test-Path $WebPiCmd))
    {
        $WebPiCmd = Join-Path -Path $localFeedLocation -ChildPath "bin\WebpiCmd.exe"
    }
    Invoke-Command -ScriptBlock { & $WebPiCmd /Install /Products:HostingController /AcceptEula /XML:$offlineFeedUrl /SuppressReboot /Log:HostingController.log }

    if ($lastexitcode -ne $null -And $lastexitcode -ne 0) 
    {
        Write-Host "ERROR: There was a problem installing using WebPI!"
        exit $lastexitcode
    }
}

function DecodeBase64($string)
{
    return [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($string))
}

function DecryptString($EncryptedFile, $Passphrase, $salt, $init) 
{ 
    $encryptedStrings = (Get-Content $EncryptedFile)
    $ret = @()
    foreach ($Encrypted in $encryptedStrings)
    {
        # If the value in the Encrypted is a string, convert it to Base64 
        if($Encrypted -is [string])
        { 
            $Encrypted = [Convert]::FromBase64String($Encrypted) 
        } 
        # Create a COM Object for RijndaelManaged Cryptography 
        $r = new-Object System.Security.Cryptography.RijndaelManaged 
        # Convert the Passphrase to UTF8 Bytes 
        $pass = [Text.Encoding]::UTF8.GetBytes($Passphrase) 
        # Convert the Salt to UTF Bytes 
        $salt = [Text.Encoding]::UTF8.GetBytes($salt) 
        # Create the Encryption Key using the passphrase, salt and SHA1 algorithm at 256 bits 
        $r.Key = (new-Object Security.Cryptography.PasswordDeriveBytes $pass, $salt, "SHA1", 5).GetBytes(32) #256/8 
        # Create the Intersecting Vector Cryptology Hash with the init 
        $r.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15]
        # Create a new Decryptor 
        $d = $r.CreateDecryptor() 
        # Create a New memory stream with the encrypted value. 
        $ms = new-Object IO.MemoryStream @(,$Encrypted)
        # Read the new memory stream and read it in the cryptology stream 
        $cs = new-Object Security.Cryptography.CryptoStream $ms,$d,"Read" 
        # Read the new decrypted stream 
        $sr = new-Object IO.StreamReader $cs 
        # Return from the function the stream 
        $ret += $sr.ReadToEnd()
        # Stops the stream
        $sr.Close() 
        # Stops the crypology stream 
        $cs.Close() 
        # Stops the memory stream 
        $ms.Close() 
        # Clears the RijndaelManaged Cryptology IV and Key 
        $r.Clear() 
    }
    return $ret
}

if ($backupPath -and $backupPath.Contains('/?'))
{ 
    ShowHelp
    return
}

Write-Host 'Starting the hosting restore process. Run with /? to see help.'
Write-Host ("Note: before running this script you may need to run:`r`n" + ' "net use /Y <backupPath> /user:<username> <password>"')
# argument parsing
if (!$backupPath)
{
    $backupPath = Read-Host "Please enter the name of the backup path (e.g. \\backupmachine\C$\backuplocation)"
}
if (!$password)
{
    $password = Read-Host "Please enter the password of the keys file" -AsSecureString
    $password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
}

$systemDrive = [System.Environment]::ExpandEnvironmentVariables('%systemdrive%\')
# Fetch restore data from remote machine
$localFeedLocation = ($systemDrive +'HostingOfflineFeed\')
$c = 0
do
{ 
    $c++
    "D" | xcopy /q /Y (Join-Path -Path $backupPath -ChildPath "HostingOfflineFeed") "$localFeedLocation" /E
} while ($c -lt 10 -and !$?)
# Install the IIS cmdlets
$dismLocation = Join-Path -Path $systemDrive -ChildPath 'Windows\System32\dism.exe'
& $dismLocation /online /enable-feature /featurename:IIS-ManagementScriptingTools /all
CreateFeedWebAppIfNeeded $localFeedLocation

Stop-Service ResourceMetering -ErrorAction SilentlyContinue
# install webpi
$wpi = (dir ($systemDrive + 'hostingofflinefeed\installers\HostingWebPlatformInstaller') -r -i 'wpi.msi').DirectoryName
if ($wpi.Count -gt 1)
{
    $wpi = $wpi[0]
}
$wpi = Join-Path -Path $wpi -ChildPath "wpi.msi"
msiexec /quiet /i $wpi
$offlineFeedUrl = 'https://localhost/HostingOfflineFeed/feeds/latest/WebSites0.9.0.xml'
InstallController $offlineFeedUrl
$keys = DecryptString (Join-Path -Path $backupPath -ChildPath 'encryptedkeys.txt') $password 'salt12345' 'init12345'
Stop-Service WebFarmService -ErrorAction SilentlyContinue
Add-PSSnapIn WebHostingSnapIn
# Restore the keys
# Keys are Base64 encoded
Set-ControllerConnectionString -ConnectionString (DecodeBase64($keys[0])) 3>$null
# Set-MeteringConnectionString -MeteringConnectionString (DecodeBase64($keys[1])) -ServerName (HostName)
Set-SymmetricKey -SymmetricKeyName SystemCore -SymmetricKey (DecodeBase64($keys[1])) 3>$null
Set-SymmetricKey -SymmetricKeyName SiteRuntime -SymmetricKey (DecodeBase64($keys[2])) 3>$null
Set-MeteringConnectionString -MeteringConnectionString ([Microsoft.Web.Hosting.SiteManager]::GetMeteringConnectionString()) -ServerName (HostName) 3>$null

Start-Service WebFarmService -ErrorAction SilentlyContinue

Restaurar en servidores que no son de archivos con nombres o cuentas administrativas diferentes

Si debe restaurar un servidor (que no sea un servidor de archivos o SQL Server) en uno o varios servidores con nombres de servidor o cuentas administrativas que son diferentes de los originales, debe hacer lo siguiente:

  1. Importar el módulo WebSites

  2. Actualice las credenciales

  3. Quitar de la granja los nombres de servidor antiguos

  4. Agregar los nuevos servidores a las granjas adecuadas

  1. En primer lugar, antes de ejecutar cualquiera de los demás comandos, importe el módulo WebSites:

    Import-Module WebSites
    

    Ejecute ahora los comandos 2-4 en el controlador como Administrador.

  2. Si las credenciales del rol <RoleType> han cambiado, ejecute lo siguiente para cada credencial modificada:

    Set-WebSitesConfig Credential -CredentialName <RoleType> Credential -UserName <RoleAdminUser> -Password <RoleAdminPassword>
    

    Nota

    Los valores posibles para <RoleType> en el comando Set-WebSitesConfig son: ManagementServer, FileServer, FrontEnd, Publisher y Worker.

  3. Para cada nombre <de servidor antiguo OldName> que ya no se usa, ejecute:

    Remove-WebSitesServer -Name <OldName>
    
  4. Para cada nuevo nombre <de servidor NewName> del rol <RoleType> , ejecute esto:

    New-WebSitesServer -Name <NewName> -ServerType <RoleType>
    

    Nota:

    Los valores posibles para <RoleType> en el comando New-WebSitesServer son: ManagementServer, FileServer, LoadBalancer, Publisher y WebWorker.

Ejemplo

Si tuviera un rol antiguo de trabajo web denominado "OldWorker" y un nuevo rol de trabajo web denominado "NewWorker", y hubiera actualizado las credenciales de WebWorker a "WebWorkerAdmin", ejecutaría:

Import-Module WebSites

Set-WebSitesConfig Credential -CredentialName WorkerCredential -UserName WebWorkerAdmin -Password $WebWorkerPassword

Remove-WebSitesServer -Name OldWorker

New-WebSitesServer -Name NewWorker -ServerType WebWorker

4. Ejecutar una reparación en todos los roles

Después de completar la restauración, ejecute una reparación en todos los roles y supervíselos para comprobar que vuelven a estar en buen estado.

Consulte también

Realizar copias de seguridad del Paquete de Microsoft Azure: Sitios web
Implementar Windows Azure Pack: Sitios web