SQL Server bir sütunu bir int için güncelleştirirken işlem günlüğü doldurma nasıl


18

Denilen bir SQL Server 2005 tablo BRITTNEY_SPEARS_MARRIAGESvar ve aşağıdaki sütunlara sahiptir:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

Şimdi başka bir masam var BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

Sorun, MarrigeIdsütunu bir ' intden a' ya güncellemek istiyoruz tinyint. Brittney'in her şey söylenmeden ve yapılmadan önce çok sayıda evliliği olacağını hissediyoruz.

Şimdi BRITTNEY_SPEARS_MARRIAGE_STORIEStablonun içinde 18 milyon satır var (hey kız bazı sorunları var) bu yüzden güncelleme yapmaya gittiğimizde işlem günlüğü dolar ve SQL Server kutumuz ölür.

Bunu nasıl başarabiliriz?

Yine de "Hey SQL Server bu sütunu güncelleyeceğim ve büyüteceğim. Bana bu SQL Server'da güven. Her şeyi doğrulamaya çalışırken lütfen işlem günlüğünü doldurmayın?"

Yanıtlar:


7

SQL Server'a işlem günlüğünü kullanmamasını söylemenin bir yolu yoktur.

Ne yapabilirsiniz yapmak alana ihtiyaç olarak eski günlük girişlerini üzerine yazılır BASİT için veritabanının kurtarma modeli ayarlanır. Ancak bunu üretim sunucunuzda yapmamalısınız, çünkü zaman içinde geri yüklemeler gibi belirli geri yükleme türlerini gerçekleştiremezsiniz.

Alternatif olarak, işlem günlüğü dosyanızı daha büyük olarak ayarlayabilirsiniz - bilimsel olmayan bir başparmak kuralı olarak, A) işlem günlüğünüzde tablonuzun veya B boyutundan en az 1,5 kat daha fazla boş alan olduğundan emin olun. işlem günlüğünüzün, en azından bu kadar boş disk alanı .

Günlüğü yedekleyerek işlem günlüğü alanında yer açabilirsiniz. Günlük içeriğiyle ilgilenmezseniz, dosyayı atın. Bunun için bir kısayol BACKUP LOG <Your Database Name> TO DISK = 'NUL:'. Yine, sonuçları anladığınızdan emin olmadığınız sürece bunu bir üretim sunucusunda yapmayın .

Dikkat edilmesi gereken başka bir şey de (sorunuza tamamen uygun olmasa da) genişlettiğiniz tablonun üzerinde tanımlanmış kümelenmiş bir dizin olduğundan emin olmaktır. Değilse, tablo çok büyük miktarda yığın parçalanmasına neden olabilir ve böyle bir değişiklikle potansiyel olarak gereksiz yere büyük olabilir.


5
  • Yabancı anahtarları bırakın
  • Yeni tablolar oluşturun intyerinetinyint
  • Satırları 1000 parti başına taşıyın (yeni tabloya ekleyin, eskisinden silin)
  • Eski tabloları bırakın
  • Kullanarak yeni tabloları eski adlarla yeniden adlandırın sp_rename
  • Yabancı anahtarları yeniden oluşturun

pS İşlem günlüğünüz büyükse ... kurtarma modelinizi kontrol edin. Kurtarma modeliniz değilse simple, günlüğü en son yedeklemeniz ne kadar sürdü?


Günlüğü yedeklediğinizden, veritabanını yedeklediğinizde günlüğü küçülmezsiniz.
HLGEM

@HLGEM: Haklısın, Paul Randal'dan bu konuda bir makale okudum. Beklenmedik olsa da, yalnızca tam yedeklemeler yaparsanız günlüğünüz büyümeye devam eder.
Andomar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.