SQL Server işlem günlüğünü nasıl temizlersiniz?


577

Ben bir SQL uzmanı değilim ve temel bilgilerin ötesinde bir şey yapmam gerektiğinde bunu hatırlattım. Ben büyük olmayan bir test veritabanı var, ama işlem günlüğü kesinlikle. İşlem günlüğünü nasıl temizleyebilirim?



3
Managment Studio'da bir komut olmalıdır: "Günlüğü Küçültmek için Tıklayın" ve işiniz bitti.
frenchie

Yanıtlar:


749

Bir günlük dosyasını küçültmek, tekrar olmasını beklemediğiniz beklenmedik büyümeyle karşılaştığı senaryolara ayrılmalıdır. Günlük dosyası tekrar aynı boyuta büyürse, geçici olarak küçülterek çok fazla şey başarılmaz. Şimdi, veritabanınızın kurtarma hedeflerine bağlı olarak, yapmanız gereken eylemlerdir.

İlk olarak, tam bir yedek alın

Bir şey ters gittiğinde geri yükleyebilmenizi sağlamadan veritabanınızda asla değişiklik yapmayın.

Zamanında iyileşmeyi önemsiyorsanız

(Zamanında kurtarma ile, tam veya farklı bir yedeklemeden başka bir şeye geri yükleme yapabileceğinizi kastediyorum.)

Muhtemelen veritabanınız FULLkurtarma modunda. Değilse, olduğundan emin olun:

ALTER DATABASE testdb SET RECOVERY FULL;

Düzenli tam yedeklemeler alsanız bile, günlük dosyası bir günlük yedeklemesi gerçekleştirene kadar büyüyecek ve büyüyecektir - bu sizin güvenliğiniz içindir, disk alanınızda gereksiz yere yemek yememek değil. Kurtarma hedeflerinize göre bu günlük yedeklemelerini sık sık gerçekleştiriyor olmalısınız. Örneğin, bir felaket durumunda 15 dakikadan fazla veri kaybetmeyi göze alabileceğinizi belirten bir iş kuralınız varsa, günlüğü 15 dakikada bir yedekleyen bir işiniz olmalıdır. İşte şimdiki zamana göre zaman damgalı dosya adları üretecek bir komut dosyası (ancak bunu bakım planları vb. İle de yapabilirsiniz, sadece bakım planlarındaki küçültme seçeneklerinden herhangi birini seçmeyin, korkunçturlar).

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

Bunun \\backup_share\, farklı bir temel depolama aygıtını temsil eden farklı bir makinede olması gerektiğini unutmayın . Bunları aynı makineye (veya aynı temel diskleri kullanan farklı bir makineye veya aynı fiziksel ana bilgisayarda bulunan farklı bir VM'ye) yedeklemek size gerçekten yardımcı olmaz, çünkü makine patlarsa veritabanınızı kaybettiniz ve yedekleri. Ağ altyapınıza bağlı olarak, yerel olarak yedekleme yapmak ve daha sonra bunları sahne arkasındaki farklı bir konuma aktarmak daha mantıklı olabilir; her iki durumda da, onları birincil veritabanı makinesinden olabildiğince çabuk çıkarmak istersiniz.

Şimdi, düzenli günlük yedeklemeleriniz çalıştıktan sonra, günlük dosyasını şimdiye kadar patladığından daha makul bir şeye küçültmek mantıklı olmalıdır. Bu mu değil çalışan anlamına SHRINKFILEdefalarca günlük dosyası 1 MB kadar - sık günlüğü yedekleme bile, yine de oluşabilir herhangi eşzamanlı işlemlerin toplamı karşılamak gerekiyor. SQL Server dosyaları sıfırlamak zorunda olduğu için günlük dosyası otomatik büyüme olayları pahalıdır (anlık dosya başlatma etkinleştirildiğinde veri dosyalarının aksine) ve bu işlem sırasında kullanıcı işlemleri beklemek zorundadır. Bu büyümek-küçültmek-büyümek-küçültmek rutini mümkün olduğunca az yapmak istiyorsunuz ve kesinlikle kullanıcılarınızın bunun için ödeme yapmasını istemiyorsunuz.

Büzülme mümkün olmadan önce günlüğü iki kez yedeklemeniz gerekebilir (teşekkürler Robert).

Bu nedenle, günlük dosyanız için pratik bir boyut bulmanız gerekir. Burada kimse sisteminiz hakkında çok daha fazla şey bilmeden size ne olduğunu söyleyemez, ancak günlük dosyasını sık sık küçültüyorsanız ve tekrar büyüyorsa, iyi bir filigran muhtemelen en büyük olandan% 10-50 daha yüksektir . Diyelim ki 200 MB'a geliyor ve sonraki otomatik büyüme olaylarının 50 MB olmasını istiyorsanız, günlük dosyası boyutunu şu şekilde ayarlayabilirsiniz:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

Günlük dosyası şu anda> 200 MB ise, önce bunu çalıştırmanız gerekebileceğini unutmayın:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

Zamanında iyileşmeyi umursamıyorsanız

Bu bir sınama veritabanı ise ve zaman içinde kurtarmayı umursamıyorsanız, veritabanınızın SIMPLEkurtarma modunda olduğundan emin olmalısınız .

ALTER DATABASE testdb SET RECOVERY SIMPLE;

Veritabanını SIMPLEkurtarma moduna getirmek, SQL Server'ın tüm işlemlerin ( FULLgünlük kaydı yedekleninceye kadar kurtarma işlemi gibi) kaydını tutmak için büyümek yerine günlük dosyasının bölümlerini (esas olarak etkin olmayan işlemlerin aşamalı olarak kaldırılması) kullanmasını sağlar . CHECKPOINTolaylar günlüğün kontrolüne yardımcı olur ve CHECKPOINTs arasında çok fazla t-log etkinliği üretmediğiniz sürece büyümesinin gerekmediğinden emin olur .

Daha sonra, bu günlük büyümesinin gerçekten normal bir günlük kullanımdan değil, anormal bir olaydan (örneğin, yıllık bir bahar temizliği veya en büyük dizinlerinizi yeniden oluşturması) kaynaklandığından emin olmalısınız. Günlük dosyasını gülünç derecede küçük bir boyuta küçültürseniz ve SQL Server'ın normal etkinliğinize uyması için yeniden büyütmesi gerekiyorsa, ne kazandınız? Serbest bıraktığınız disk alanını geçici olarak kullanabildiniz mi? Derhal bir düzeltmeye ihtiyacınız varsa, aşağıdakileri çalıştırabilirsiniz:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO

Aksi takdirde, uygun bir boyut ve büyüme oranı ayarlayın. Zamanında kurtarma durumundaki örneğe göre, hangi dosya boyutunun uygun olduğunu belirlemek ve makul otomatik büyüme parametrelerini ayarlamak için aynı kodu ve mantığı kullanabilirsiniz.

Yapmak istemediğiniz bazı şeyler

  • Günlüğü TRUNCATE_ONLYseçenekle yedekleyin ve sonraSHRINKFILE . Birincisi, bu TRUNCATE_ONLYseçenek kullanımdan kaldırılmıştır ve SQL Server'ın geçerli sürümlerinde artık mevcut değildir. İkincisi, FULLkurtarma modelindeyseniz, bu günlük zincirinizi yok eder ve yeni, tam bir yedekleme gerektirir.

  • Veritabanını ayırın, günlük dosyasını silin ve yeniden ekleyin . Bunun ne kadar tehlikeli olabileceğini vurgulayamıyorum. Veritabanınız geri gelmeyebilir, şüpheli olarak görünebilir, bir yedeğe (varsa) geri dönmeniz gerekebilir.

  • "Veritabanını küçült" seçeneğini kullanın . DBCC SHRINKDATABASEve aynısını yapmak için bakım planı seçeneği, özellikle yalnızca bir günlük sorunu sorununu çözmeniz gerektiğinde kötü fikirlerdir. Kullanarak, ayarlamak istediğiniz ve bağımsız olarak ayarlamak dosyayı Hedef DBCC SHRINKFILEveya ALTER DATABASE ... MODIFY FILE(örnekler üzerinde).

  • Günlük dosyasını 1 MB'ye küçültün . Heyecan verici görünüyor çünkü, hey, SQL Server bunu belirli senaryolarda yapmama izin verecek ve serbest bıraktığı tüm alana bakacak! Veritabanınız salt okunur olmadığı sürece (ve bunu kullanarak olduğu gibi işaretlemeniz gerekir ALTER DATABASE), bu günlük sadece kurtarma modelinden bağımsız olarak mevcut işlemleri barındırmak zorunda olduğundan, gereksiz birçok büyüme olayına yol açacaktır. SQL Server'ın yavaş ve acı verici bir şekilde geri alabilmesi için bu alanı geçici olarak boşaltmanın anlamı nedir?

  • İkinci bir günlük dosyası oluşturun . Bu, diskinizi dolduran sürücü için geçici olarak rahatlama sağlayacaktır, ancak bu delinmiş bir akciğeri bir bant yardımı ile düzeltmeye çalışmak gibidir. Sorunlu günlük dosyasıyla, başka bir potansiyel sorun eklemek yerine doğrudan ilgilenmelisiniz. Bazı işlem günlüğü etkinliklerini farklı bir sürücüye yeniden yönlendirmek dışında, ikinci bir günlük dosyası sizin için hiçbir şey yapmaz (ikinci bir veri dosyasının aksine), çünkü aynı anda dosyalardan yalnızca biri kullanılabilir. Paul Randal, birden çok günlük dosyasının neden daha sonra sizi ısırdığını da açıklıyor .

Proaktif olun

Günlük dosyanızı bir miktar küçültmek ve sürekli olarak kendi başına küçük bir oranda otomatik olarak büyümesine izin vermek yerine, makul ölçüde büyük bir boyuta (en büyük eşzamanlı işlem kümenizin toplamını barındıracak şekilde) ayarlayın ve makul bir otomatik büyüme ayarlayın tek bir işlemi tatmin etmek için birden fazla büyümek zorunda kalmamak ve böylece normal iş operasyonları sırasında büyümesi nispeten nadir olacaktır.

Buradaki olası en kötü ayarlar 1 MB büyüme veya% 10 büyüme. Oldukça komik, bunlar SQL Server için varsayılanlar (ki şikayet edip boşuna değişiklik istediğim ) - veri dosyaları için 1 MB ve günlük dosyaları için% 10. Birincisi bu gün ve yaşta çok küçük ve ikincisi her seferinde daha uzun ve daha uzun olaylara yol açıyor (diyelim ki günlük dosyanız 500 MB, ilk büyüme 50 MB, bir sonraki büyüme 55 MB, bir sonraki büyüme 60.5 MB - ve yavaş G / Ç'de, inanın bana, bu eğriyi gerçekten göreceksiniz)

daha fazla okuma

Lütfen burada durmayın; günlük dosyalarını daraltma konusunda gördüğünüz tavsiyelerin çoğu doğal olarak kötü ve hatta potansiyel olarak felaket olsa da, disk bütünlüğünü boşaltmaktan çok veri bütünlüğüne önem veren bazı insanlar var.

2009 yılında yazdığım bir blog yazısı, birkaç "günlük dosyasını nasıl küçülteceğimizi" gördüğümde yayınlar ortaya çıkıyor .

Bir blog yazısı Brent Ozar gereken bir SQL Server Dergi yazıya cevaben, çoklu kaynaklara işaret ederek, dört yıl önce yazdığı değil yayınlanmıştır .

Paul Randal'ın t-log bakımının neden önemli olduğunu ve veri dosyalarınızı neden küçültmemeniz gerektiğini açıklayan bir blog yazısı .

Mike Walsh, günlük dosyanızı hemen küçültememenizin nedenleri de dahil olmak üzere bu yönlerden bazılarını da kapsayan harika bir cevaba sahiptir .


5
Tam kurtarma modelini kullanmanın tek nedeni tam zamanlı kurtarma değildir. Bunun ana nedeni veri kaybını önlemektir. Veri kaybı potansiyeliniz yedeklemeler arasındaki uzunluktur. Yalnızca günlük yedekleme yapıyorsanız, veri kaybı potansiyeliniz 24 saattir. Daha sonra her yarım saatte bir günlük yedekleri eklerseniz, veri kaybı potansiyeliniz 30 dakika olur. Ayrıca, herhangi bir parça parça geri yükleme gerçekleştirmek için günlük yedeklemeleri gerekir (bozulmadan kurtulmak gibi).
Robert L Davis

9
Bu bir yana, bu sayfada verilen en eksiksiz ve doğru cevap bu.
Robert L Davis

11
Ayrıca günlük temizliği (tam veya toplu günlük kurtarma) veya bir kontrol noktası (basit kurtarma) yedekleyerek yapılır eklemek istiyorum. Ancak, günlük dosyasını küçültmeniz gereken bir durumdaysanız, bu yeterli değildir. Şu anda etkin olan VLF'nin günlük dosyasının başlangıcına geri dönmesine neden olmanız gerekir. İki günlük yedeklemesi veya denetim noktası arka arkaya yayınlayarak SQL 2008 ve daha yeni sürümlerde bunu zorlayabilirsiniz. Birincisi onu temizler ve ikincisi dosyanın başlangıcına geri döndürür.
Robert L Davis

2
@Doug_Ivison çünkü herhangi bir noktada günlük kayıtları temizlenebilir. Eksik olan bir günlüğü yedeklemenize izin vermenin anlamı nedir? Basit kurtarma işleminde, günlük yalnızca işlemlerin geri alınmasına izin vermek için kullanılır. Bir işlem yapıldıktan veya geri alındıktan sonra, bir sonraki saniye günlükten çıkarılabilir.
Aaron Bertrand

3
@zinczinc Tamam, geri bildiriminiz için teşekkür ederiz. Önce cevabı ve daha sonra açıklamayı koymakla ilgili gördüğüm sorun, önemli parçaları asla okumamalarıdır. Okuyucuyu boğduğum ders aslında sondaki cevaptan çok daha önemli ve sağladığım IMHO bu seçimleri yapmak için oldukça önemli. Ama hey, OP için daha iyi olduğunu düşündüğünüz için tek satırlık bir cevap göndermek istiyorsanız, lütfen hepimizin öğrenebileceği daha iyi bir cevap vermek için cevabımın bu bölümünü kullanmaktan çekinmeyin.
Aaron Bertrand

201
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1]) 


USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

Gönderen: DBCC SHRINKFILE (Transact-SQL)

İlk önce yedekleme yapmak isteyebilirsiniz.


teşekkürler Maimonides, onun dokümanlar, bu yüzden en iyi olduğunu söyleyebilirim: P özellikle çünkü benim tarafımdan icat değildi :)
Rui Lima

1
Bunu yaptıktan sonra, günlük boyutum biraz değişmedi. ben yanlış bir şey mi yaptım?
chester89

1
Bu yaklaşım, kurtarma türü daha önce başka bir şey olsa bile kurtarma türünü "TAM" olarak ayarlar
Vil

1
Sihir gibi çalıştı! Günlük dosyasının adının aslında mantıksal adı olduğuna dikkat edin (db-> properties-> dosyalarında bulunabilir)
Bizhan

2
Bu komut dosyasına bir YEDEK VERİTABANI yan tümcesi eklerdim, bu yüzden kimse bu bölümü unutmaz. Bunu söylüyorum, çünkü birkaç yıl önce çok az boş alana sahip bir diskteki bir veritabanını küçültdüm. Küçültme işleminde dosyalar büyüyordu ve Boş Alan hatası atıldı. Sonuç: Veritabanını kaybettim. Neyse ki toleransı kaybeden bir günlük veritabanıydı.
Cesar

185

YASAL UYARI: Lütfen aşağıdaki yorumları dikkatlice okuyun ve kabul edilen cevabı zaten okuduğunuzu varsayıyorum. Neredeyse 5 yıl önce söylediğim gibi:

Herkesin bu yeterli veya optimal bir çözüm OLMADIĞI durumlar için eklemek için herhangi bir yorumu varsa lütfen aşağıya yorum yapın


  • Veritabanı adına sağ tıklayın.

  • Görevler → Küçült → Veritabanı'nı seçin

  • Sonra tıklayın OK!

Genellikle veritabanı dosyalarını içeren Windows Gezgini dizinini açarım, böylece efekti hemen görebilirim.

Aslında bu işe yaradı oldukça şaşırdım! Normalde daha önce DBCC kullandım, ama sadece denedim ve hiçbir şey küçültmedim, bu yüzden GUI'yi (2005) denedim ve harika çalıştı - 10 saniyede 17 GB boşaltma

Tam kurtarma modunda bu çalışmayabilir, bu nedenle önce günlüğü yedeklemeniz veya Basit kurtarma'ya değiştirmeniz ve ardından dosyayı daraltmanız gerekir. [bunun için teşekkürler @onupdatecascade]

-

Not: Bazılarının bunun tehlikeleri hakkında neler yorum yaptığını takdir ediyorum, ama çevremde bunu kendim yaparken özellikle herhangi bir sorun yaşamadım çünkü her zaman önce tam bir yedekleme yaptım. Bu yüzden lütfen devam etmeden önce ortamınızın ne olduğunu ve bunun yedekleme stratejinizi ve iş güvenliğinizi nasıl etkilediğini göz önünde bulundurun. Tüm yaptığım insanları Microsoft tarafından sağlanan bir özelliğe işaret etmekti!


50
Tam kurtarma modunda bu çalışmayabilir, bu nedenle önce günlüğü yedeklemeniz veya Basit kurtarma'ya değiştirmeniz ve ardından dosyayı daraltmanız gerekir.
onupdatecascade

7
@ onupdatecascade - tam kurtarma hilesi iyi çağrı. büyük bir günlüğe sahip başka bir veritabanına sahipti: basit hale getirildi, sonra veritabanını küçültüp tekrar tam olarak değiştirdi. günlük dosyası 500kb'ye kadar!
Simon_Weaver

26
Afedersiniz. Ancak bu cevap DAHA FAZLA yanlış olamaz. Veritabanını daraltarak işlem günlüğü dosyasını büyütürsünüz. Herhangi bir veri bir SQL Server veritabanında taşıdığınızda, günlüğe kaydetme - günlük dosyasını şişirme gerekir. Günlük boyutunu küçültmek için, DB'yi Basit Kurtarma YA DA olarak ayarlayın (günlüğe kaydedilen verileri önemsiyorsanız / gerekiyorsa - ve neredeyse her zaman üretimde yaparsanız) günlüğü yedekleyin. Bu basit, ücretsiz, videolarda daha fazla ayrıntı: sqlservervideos.com/video/logging-essentials sqlservervideos.com/video/sql2528-log-files
Michael K. Campbell

30
Vay be, bu cevap için 1300+ temsilcisi almak için kudos, ama gerçekten korkunç bir tavsiye.
Aaron Bertrand

8
Neler olduğunu ve küçülmenin periyodik olarak neden kesinlikle kritik olduğunu göstermek için bir abartı: A kaydı, bir yedekleme yapılmadan önce 1 milyon kez değiştirildi. Günlükte neler var? İlgisiz 999,999 veri parçası. Günlükler hiçbir zaman küçülmezse, veritabanının gerçek işletme giderlerinin ne olduğunu asla bilemezsiniz. Ayrıca, büyük olasılıkla bir SAN'da değerli kaynaklar araştırıyorsunuz. Daraltma iyi bir bakımdır ve sizi çevrenizle temas halinde tutar. Bana asla küçülmemen gerektiğini düşünen birini göster, ben de çevrelerini görmezden gelen birine göstereyim.
Newclique

54

Aşağıda işlem günlüğünü daraltmak için bir komut dosyası vardır, ancak işlem günlüğünü daraltmadan önce yedeklemenizi kesinlikle öneririm.

Sadece dosyayı küçültürseniz, felaket durumunda hayat kurtarıcı olarak gelebilecek bir ton veri kaybedersiniz. İşlem günlüğü, bir üçüncü taraf işlem günlüğü okuyucusu kullanılarak okunabilen birçok yararlı veri içerir (manuel olarak okunabilir, ancak aşırı çaba gösterilebilir).

İşlem günlüğü de zaman kurtarma konusunda bir zorunluluktur, bu yüzden sadece atmayın, ancak önceden yedeklediğinizden emin olun.

Kullanıcıların kurtarma işlemini gerçekleştirmek için işlem günlüğünde depolanan verileri kullandığı birkaç gönderi şunlardır:

 

USE DATABASE_NAME;
GO

ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);

ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO

Yukarıdaki komutları yürütürken şöyle görünen bir hata alabilirsiniz

“Dosyanın sonunda bulunan mantıksal günlük dosyası kullanımda olduğundan günlük dosyası (günlük dosyası adı) küçültülemiyor”

Bu, TLOG'un kullanımda olduğu anlamına gelir. Bu durumda, bunu arka arkaya birkaç kez çalıştırmayı deneyin veya veritabanı etkinliklerini azaltmanın bir yolunu bulun.


30

İşte basit ve çok beceriksiz ve potansiyel olarak tehlikeli bir yol.

  1. Yedek DB
  2. DB'yi ayır
  3. Günlük dosyasını yeniden adlandır
  4. DB ekle
  5. Yeni günlük dosyası yeniden oluşturulacak
  6. Yeniden Adlandırılan Günlük dosyasını silin.

Günlük yedeklemesi yapmadığınızı tahmin ediyorum. (Hangi günlük keser). Benim tavsiyem kurtarma modelini değiştirmektir tam için basit . Bu, günlük şişkinliğini önleyecektir.


15
Saygılarımla, günlüğü silmek / yeniden adlandırmak / yeniden oluşturmak / değiştirmek çok kötü bir fikirdir. Shrink daha az risklidir, ayrıca yapılması oldukça kolaydır.
onupdatecascade

12
+1 - Yetersiz ya da değil, bu yöntem tüm diski dolduran veritabanı günlükleriyle beni birkaç kez sıcak sudan çıkardı, böylece bir shrink komutu bile çalışamaz.
Shaul Behr

3
Günlükte denetlenmeyen işlemlerin riski yoktur?
Paul

Bu, daha küçük DB'ler için de iyi olabilir, ancak 3 veya 4 TB DB'niz varsa, en iyi çözüm olmayabilir.
Jaques

Uzun zamandır bir sistem geliştiriyorsanız ve geliştirici devri boyunca binlerce kaydı yüklüyorsanız / siliyorsanız bu sorun görünmüyor. Daha sonra bu veritabanını yaşamak için dağıtmak istediğinizde, günlüğe kaydedilen test / geliştirme verileri gereksizdir ve bu nedenle kaybolması önemli değildir, hayır?
JsonStatham

28

İşlem günlüklerini geri yüklemeler için kullanmazsanız (örn. Yalnızca tam yedeklemeler yaparsınız), Kurtarma Modunu "Basit" olarak ayarlayabilirsiniz ve işlem günlüğü çok kısa sürede küçülür ve bir daha asla doldurulmaz.

SQL 7 veya 2000 kullanıyorsanız, veritabanı seçenekleri sekmesinde "oturum açma denetim noktasını kısalt" seçeneğini etkinleştirebilirsiniz. Bu aynı etkiye sahiptir.

Üretim ortamlarında bu önerilmez, çünkü zaman içinde bir noktaya geri yükleyemezsiniz.


1
Kurtarma modunu basit olarak ayarlamak, işlem günlüğünü sihirli bir şekilde küçültmez.
Aaron Bertrand

@Aaron Kendi başına değil, hayır. OP'nin test veritabanını kullanacağını varsaydım ve bu nedenle "işlem günlüğü çok kısa sürede küçülecek", ancak bunun daha fazla yan etkisi olduğu konusunda haklısınız: Basit kurtarma modu muhtemelen sizi küçülecek işlem günlüğü yakında
Jonathan

Simple... ve bir daha asla doldurmayın” - doğru değil. Kurtarma Modelinin "BASİT" olarak ayarlandığı bir veritabanında (son 48 saat içinde) olduğunu gördüm. Günlük dosyasının dosya büyümesi "kısıtlı" olarak ayarlandı ve üzerinde çok büyük bir etkinlik yapıyorduk ... Bunun olağandışı bir durum olduğunu anlıyorum. (Çok fazla disk alanımız olan durumumuzda, günlük dosyası boyutunu artırdık ve günlük dosyası dosya büyümesini "kısıtlamasız" olarak ayarladık ... bu arada - arayüz hatası - değişiklikten sonra "kısıtlı" olarak görünüyor "2.097.152 MB boyutunda.)
Doug_Ivison

2
@ Dog_Ivison Evet, işlem günlüğünde açık işlemler olacak, ancak bir denetim noktası gerçekleştikten sonra basit modda kaldırılacaklar. Bu cevap sadece hızlı bir şekilde "geliştirme / test kutumun büyük bir işlem günlüğüne sahip olması ve bu yüzden gitmesini istiyorum, bu yüzden çok sık endişelenmem gerekmiyor" ortamı. Tekrarlamak için: Bunu üretimde yapmayın .
Jonathan

1
Hepsi bu, ve bunun sadece gelişime yönelik hızlı bir yaklaşım olduğunu düşünüyorum. Neden yorum yaptım: Bana kadar, basit kurtarma modelinin ASLA dolmayacağını düşündüm ... ve sanırım olağandışı büyük işlemlerin bunu yapabileceğini anlamaya başladım.
Doug_Ivison

9

Veritabanının günlük dosyası olmadan ekleneceğinin garantisi olmadığından, John'un önerdiği bu teknik önerilmez. Veritabanını tamdan sade değiştirin, bir denetim noktasını zorlayın ve birkaç dakika bekleyin. SQL Server, daha sonra DBCC SHRINKFILE kullanarak daraltabileceğiniz günlüğü temizler.


... ama onlarca kez sorunsuz yaptım. belki db'nin neden yeniden eklenmeyebileceğini açıklayabilirsiniz.
Johnno Nolan

Ben vesilesiyle (çok sık değil) SQL Server günlük dosyası silindiğinde veritabanını geri eklemek mümkün gördüm. Bu size işe yaramaz bir MDF dosyası bırakır. Soruna neden olabilecek birkaç olasılık var. Geri alma bekleyen işlemler akla geliyor.
mrdenny

4
Bu taktiğe katılıyorum, ancak öngörülemeyen ve / veya olağanüstü bir olay nedeniyle kütüğün patladığı durumlar için ayrılmalıdır. Bunu her hafta yapacak bir iş ayarladıysanız, bunu çok ama çok yanlış yapıyorsunuz.
Aaron Bertrand

2
Çok, çok doğru Aaron.
mrdenny

Evet, bu bizim başımıza geldi. Veritabanını taşımadan önce verileri yedeklediğimiz için 20G günlük dosyasını boşaltmak istedik. MSSQL, yeni veritabanını mizahi günlük dosyası olmadan yeniden eklememize izin vermez.
George M Monica

9

Veritabanı kullanıyorsa En cevapları burada şimdiye kadar ancak aslında İşlem Günlüğü dosyasını ihtiyacım olmadığını varsayıyoruz FULLkurtarma modeli ve daha sonra, veritabanını geri yüklemek gerektiğinde kullanılmak üzere yedeklerini tutmak istiyorum yok kesmek veya silme bu cevapların çoğunun önerdiği şekilde günlük dosyası.

Günlük dosyasını ortadan kaldırmak (keserek, atmak, silmek, vb.) Yedekleme zincirinizi bozar ve son dolu, diferansiyel veya işlem günlüğü yedeklemenizden sonraki tam güne kadar herhangi bir zamanda geri yüklemenizi önler veya diferansiyel yedekleme yapılır.

Gönderen Microsoft makalesindeBACKUP

İşlem günlüğünü el ile kesmek için hiçbir zaman NO_LOG veya TRUNCATE_ONLY kullanmamanızı öneririz, çünkü bu işlem günlük zincirini bozar. Bir sonraki tam veya diferansiyel veritabanı yedeklemesine kadar, veritabanı medya hatasından korunmaz. Manuel günlük kesme işlemini yalnızca çok özel durumlarda kullanın ve verilerin hemen yedeklerini oluşturun.

Bundan kaçınmak için, küçülmeden önce günlük dosyanızı diske yedekleyin . Sözdizimi şöyle görünecektir:

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)

3
, 1)Kısım dışında cevabınıza katılıyorum . Sorun şu ki, 1 MB'ye küçültürseniz, normal bir günlük boyutuna yol açan büyüme olayları oldukça maliyetli olacak ve büyüme oranı varsayılan% 10'a bırakılırsa bunların çoğu olacaktır .
Aaron Bertrand

9

İstenmeyen büyümesini önlemek için SQL Server işlem günlüğünün düzgün şekilde korunması gerekir. Bu, işlem günlüğü yedeklemelerinin yeterince sık çalıştırılması anlamına gelir. Bunu yapmazsanız, işlem günlüğünün dolması ve büyümeye başlaması riskiyle karşı karşıya kalırsınız.

Bu soruya verilecek cevapların yanı sıra, işlem günlüğü ortak mitlerini okumayı ve anlamayı tavsiye ediyorum. Bu okumalar işlem günlüğünü anlamaya ve "temizlemek" için hangi tekniklerin kullanılacağına karar vermeye yardımcı olabilir:

Dan 10 en önemli SQL Server işlem günlük mitlere :

Efsane: SQL Sunucum çok meşgul. SQL Server işlem günlüğü yedeklemeleri yapmak istemiyorum

SQL Server'daki en büyük performans yoğun işlemlerinden biri, çevrimiçi işlem günlüğü dosyasının otomatik büyüme olayıdır. İşlem günlüğü yedeklemelerini yeterince sık yapmadığınızda, çevrimiçi işlem günlüğü doldurulacak ve büyümek zorunda kalacaktır. Varsayılan büyüme boyutu% 10'dur. Veritabanı ne kadar yoğunsa, işlem günlüğü yedekleri oluşturulmazsa çevrimiçi işlem günlüğü o kadar hızlı büyür. SQL Server işlem günlüğü yedeklemesi oluşturmak çevrimiçi işlem günlüğünü engellemez, ancak otomatik büyüme olayı gerçekleşir. Çevrimiçi işlem günlüğündeki tüm etkinlikleri engelleyebilir

Gönderen İşlem günlüğü mitlere :

Efsane: Düzenli kütük daralması iyi bir bakım uygulamasıdır

YANLIŞ. Kütük büyümesi çok pahalıdır çünkü yeni yığın sıfırlanmalıdır. Sıfırlama işlemi bitinceye kadar tüm yazma etkinliği bu veritabanında durur ve disk yazma hızınız yavaş veya otomatik büyüme boyutu büyükse, bu duraklama çok büyük olabilir ve kullanıcılar bunu fark eder. Büyümeyi önlemek istemenizin bir nedeni de budur. Eğer günlüğü küçültürseniz, tekrar büyüyecek ve sadece gereksiz küçültme ve büyütme oyunlarında disk işlemini boşa harcıyorsunuz


5

Önce veritabanı kurtarma modelini kontrol edin. Varsayılan olarak, SQL Server Express Edition basit kurtarma modeli için bir veritabanı oluşturur (yanılmıyorsam).

Truncate_Only ile Yedekleme günlüğü DatabaseName:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile size mantıksal günlük dosyası adını verecektir.

Bakınız:

SQL Server veritabanındaki tam işlem günlüğünden kurtarma

Veritabanınız Tam Kurtarma Modelindeyse ve TL yedek almıyorsanız, bunu BASİT olarak değiştirin.


Geliştirici kutularımdaki günlük dosyalarını temizlememin yolu budur. Tüm ilgili yedekleme stratejileri vb ile Prod ortamları Ben DBA's ayrılmak :-)
Joon

TRUNCATE_ONLYSQL Server'ın geçerli sürümlerinde artık bir seçenek değildir ve onu destekleyen sürümlerde önerilmez (bkz. Rachel'ın cevabı ).
Aaron Bertrand

5

DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)Komutu kullanın . Bu bir test veritabanı ise ve yerden tasarruf etmeye / geri kazanmaya çalışıyorsanız, bu yardımcı olacaktır.

TX günlüklerinin, büyüyecekleri bir tür minimum / sabit durum boyutuna sahip olduğunu unutmayın. Kurtarma modelinize bağlı olarak günlüğü daraltamayabilirsiniz - TAM'da ve TX günlük yedekleri yayınlamıyorsanız günlük küçülemez - sonsuza kadar büyür. TX günlük yedeklemelerine ihtiyacınız yoksa kurtarma modelinizi Basit olarak değiştirin .

Ve unutmayın, hiçbir zaman günlük (LDF) dosyasını silin! Anında veritabanı bozulması olacak. Pişmiş! Bitti! Veri kaybı! "Onarılmamış" olarak bırakılırsa, ana MDF dosyası kalıcı olarak bozulabilir.

İşlem günlüğünü asla silmeyin - veri kaybedersiniz! Verilerinizin bir kısmı TX Günlüğünde (kurtarma modelinden bağımsız olarak) ... etkin bir şekilde silen TX günlük dosyasını ayırır ve "yeniden adlandırırsanız" veritabanınızın bir bölümünü .

TX Günlüğünü silmiş olanlar için, birkaç checkdb komutu çalıştırmak ve daha fazla veri kaybetmeden önce bozulmayı gidermek isteyebilirsiniz.

Bu konuda Paul Randal'ın blog gönderilerine göz atın, kötü tavsiye .

Ayrıca genel olarak, verilerinizi ciddi şekilde parçalayabileceğinden, MDF dosyalarında shrinkfile kullanmayın. Daha fazla bilgi için Kötü Tavsiye bölümünü inceleyin ("Veri dosyalarınızı neden küçültmemelisiniz")

Paul'un web sitesine bakın - bu soruları ele alıyor. Geçen ay Myth A Day dizisinde bu konuların çoğunu ele aldı .


+1 Bunun iyi bir fikir olmayabileceğini söyleyen ilk cevap olduğu için! OP bir test veritabanı belirtir, ancak daha genel durum için iyi bir değerdir.
Martin Smith

Eklemeliydim - TX günlüğünü silerseniz - Güncellemeyi Sürdür!
ripvlan

4

Günlük dosyasını kısaltmak için:

  • Veritabanını yedekleyin
  • Enterprise Manager kullanarak veya yürüterek veritabanını ayırın: Sp_DetachDB [DBName]
  • İşlem günlüğü dosyasını silin. (veya her ihtimale karşı dosyayı yeniden adlandırın)
  • Veritabanını kullanarak yeniden ekleyin: Sp_AttachDB [DBName]
  • Veritabanı eklendiğinde, yeni bir işlem günlüğü dosyası oluşturulur.

Günlük dosyasını daraltmak için:

  • No_Log ile yedekleme günlüğü [DBName]
  • Veritabanından birini küçültün:

    Kurumsal yöneticiyi kullanarak: - Veritabanına sağ tıklayın, Tüm görevler, Veritabanını daralt, Dosyalar, Günlük dosyasını seç, Tamam.

    T-SQL kullanma: - Dbcc Shrinkfile ([Log_Logical_Name])

Günlük dosyasının mantıksal adını sp_helpdb çalıştırarak veya Enterprise Manager'da veritabanının özelliklerine bakarak bulabilirsiniz.


İşlem günlüğünü asla silmeyin. Verilerinizin bir kısmı Günlük'te. Silin ve veritabanı bozulur. Aşağı oy için temsilcim yok.
ripvlan

4

Çoğu SQL Server'daki tecrübelerime göre, işlem günlüğünün yedeği yoktur. Tam yedeklemeler veya diferansiyel yedeklemeler yaygın bir uygulamadır, ancak işlem günlüğü yedeklemeleri gerçekten nadiren yapılır. Böylece işlem günlük dosyası sonsuza kadar büyür (disk dolana kadar). Bu durumda kurtarma modeli " basit " olarak ayarlanmalıdır . Sistem veritabanlarını "model" ve "tempdb" de değiştirmeyi unutmayın.

Veritabanı "tempdb" bir yedek anlamsız, bu nedenle bu db kurtarma modeli her zaman "basit" olmalıdır.


Veritabanını basit olarak ayarlamak, günlük dosyasını, halihazırda hangi durumda olursa olsun küçültmez. Daha da büyümesini önlemeye yardımcı olabilir (ancak yine de olabilir).
Aaron Bertrand

4
  1. MDB dosyasının yedeğini alın.
  2. SQL hizmetlerini durdurma
  3. Günlük dosyasını yeniden adlandırın
  4. Hizmeti başlat

(Sistem yeni bir günlük dosyası oluşturur.)

Yeniden adlandırılan günlük dosyasını silin veya taşıyın.


3

Veritabanı günlük dosyasının 28 GB olduğu yerde benimle oldu.

Bunu azaltmak için ne yapabilirsiniz? Aslında günlük dosyaları, bir işlem gerçekleştiğinde SQL sunucusunun tuttuğu dosya verileridir. Bir işlemin işlenmesi için SQL sunucusu aynı sayfaları ayırır. Ancak işlemin tamamlanmasından sonra, aynı işlemin gerçekleşmesi gibi bir işlem olabileceğini umarak aniden serbest bırakılmazlar. Bu yer kaplıyor.

Adım 1: Önce bu komutu, veritabanı sorgusu araştırılan denetim noktasında çalıştırın

Adım 2: Veritabanına sağ tıklayın Görev> Yedekle İşlem Günlüğü olarak yedekleme türünü seçin Yedekleme verilerini tutmak için bir hedef adres ve dosya adı ekleyin (.bak)

Bu adımı tekrarlayın ve şu anda başka bir dosya adı verin

resim açıklamasını buraya girin

Adım 3: Şimdi veritabanına gidin Veritabanına sağ tıklayın

Görevler> Büzüşmeler> Dosyalar Kullanılmayan alanı serbest bırakmak için Günlük Küçült eylemi olarak Dosya türünü seçin

resim açıklamasını buraya girin

4. Adım:

Günlük dosyanızı SQL 2014'te normal olarak kontrol edin.

C: \ Program Dosyaları \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA

Benim durumumda, 28 GB'tan 1 MB'a düşürüldü.


2

Bunu dene:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

TRUNCATE_ONLYSQL Server'ın geçerli sürümlerinde artık bir seçenek değildir ve onu destekleyen sürümlerde önerilmez (bkz. Rachel'ın cevabı ).
Aaron Bertrand

Benim için MSSQL Server 2005 Standard edition
bksi

2

Veritabanı → sağ tıklatın Özellikler → dosya → farklı bir adla başka bir günlük dosyası ekleyin ve yolu farklı bir dosya adıyla eski günlük dosyasıyla aynı şekilde ayarlayın.

Veritabanı yeni oluşturulan günlük dosyasını otomatik olarak alır.


1
  1. Yedek DB
  2. DB'yi ayır
  3. Günlük dosyasını yeniden adlandır
  4. DB'yi ekleyin (yeniden adlandırılmış .ldf'yi (günlük dosyası) kaldırırken. Seçin ve Kaldır düğmesine basarak kaldırın)
  5. Yeni günlük dosyası yeniden oluşturulacak
  6. Yeniden Adlandırılan Günlük dosyasını silin.

Bu işe yarayacaktır, ancak önce veritabanınızın yedeğini almanız önerilir.


1

Diğer cevaplar benim için işe yaramadı: db çevrimiçi iken kontrol noktası oluşturmak mümkün değildi, çünkü işlem günlüğü doluydu (ne kadar ironik). Ancak, veritabanını acil durum moduna ayarladıktan sonra günlük dosyasını küçülttüm:

alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);

0

Misal:

DBCC SQLPERF(LOGSPACE)

BACKUP LOG Comapny WITH TRUNCATE_ONLY

DBCC SHRINKFILE (Company_log, 500)

DBCC SQLPERF(LOGSPACE)

TRUNCATE_ONLYSQL Server'ın geçerli sürümlerinde artık bir seçenek değildir ve onu destekleyen sürümlerde önerilmez (bkz. Rachel'ın cevabı ).
Aaron Bertrand

Soru, yardım merkezinde tanımlandığı gibi Yığın Taşması için konu ile ilgili değildir . Lütfen bu tür soruları cevaplamayın; bunun yerine, dikkat çekmek için işaretlemelisiniz ve uygun şekilde kapatılacak veya taşınacaklar.
Toby Speight

0

MSSQL 2017 için ve SQL sunucu yönetim stüdyosunu kullanarak biraz güncellenmiş cevap. Çoğunlukla bu talimatlardan gittim https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/

Son bir db yedek vardı, bu yüzden işlem günlüğünü yedekledim. Sonra iyi bir önlem için tekrar yedekledim. Sonunda günlük dosyasını küçülttüm ve verilerimin boyutuna göre çok daha fazla 20G'den 7MB'a gittim. Ben bu işlem 2 yıl önce kurulduğundan beri işlem günlükleri hiç yedeklenmiş sanmıyorum .. yani bu görev temizlik takvimine koyarak.


-1

DB İşlem Günlüğü Min boyutuna küçült :

  1. Yedekleme: İşlem günlüğü
  2. Dosyaları daralt: İşlem günlüğü
  3. Yedekleme: İşlem günlüğü
  4. Dosyaları daralt: İşlem günlüğü

Birkaç DB üzerinde testler yaptım: bu dizi çalışıyor .

Genellikle 2 MB'ye küçülür .

VEYA bir komut dosyası ile:

DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>';               --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>';         --Input Variable
EXEC 
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO

1
TRUNCATE_ONLYSQL Server'ın geçerli sürümlerinde artık bir seçenek değildir ve onu destekleyen sürümlerde önerilmez (bkz. Rachel'ın cevabı ).
Aaron Bertrand
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.