Compartir a través de


Eliminación de archivos de blobs de copia de seguridad con concesiones activas

Al realizar copias de seguridad o restaurar desde Azure Storage, SQL Server adquiere una concesión infinita para bloquear el acceso exclusivo al blob. Cuando el proceso de copia de seguridad o restauración se completa correctamente, se libera la concesión. Si se produce un error en una copia de seguridad o restauración, el proceso de copia de seguridad intenta limpiar cualquier blob no válido. Sin embargo, si se produce un error en la copia de seguridad debido a un error prolongado o sostenido de conectividad de red, es posible que el proceso de copia de seguridad no pueda obtener acceso al blob y el blob puede permanecer huérfano. Esto significa que el blob no se puede escribir ni borrar hasta que se libere el arrendamiento. En este tema se describe cómo liberar el arrendamiento y eliminar el blob.

Para obtener más información sobre los tipos de concesiones, lea este artículo.

Si se produce un error en la operación de copia de seguridad, puede dar lugar a un archivo de copia de seguridad que no es válido. El archivo blob de copia de seguridad también puede tener una concesión activa, lo que impide que se elimine o sobrescriba. Para eliminar o sobrescribir dichos blobs, primero se debe romper la concesión. Si hay errores de copia de seguridad, se recomienda limpiar concesiones y eliminar blobs. También puede elegir la limpieza periódicamente como parte de las tareas de administración de almacenamiento.

Si se produce un error de restauración, no se bloquean las restauraciones posteriores y, por tanto, es posible que la concesión activa no sea un problema. Romper el contrato de arrendamiento solo es necesario cuando necesita sobrescribir o eliminar el blob.

Administración de blobs huérfanos

En los pasos siguientes se describe cómo limpiar después de la actividad de copia de seguridad o restauración con errores. Todos los pasos se pueden realizar mediante scripts de PowerShell. En la sección siguiente se proporciona un ejemplo de código:

  1. Identificación de blobs que tienen concesiones: Si tiene un script o un proceso que ejecuta los procesos de copia de seguridad, es posible que pueda capturar el error en el script o proceso y usarlo para limpiar los blobs. También puede usar las propiedades LeaseStats y LeastState para identificar los blobs que tienen concesiones en ellos. Una vez que haya identificado los blobs, se recomienda revisar la lista y comprobar la validez del archivo de copia de seguridad antes de eliminar el blob.

  2. Interrumpir la concesión: Una solicitud autorizada puede interrumpir la concesión sin proporcionar un identificador de concesión. Consulte aquí para obtener más información.

    Sugerencia

    SQL Server emite un identificador de concesión para establecer el acceso exclusivo durante la operación de restauración. El identificador de arrendamiento de restablecimiento es BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Eliminación del blob: Para eliminar un blob que tenga una concesión activa, primero debe interrumpir la concesión.

Ejemplo de script de PowerShell

**Importante** Si ejecuta PowerShell 2.0, es posible que tenga problemas al cargar el ensamblado de Microsoft WindowsAzure.Storage.dll. Se recomienda actualizar a PowerShell 3.0 para resolver el problema. También puede usar la siguiente solución alternativa para PowerShell 2.0:

  • Cree o modifique el archivo powershell.exe.config para cargar ensamblados de .NET 2.0 y .NET 4.0 en tiempo de ejecución con lo siguiente:

    <?xml version="1.0"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <supportedRuntime version="v4.0.30319"/>
            <supportedRuntime version="v2.0.50727"/>
        </startup>
    </configuration>
    

En el ejemplo siguiente se ilustra la identificación de blobs que tienen concesiones activas y, a continuación, se rompen. En el ejemplo también se muestra cómo filtrar los identificadores de arrendamiento de liberación.

Sugerencias para ejecutar este script

Advertencia

Si se ejecuta una copia de seguridad en el servicio Azure Blob Storage al mismo tiempo que este script, la copia de seguridad puede fallar, ya que este script interrumpirá el arrendamiento que la copia de seguridad intenta adquirir al mismo tiempo. Se recomienda ejecutar este script durante una ventana de mantenimiento o cuando no se espera que se ejecute ninguna copia de seguridad.

  1. Al ejecutar este script, se le pedirá que proporcione valores para la cuenta de almacenamiento, la clave de almacenamiento, el contenedor, y los parámetros de ruta de acceso y nombre del ensamblado de Azure Storage. La ruta de acceso del ensamblado de almacenamiento es el directorio de instalación de la instancia de SQL Server. El nombre de archivo del ensamblado de almacenamiento es Microsoft.WindowsAzure.Storage.dll. A continuación se muestra un ejemplo de las indicaciones y los valores especificados:

    cmdlet  at command pipeline position 1  
    Supply values for the following parameters:  
    storageAccount: mycloudstorageaccount  
    storageKey: 0BopKY7eEha3gBnistYk+904nf  
    blobContainer: mycontainer   
    storageAssemblyPath: C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\Microsoft.WindowsAzure.Storage.dll  
    
  2. Si no hay blobs que tengan arrendamientos bloqueados, debería ver el siguiente mensaje:

    No hay blobs con estado de arrendamiento bloqueado

    Si hay blobs con arrendamientos bloqueados, debería ver los siguientes mensajes.

    Ruptura de arrendamientos

    La concesión en <la dirección URL del blob> es una concesión de restauración: verá este mensaje solo si tiene un blob con una concesión de restauración que todavía está activa.

    El arrendamiento en la <dirección URL del blob> no es un arrendamiento de restauración Rompiendo el arrendamiento en la <dirección URL de Bob>.

param(  
       [Parameter(Mandatory=$true)]  
       [string]$storageAccount,  
       [Parameter(Mandatory=$true)]  
       [string]$storageKey,  
       [Parameter(Mandatory=$true)]  
       [string]$blobContainer,  
       [Parameter(Mandatory=$true)]  
       [string]$storageAssemblyPath  
)  
  
# Well known Restore Lease ID  
$restoreLeaseId = "BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2"  
  
# Load the storage assembly without locking the file for the duration of the PowerShell session  
$bytes = [System.IO.File]::ReadAllBytes($storageAssemblyPath)  
[System.Reflection.Assembly]::Load($bytes)  
  
$cred = New-Object 'Microsoft.WindowsAzure.Storage.Auth.StorageCredentials' $storageAccount, $storageKey  
$client = New-Object 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient' "https://$storageAccount.blob.core.windows.net", $cred  
$container = $client.GetContainerReference($blobContainer)  
  
#list all the blobs  
$allBlobs = $container.ListBlobs()
  
$lockedBlobs = @()  
# filter blobs that are have Lease Status as "locked"  
foreach($blob in $allBlobs)  
{  
    $blobProperties = $blob.Properties
    if($blobProperties.LeaseStatus -eq "Locked")  
    {  
        $lockedBlobs += $blob  
    }  
}  
  
if ($lockedBlobs.Count -eq 0)  
{
    Write-Host " There are no blobs with locked lease status"  
}

if($lockedBlobs.Count -gt 0)  
{  
    Write-Host "Breaking leases"  
    foreach($blob in $lockedBlobs )
    {  
        try  
        {  
            $blob.AcquireLease($null, $restoreLeaseId, $null, $null, $null)  
            Write-Host "The lease on $($blob.Uri) is a restore lease"  
        }  
        catch [Microsoft.WindowsAzure.Storage.StorageException]  
        {  
            if($_.Exception.RequestInformation.HttpStatusCode -eq 409)  
            {  
                Write-Host "The lease on $($blob.Uri) is not a restore lease"  
            }  
        }  
  
        Write-Host "Breaking lease on $($blob.Uri)"  
        $blob.BreakLease($(New-TimeSpan), $null, $null, $null) | Out-Null  
    }  
}

Véase también

Procedimientos recomendados y solución de problemas de copia de seguridad de SQL Server en direcciones URL