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?
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?
Yanıtlar:
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.
Bir şey ters gittiğinde geri yükleyebilmenizi sağlamadan veritabanınızda asla değişiklik yapmayın.
(Zamanında kurtarma ile, tam veya farklı bir yedeklemeden başka bir şeye geri yükleme yapabileceğinizi kastediyorum.)
Muhtemelen veritabanınız FULL
kurtarma 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 SHRINKFILE
defalarca 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
Bu bir sınama veritabanı ise ve zaman içinde kurtarmayı umursamıyorsanız, veritabanınızın SIMPLE
kurtarma modunda olduğundan emin olmalısınız .
ALTER DATABASE testdb SET RECOVERY SIMPLE;
Veritabanını SIMPLE
kurtarma moduna getirmek, SQL Server'ın tüm işlemlerin ( FULL
gü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 . CHECKPOINT
olaylar günlüğün kontrolüne yardımcı olur ve CHECKPOINT
s 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.
Günlüğü TRUNCATE_ONLY
seçenekle yedekleyin ve sonraSHRINKFILE
. Birincisi, bu TRUNCATE_ONLY
seçenek kullanımdan kaldırılmıştır ve SQL Server'ın geçerli sürümlerinde artık mevcut değildir. İkincisi, FULL
kurtarma 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 SHRINKDATABASE
ve 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 SHRINKFILE
veya 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 .
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)
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.
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ı .
-- 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.
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!
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.
İşte basit ve çok beceriksiz ve potansiyel olarak tehlikeli bir yol.
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.
İş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.
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.)
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.
Veritabanı kullanıyorsa En cevapları burada şimdiye kadar ancak aslında İşlem Günlüğü dosyasını ihtiyacım olmadığını varsayıyoruz FULL
kurtarma 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)
, 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 .
İ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
Ö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.
TRUNCATE_ONLY
SQL 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ı ).
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ı .
Günlük dosyasını kısaltmak için:
Günlük dosyasını daraltmak için:
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.
Ç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ı 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
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
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ü.
Bunu dene:
USE DatabaseName
GO
DBCC SHRINKFILE( TransactionLogName, 1)
BACKUP LOG DatabaseName WITH TRUNCATE_ONLY
DBCC SHRINKFILE( TransactionLogName, 1)
GO
TRUNCATE_ONLY
SQL 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ı ).
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.
Bu işe yarayacaktır, ancak önce veritabanınızın yedeğini almanız önerilir.
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);
DBCC SQLPERF(LOGSPACE)
BACKUP LOG Comapny WITH TRUNCATE_ONLY
DBCC SHRINKFILE (Company_log, 500)
DBCC SQLPERF(LOGSPACE)
TRUNCATE_ONLY
SQL 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ı ).
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.
DB İşlem Günlüğü Min boyutuna küçült :
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
TRUNCATE_ONLY
SQL 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ı ).