SQL Server günlük dosyasını kısaltma komutu nedir?


193

Bir meslektaşınıza göndermeden önce bir LDF dosyasını boşaltmam gerekiyor. SQL Server'ı günlüğü kesmeye nasıl zorlarım?

Yanıtlar:


130

iyi hatırlıyorsam ... sorgu analizörü veya eşdeğeri:

BACKUP LOG  databasename  WITH TRUNCATE_ONLY

DBCC SHRINKFILE (  databasename_Log, 1)

2
Bu, veritabanı kurtarma modelini SIMPLE (Blorgbeard'ın cevabında olduğu gibi) olarak ayarlamaktan kesinlikle daha iyidir, çünkü kurtarma modeliniz TAM ise, bir nedenle bu şekilde ayarlamış olursunuz.
Scott Whitlock

53
truncate_only, SQL Server 2008'de kullanımdan kaldırılmıştır, bu nedenle db'yi
Justin Moore

10
SQL Server 2012 için bu çalışır, ancak olmadan WITH TRUNCATE_ONLY.
net_prog

4
Net_prog'un söylediklerine ek olarak, SQL Server 2012 için ilk satırı değiştirdim BACKUP LOG DatabaseNameHere TO DISK='NUL:'.
Aaron Newton

'TRUNCATE_ONLY' tanınmış bir YEDEKLEME seçeneği değil. (SQL Server 2019 RC1)
Tomasz Gandor

304

Yönetim stüdyosunda:

  • Bunu canlı bir ortamda yapmayın, ancak dev db'nizi olabildiğince küçültmenizi sağlamak için:
    • Veritabanına sağ tıklayın Properties, ardından öğesini seçin Options.
    • "Kurtarma modeli" nin "Tam" değil, "Basit" olarak ayarlandığından emin olun
    • Tamam'ı tıklayın
  • Veritabanına tekrar sağ tıklayın, Tasks-> Shrink->Files
  • Dosya türünü "Günlük" olarak değiştir
  • Tamam'ı tıklayın.

Alternatif olarak, SQL bunu yapmak için:

 ALTER DATABASE mydatabase SET RECOVERY SIMPLE
 DBCC SHRINKFILE (mydatabase_Log, 1)

Ref: http://msdn.microsoft.com/tr-tr/library/ms189493.aspx


1
Cevabınız günümü kurtardı! "Sağ tıklama - Görevler -> Shrink" seçeneğini bilmiyordum. Teşekkür ederim!
René

7
Canlı bir ortamda ne yaparsınız? İlk olarak günlükler yedeklensin mi?
John Bubriski

1
Hiç DBA değilim, ama evet, günlüğü yedekleme bunu keser inanıyoruz: technet.microsoft.com/en-us/library/ms179478.aspx
Blorgbeard çıktı

2
@JohnBubriski Basit dışında bir kurtarma modeli kullanıyorsanız, günlükler veri kurtarma veya işlemleri geri alma için temel oluşturur. Yani, üretimde, günlük dosyalarını küçültmeden önce bu günlükleri yedeklemeniz gerekir. Aksi takdirde, gerçek bir kurtarma olasılığı olmazdı. Ne yazık ki, bir kurtarma durumundaysanız, DB'yi tamamen kurtarmak için tüm işlem günlüğü yedeklerini yeniden yüklemeniz gerekir. Eğlenceli zamanlar, emin olmak için! :)
tanımlar

1
SQL Server 2012'de use mydatabaseyürütmeden önce zorundadbcc shrinkfile
8

62

SQL Server 2008 için komut şöyledir:

ALTER DATABASE ExampleDB SET RECOVERY SIMPLE
DBCC SHRINKFILE('ExampleDB_log', 0, TRUNCATEONLY)
ALTER DATABASE ExampleDB SET RECOVERY FULL

Bu, 14GB günlük dosyamı 1 MB'a düşürdü.


5
Soru, hangi sürümün ve kabul edilen yanıtın SQL Server 2008 için geçerli olmadığı konusunda belirsiz olduğundan, bu cevap yaştan bağımsız olarak hala geçerlidir.
James Law

Teşekkürler, DBCC SHRINKFILE ile tepki vermeyen büyük bir Günlük dosyasını azaltmama yardımcı oldu
Christian Navelot

6
İşiniz bittiğinde kurtarma modelini TAM olarak değiştirmeyi unutmayın!
Dan Bechard

Bunu yapmadan önce (veya diğer kesme seçeneklerinden herhangi birini) yedeklemelisiniz. Tam bir yedekleme yapar ve SSMS'de 'Yalnızca yedeklemeyi kopyala' seçeneğini işaretlerseniz, artık günlüğe ihtiyacınız olmaz. (Bu sadece zaman yedekleme bir noktadır).
Simon_Weaver

37

SQL 2008 için günlüğü nulcihaza yedekleyebilirsiniz :

BACKUP LOG [databaseName]
TO DISK = 'nul:' WITH STATS = 10

Ve sonra DBCC SHRINKFILEgünlük dosyasını kısaltmak için kullanın .


2
Bu durum benim durumumda işe yarayan tek şey ... TRUNCATE_ONLY ile yedekleme kullanmaya çalışırken bir hata aldım
TomXP411

Not: Bu, SSD'de bile oldukça uzun sürebilir (atmak için günlüğü okumalıdır). Orta güçte çalışan bir Azure VM'deki 30 GB günlük dosyası için% 40'ın alınması 10 dakika sürer. İşlenen yüzdeyi görmek için 'Mesajlar'a geçtiğinizden emin olun.
Simon_Weaver

3

truncate_only ve ardından bir dbcc shrinkfile komutu ile yedekleme günlüğü


0

Benim için cevap yorumlara gömüldüğünden beri. SQL Server 2012 ve sonrası için aşağıdakileri kullanabilirsiniz:

BACKUP LOG Database TO DISK='NUL:'
DBCC SHRINKFILE (Database_Log, 1)

-5

Başka bir seçenek de veritabanını Management Studio üzerinden ayırmaktır. Sonra günlük dosyasını silin veya yeniden adlandırın ve daha sonra silin.

Management Studio'ya dönünce veritabanını tekrar ekleyin. Ekle penceresinde, günlük dosyasını dosya listesinden kaldırın.

DB yeni bir boş günlük dosyası ekler ve oluşturur. Her şeyin yolunda olduğunu kontrol ettikten sonra, yeniden adlandırılan günlük dosyasını silebilirsiniz.

Muhtemelen bunu üretim veritabanları için kullanmamalısınız.


4
Bunu asla yapma! Günlükte henüz veri dosyasına bağlı olmayan veriler olabilir. Bu tür verileri kaybedersiniz.
Paul

Cevabınızda, bunu üretimde denememeniz konusunda uyarırsanız, hiç göndermeye değmez.
Stan Shaw

9
Ben downvoters ile katılmıyorum - bu bir seçenektir. Yöneticiler sadece senaryolarını anlamalıdır. Örneğin, açık işlem yoksa 'taahhüt edilmemiş' veri olmayacaktır.
Gerard ONeill

3
Benim için işe yarayan tek çözüm bu. Sürücüm doluydu ve yedekleyemedim ya da küçülemedim ve başka hiçbir şey çalışmıyor gibiydi. Teşekkür ederim!
Brian

3
Katılıyorum; bu en iyi uygulama değildir, ancak Brian'ın senaryosu gibi başka seçenekleriniz yoksa sahip olmak değerli bir araçtır.
ScottFoster1000
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.