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
- Aşağıdaki depolama hizmetlerinden birinden bir depolama hesabı:
- Azure Depolama SDK'sı
- Azure Depolama Gezgini
- PowerShell
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:
Aynı blob adına sahip ve aynı kapsayıcıda bulunan bir sahte blob oluşturun. Bu blobun uzunluğu sıfır olabilir.
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:
URI parametresinin olarak ayarlandığı
blocklisttype
uncommitted
Bir Blok Listesi URI'sini Alma isteği yaparak, kaydedilmemiş blok listesini alın.Blok Listesini Koy URI isteğini kullanarak blok listesini işleyin.
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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin