Fehler beim Hochladen von Blob- oder Blockinhalten in Azure Blob Storage
In diesem Artikel wird erläutert, wie Fehler behoben werden, die auftreten können, wenn Sie Microsoft Azure Blob Storage zusammen mit Ihren Cloudanwendungen verwenden, um Blobs hochzuladen oder Inhalte zu blockieren.
Voraussetzungen
- Ein Speicherkonto aus einem der folgenden Speicherdienste:
- Azure Storage SDK
- Azure Storage-Explorer
- PowerShell
Symptome
Sie erhalten eine der folgenden Fehlermeldungen.
Fehlercode | Fehlermeldung |
---|---|
BlockCountExceedsLimit |
"Die Anzahl der nicht ausgelassenen Blöcke darf die maximale Anzahl von 100.000 Blöcken nicht überschreiten." |
InvalidBlobOrBlock |
"Der angegebene Blob- oder Blockinhalt ist ungültig." |
InvalidBlock oder InvalidBlockList |
"Die angegebene Blockliste ist ungültig." |
Ursache 1: Die blocklänge, die im Put Block-Aufruf angegeben wurde, ist ungültig.
Die in der Put Block URI-Anforderung angegebene Blocklänge ist aus mindestens einem der folgenden Gründe ungültig:
Die Anwendung oder der Client hat eine Blockgröße angegeben, die nicht unterstützt wird.
Die Größe des Blocks ist größer als die maximal zulässige Blockgröße. Informationen zu den Blockgrößenbeschränkungen für verschiedene Versionen der BLOB-Dienst-REST-API finden Sie im Abschnitt "Hinweise " des Referenzartikels "Put Block".
Wenn Sie versucht haben, Datenblöcke mithilfe mehrerer Anwendungen hochzuladen, wurden nicht ausgelassene Blöcke mit inkonsistenten Blocklängen angezeigt. Diese Situation tritt auf, da verschiedene Anwendungen unterschiedliche Längen zum Hochladen von Daten verwenden oder ein vorheriger Upload fehlgeschlagen ist.
Das Blob verfügt über zu viele nicht ausgelassene Blöcke, da ein vorheriger Uploadvorgang abgebrochen wurde. Die maximale Anzahl nicht ausgelassener Blöcke, die einem Blob zugeordnet werden können, beträgt 100.000.
Entfernen Sie die nicht bereitgestellten Blöcke, indem Sie eine dieser Lösungen implementieren.
Lösung 1: Warten Sie auf die Garbage Collection, um die nicht ausgelassenen Daten aufzunehmen.
Warten Sie sieben Tage, bis die nicht ausgelassene Blockliste von der Garbage Collection bereinigt wird.
Lösung 2: Verwenden eines Dummy-Blobs, um die Datenübertragung zu ermöglichen
Verwenden Sie das Azure Storage SDK, um die Daten mithilfe eines Dummy-Blobs zu übertragen. Gehen Sie dazu wie folgt vor:
Erstellen Sie ein Dummy-Blob mit demselben Blobnamen und befindet sich im gleichen Container. Dieses Blob kann eine Länge von Null aufweisen.
Übertragen Sie das Blob mithilfe einer nicht blockierten Übertragung.
Lösung 3: Commit der nicht bereitgestellten Blockliste mithilfe des Azure Storage SDK
Verwenden Sie das Azure Storage SDK, um die nicht ausgelassene Blockliste zu übernehmen und das Blob zu bereinigen. Gehen Sie dazu wie folgt vor:
Rufen Sie die nicht ausgelassene Blockliste ab, indem Sie eine URI-Anforderung abrufen, in der der
blocklisttype
URI-Parameter auf <a0/" festgelegt ist. Übernehmen Sie die Sperrliste mithilfe der URI-Anforderung "Put Block List ".
Löschen Sie das Blob.
Die folgende PowerShell-Funktion ist ein Beispiel für das Abrufen einer nicht ausgelassenen Blockliste und anschließendes Löschen. Für die Funktion sind die folgenden Parameter erforderlich.
Parametername | Beschreibung |
---|---|
-StorageAccountName |
Der Name des Speicherkontos. |
-SharedAccessSignature |
Ein SAS-Token (Shared Access Signature), das die URI-Parameter verwendet <ss=b;srt=sco;sp=rwldc> . Diese Parameter werden unter Erstellen eines SAS-URI für Konten beschrieben. |
-ContainerName |
Der Name des Speichercontainers. |
-BlobName |
Der Name des Blobs. |
[CmdletBinding()] Param(
[Parameter(Mandatory=$true, Position=1)] [string] $StorageAccountName,
[Parameter(Mandatory=$True, Position=1)] [string] $SharedAccessSignature,
[Parameter(Mandatory=$True, Position=1)] [string] $ContainerName,
[Parameter(Mandatory=$True, Position=1)] [string] $BlobName
)
# Build the URI strings in the REST API for GET and DELETE.
$uriDelete = (
"https://$StorageAccountName.blob.core.windows.net/",
"$ContainerName",
"/",
"$BlobName",
"$SharedAccessSignature"
) -Join ""
$uriGet = (
"$uriDelete",
"&comp=blocklist",
"&blocklisttype=uncommitted"
) -Join ""
Write-Host "The Delete URI is $uriDelete."
Write-Host "The Get URI is $uriGet."
# Make a REST API call to get the uncommitted block list.
$listFileURI = Invoke-WebRequest -Uri $uriGet -Method Get
$FileSystemName = $listFileURI.Content
$String = $FileSystemName -replace '' , ''
$String |
Select-Xml –XPath "/BlockList/UncommittedBlocks/Block" |
Select-Object -Expand Node
$Count = $String.Count
# Delete the blob and the uncommitted block.
if ($Count.Count -gt 0) {
$listFileURI1 = Invoke-WebRequest -Uri $uriDelete -Method Delete
$FileSystemName1 = $listFileURI1.StatusCode
Write-Host "The deletion was successful. The API returned status code $FileSystemName1."
}
Write-Host "Check whether the uncommitted blocks are still present."
Try {
$listFileURI2 = Invoke-WebRequest -Uri $uriGet -Method Get
} Catch {
# $err = $_.Exception
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
}
Write-Host (
"In this error message, we can verify that the",
"uncommitted blocks and their respective blob have been deleted.",
"The name and size of the uncommitted blocks that have been deleted are shown."
)
Ursache 2: PUT-Vorgänge treten gleichzeitig für ein Blob auf
Ein Zeit- oder Parallelitätsproblem tritt auf. Dies bewirkt, dass für ein einzelnes BLOB mehrere PUT-Vorgänge (Put Block) gleichzeitig auftreten. Der Vorgang "Blockliste put" schreibt ein BLOB, indem die Liste der Block-IDs angegeben wird, aus denen das Blob besteht. Um als Teil eines BLOB geschrieben zu werden, muss ein Block erfolgreich auf den Server in einem vorherigen Put-Block-Vorgang geschrieben worden sein.
Notiz
Dieser Fehler kann während gleichzeitiger Upload-Commits auftreten, nachdem Sie den Upload gestartet haben, aber bevor Sie einen Commit ausführen. In diesem Fall schlägt der Upload fehl. Die Anwendung kann den Upload wiederholen, wenn der Fehler auftritt, oder es kann eine andere Wiederherstellungsaktion versuchen, die auf dem erforderlichen Szenario basiert.
Lösung: Leases verwenden
Anstatt optimistische Parallelität zu verwenden, versuchen Sie, pessimistische Parallelität (Leases) mithilfe des Azure Storage SDK oder eines GUI-basierten Tools wie Azure Storage-Explorer zu implementieren. Weitere Informationen zur optimistischen und pessimistischen Parallelität finden Sie unter Managing concurrency in blob storage.
Wenn der Fehler durch Parallelitätsprobleme verursacht wird, müssen Sie möglicherweise auch die nicht bereitgestellten Blöcke bereinigen, indem Sie einer der Lösungen in Ursache 1 folgen.
Kontaktieren Sie uns für Hilfe
Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.