Aracılığıyla paylaş


Blob veya blok içeriğini karşıya yükleme işlemi Azure Blob Depolama

Bu makalede, blobu karşıya yüklemek veya içeriği engellemek için Bulut uygulamalarınızla birlikte Microsoft Azure Blob Depolama kullandığınızda oluşabilecek hataların nasıl çözülebileceği açıklanır.

Önkoşullar

Belirtiler

Aşağıdaki hata iletilerinden birini alırsınız.

Hata kodu Hata iletisi
BlockCountExceedsLimit "Kaydedilmemiş blok sayısı en fazla 100.000 blok sınırını aşamaz."
InvalidBlobOrBlock "Belirtilen blob veya blok içeriği geçersiz."
InvalidBlock Veya InvalidBlockList "Belirtilen blok listesi geçersiz."

Neden 1: Blok Koy çağrısında belirtilen blok uzunluğu geçerli değil

Blok URI'sini Koy isteğinde belirtilen blok uzunluğu aşağıdaki nedenlerden biri veya daha fazlası için geçerli değildir:

  • Uygulama veya istemci desteklenmeyen bir blok boyutu belirtti.

  • Bloğun boyutu izin verilen en büyük blok boyutundan daha büyük. Blob Hizmeti REST API'sinin farklı sürümleri için blok boyutu sınırlarını bulmak için "Blok Koy" başvuru makalesinin Açıklamalar bölümüne bakın.

  • Birden fazla uygulama kullanarak veri bloklarını karşıya yüklemeye çalıştığınızda, tutarsız blok uzunluklarına sahip kaydedilmemiş bloklar vardı. Bu durum, farklı uygulamaların verileri karşıya yüklemek için farklı uzunluklar kullanması veya önceki bir karşıya yüklemenin başarısız olması nedeniyle oluşur.

  • Önceki karşıya yükleme işlemi iptal edildiğinden blobda çok fazla kaydedilmemiş blok var. Blobla ilişkilendirilebilen en fazla kaydedilmemiş blok sayısı 100.000'dir.

Bu çözümlerden birini uygulayarak kaydedilmemiş blokları kaldırın.

Çözüm 1: Atık toplama işleminin kaydedilmemiş verileri almasını bekleyin

Kaydedilmemiş blok listesinin çöp toplama tarafından temizlenmesi için yedi gün bekleyin.

Çözüm 2: Veri aktarımını yapmak için sahte blob kullanma

Verileri sahte bir blob kullanarak aktarmak için Azure Depolama SDK'sını kullanın. Bunu yapmak için şu adımları uygulayın:

  1. Aynı blob adına sahip ve aynı kapsayıcıda bulunan bir sahte blob oluşturun. Bu blobun uzunluğu sıfır olabilir.

  2. Engellenmemiş bir aktarım kullanarak blobu aktarın.

Çözüm 3: Azure Depolama SDK'sını kullanarak kaydedilmemiş blok listesini işleme

Azure Depolama SDK'sını kullanarak kaydedilmemiş blok listesini işleyin ve blobu temizleyin. Bunu yapmak için şu adımları uygulayın:

  1. URI parametresinin olarak ayarlandığı blocklisttypeuncommittedBir Blok Listesi URI'sini Alma isteği yaparak, kaydedilmemiş blok listesini alın.

  2. Blok Listesini Koy URI isteğini kullanarak blok listesini işleyin.

  3. Blobu silin.

Aşağıdaki PowerShell işlevi, kaydedilmemiş bir blok listesinin nasıl alınıp silineceğiyle ilgili bir örnektir. işlevi aşağıdaki parametreleri gerektirir.

Parametre adı Açıklama
-StorageAccountName Depolama hesabının adı.
-SharedAccessSignature URI parametrelerini <ss=b;srt=sco;sp=rwldc>kullanan paylaşılan erişim imzası (SAS) belirteci. Bu parametreler , Hesap SAS URI'si oluşturma bölümünde açıklanmıştır.
-ContainerName Depolama kapsayıcısının adı.
-BlobName Blobun adı.
[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."
)

Neden 2: PUT işlemleri blob için aynı anda gerçekleşir

Zamanlama veya eşzamanlılık sorunu oluşur. Bu, tek bir blob için aynı anda birden çok PUT (Blok Koy) işleminin gerçekleşmesine neden olur. Blok Listesini Koy işlemi, blobu oluşturan blok kimliklerinin listesini belirterek bir blob yazar. Bir blobun parçası olarak yazılabilmesi için bir bloğun sunucuya bir önceki Blok Koyma işleminde başarıyla yazılmış olması gerekir.

Not

Bu hata, karşıya yüklemeyi başlattıktan sonra ancak işlemeden önce eşzamanlı karşıya yükleme işlemeleri sırasında oluşabilir. Bu durumda karşıya yükleme başarısız olur. Uygulama, hata oluştuğunda karşıya yüklemeyi yeniden deneyebilir veya gerekli senaryoyu temel alan başka bir kurtarma eylemini deneyebilir.

Çözüm: Kiraları kullanma

İyimser eşzamanlılık kullanmak yerine Azure Depolama SDK'sını veya Azure Depolama Gezgini gibi GUI tabanlı bir aracı kullanarak kötümser eşzamanlılık (kiralar) uygulamayı deneyin. İyimser ve kötümser eşzamanlılık hakkında daha fazla bilgi için bkz. Blob depolamada eşzamanlılığı yönetme.

Hata eşzamanlılık sorunlarından kaynaklanıyorsa, Neden 1'deki çözümlerden birini izleyerek kaydedilmemiş blokları da temizlemeniz gerekebilir.

Yardım için bize ulaşın

Sorularınız veya yardıma ihtiyacınız varsa bir destek isteği oluşturun veya Azure topluluk desteği isteyin. Ürün geri bildirimini Azure geri bildirim topluluğuna da gönderebilirsiniz.