Daha Kısa Bir Cevap:
Muhtemelen uzun süredir devam eden bir işleminiz var (İndeks bakımı? Büyük toplu silme veya güncelleme?) Veya kurtarma modunda "varsayılan" (varsayılanın ne anlama geldiğinin altında daha fazlası) olduğunuzu veya Full
bir günlük yedeği almadığınızdan (veya onları yeterince sık almayacağım).
Bir kurtarma modeli sorunuysa, Simple
zaman içinde kurtarma ve düzenli günlük yedeklemelerine gerek duymuyorsanız , basit cevap kurtarma moduna geçme olabilir. Yine de çoğu insan, iyileşme modellerini anlamadan cevaplarını veriyor. Neden önemli olduğunu anlamak için okumaya devam edin ve sonra ne yaptığınıza karar verin. Ayrıca günlük yedeklerini almaya başlayabilir ve Full
kurtarmaya devam edebilirsiniz.
Başka sebepler olabilir ama bunlar en yaygın olanları. Bu cevap, en yaygın iki nedenin içine dalmaya başlar ve size nedenlerin neden ve ne kadar gerisinde kaldığını ve bazı diğer nedenleri araştırdığınızı gösterir.
Daha Uzun Bir Cevap:
Hangi Senaryolar günlüğün Büyümesini sürdürmesine neden olabilir? Birçok neden var, ancak genellikle bu nedenler aşağıdaki iki düzendedir: Kurtarma modelleri hakkında bir yanlış anlaşılma var ya da uzun süren işlemler var. Detaylar için okumaya devam edin.
En iyi neden 1/2: Kurtarma Modellerini Anlamamak
( Tam Kurtarma Modunda Olmak ve Günlük Yedeklemelerini Almamak - Bu en yaygın sebep - bu sorunu yaşayanların büyük çoğunluğudur. )
Bu cevap, SQL Server kurtarma modellerinde derin bir dalış olmasa da, kurtarma modelleri konusu bu sorun için kritik öneme sahiptir.
SQL Server'da üç kurtarma modeli vardır :
Full
,
Bulk-Logged
ve
Simple
.
Bulk-Logged
Şimdilik görmezden geleceğiz, bunun bir melez model olduğunu söyleyeceğiz ve bu modelde bulunan çoğu insanın bir nedeni var ve kurtarma modellerini anlıyoruz.
Önemsediğimiz iki şey ve onların kafa karışıklığı, bu sorunu yaşayan insanların çoğunluğunun nedeni Simple
ve Full
.
İntermisyon: Genel Olarak Kurtarma
Kurtarma Modelleri hakkında konuşmadan önce: genel olarak kurtarma hakkında konuşalım. Bu konuyla daha da derinleşmek istiyorsanız, Paul Randal'un blogunu ve konuyla ilgili istediğiniz kadar mesajı okuyun . Bu soru için olsa:
Kilitlenme / Yeniden Başlatma Kurtarması
İşlem günlük dosyasının bir amacı kilitlenme / yeniden başlatma kurtarmasıdır . Bir çarpmadan önce yeniden yapılanma ve geri alma için ya bir çarpmadan önce yeniden yapılanma veya yeniden başlatma ya da yeniden başlatma ve bir çarpma veya yeniden başlatmadan sonra başlatılmış ancak bitmemiş iş (geri alma / geri alma) için. Bir işlemin başladığını, ancak hiç bitmediğini (işlem yapılmadan önce geri alındı veya çökme / yeniden başlatma gerçekleştiğini) görmek işlem günlüğünün işidir. Bu durumda İyileşme sırasında "Hey .. bu asla bitmedi, hadi geri dönelim" demek günlüğün işidir . Ayrıca, bir şeyi bitirdiğinizi ve müşteri başvurunuzun bittiğini (veri dosyanızda henüz sertleşmemiş olsa bile) söyleyip söylemediğini görmek günlüğün işidir.“Hey .. bu gerçekten oldu, hadi ileri saralım, uygulamaların sanıldığı gibi yapalım” diyerek yeniden başlattıktan sonra. Şimdi dahası var ama asıl amaç bu.
Zaman Kurtarıcılığındaki Nokta
Bir işlem günlüğü dosyasının diğer amacı , bir veritabanındaki "hatalar" nedeniyle bize bir noktaya kadar zaman kazanabilme veya donanım arızası durumunda bir kurtarma noktası sağlama becerisi kazandırmaktır. Bir veri tabanının veri ve / veya günlük dosyalarını içeren. Bu işlem günlüğü kurtarma için başlatılmış ve bitmiş işlemlerin kayıtlarını içeriyorsa, SQL Server bu bilgiyi bir sorun oluşmadan önce bulunduğu yere bir veritabanı elde etmek için kullanabilir ve kullanır. Ancak bu bizim için her zaman uygun bir seçenek değildir. Bunun için veritabanımızı doğru kurtarma modelinde bulundurmalı ve günlük yedeklemelerini almalıyız .
Kurtarma Modelleri
Kurtarma modellerine:
Basit Kurtarma Modeli
Bu yüzden yukarıdaki girişle, Simple Recovery
ilk önce model hakkında konuşmak en kolay olanıdır . Bu modelde, SQL Server'a şunları söylüyorsunuz: "Kilitlenme ve yeniden başlatmayı başlatmak için işlem günlüğü dosyanızı kullanma konusunda iyiyim ..." (Orada gerçekten seçeneğiniz yok. ACID özelliklerine bakın ve bu hızlı bir şekilde anlaşılmalıdır.) “... ancak artık bu kilitlenme / yeniden başlatma kurtarma amacıyla ihtiyacınız olmadığında, devam edin ve günlük dosyasını yeniden kullanın.”
SQL Server, Basit Kurtarma'daki bu talebi dinler ve yalnızca çökmesi / yeniden başlatılması için yapması gereken bilgileri tutar. SQL Server, verilerin veri dosyasına (daha fazla veya daha az) sertleştirildiği için kurtarılabildiğinden emin olduktan sonra, sertleştirilmiş veriler artık günlükte gerekli değildir ve kesme için işaretlenir - bu da yeniden kullanıldığı anlamına gelir.
Tam Kurtarma Modeli
ile Full Recovery
, SQL Server'a, günlük dosyanız kullanılabilir olduğu sürece veya belirli bir zamana göre bir günlük yedeklemesi tarafından kapsanan belirli bir noktaya kurtarabilmek istediğinizi söylüyorsunuz. Bu durumda, SQL Server Basit Kurtarma Modelinde günlük dosyasını kısaltmanın güvenli olacağı noktaya ulaştığında, bunu yapmayacaktır. Bunun yerine , günlük dosyasının büyümeye devam etmesine izin verir ve normal koşullar altında bir günlük yedeği alıncaya kadar (veya günlük dosyası sürücünüzde alan biterse) büyümeye devam etmesini sağlar .
Simple'dan Full'a geçmek Gotcha'ya sahiptir.
Burada kurallar ve istisnalar var. Aşağıda uzun süredir devam eden işlemlerden söz edeceğiz.
Ancak, Tam Kurtarma Modu için akılda tutulması gereken bir uyarı şudur: Eğer sadece Full Recovery
moda geçiyorsanız, ancak hiçbir zaman ilk bir Tam Yedekleme yapmazsanız , SQL Server isteğinizin Full Recovery
modele girmesini onurlandırmaz . İşlem günlüğünüz, Simple
Tam Kurtarma Modeli'ne geçene ve ilkinizi alıncaya kadar devam ettiği gibi çalışmaya devam eder Full Backup
.
Günlük yedekleme olmadan Tam Kurtarma Modeli kötü.
Yani kontrolsüz kütük büyümesinin en yaygın nedeni bu mu? Cevap: Herhangi bir günlük yedeği olmadan Tam Kurtarma modunda olmak.
Bu insanlara her zaman olur .
Bu neden bu kadar yaygın bir hata?
Neden her zaman oluyor? Çünkü her yeni veritabanı, model veritabanına bakarak ilk kurtarma modeli ayarını alıyor.
Modelin ilk kurtarma modeli ayarı her zaman Full Recovery Model
- birisi tarafından değiştirilmedikçe ve Yani "varsayılan Kurtarma Modeli" olduğunu söyleyebiliriz Full
. Birçok kişi bunun farkında değildir ve veritabanlarının Full Recovery Model
kayıt defteri yedeği olmadan çalışmakta ve bu nedenle işlem kayıt dosyası gerekenden çok daha büyüktür. Bu nedenle kuruluşunuz ve ihtiyaçları için çalışmadıklarında varsayılanları değiştirmek önemlidir.)
Çok az günlük yedeği olan Tam Kurtarma Modeli kötü.
Ayrıca, günlük kayıtlarını yeterince sık alamayarak burada başınız derde girebilir.
Günlüğün günlük yedeğini almak kulağa iyi gelebilir, geri yükleme işlemi daha az geri yükleme komutu gerektirir, ancak yukarıdaki tartışmayı göz önünde bulundurarak, günlük dosyasının yedekleninceye kadar büyümeye ve büyümeye devam edeceğini unutmayın.
Hangi günlük yedekleme sıklığına ihtiyacım olduğunu nasıl bulabilirim?
Günlük yedekleme sıklığınızı aklınızda bulundurmanız gereken iki şeyi göz önünde bulundurmanız gerekir:
- Kurtarma İhtiyaçları - Bu umarım ilk olmalıdır. İşlem günlüğünüzü barındıran sürücünün arızalanması veya günlük yedeklemenizi etkileyen ciddi bozulma olması durumunda ne kadar veri kaybedilebilir? Bu sayı 10-15 dakikadan fazla değilse, tartışma sonunda her 10-15 dakikada bir günlük yedeği almanız gerekir.
- Günlük Büyümesi - Kuruluşunuz o günü kolayca yeniden oluşturabilmesi nedeniyle daha fazla veri kaybetmek için uygunsa, 15 dakikadan daha az sıklıkla bir günlük yedeklemesi yapmanız iyi olabilir. Belki de organizasyonunuz her 4 saatte bir iyidir. Ancak 4 saat içinde kaç işlem yaptığınıza bakmalısınız. Günlüğün bu dört saat içinde büyümeye devam etmesine izin vermek, bir günlük dosyasında çok büyük olacak mı? Bu log yedeklemenizin çok uzun süreceği anlamına mı geliyor?
En önemli sebep 2/2: Uzun Süreli İşlemler
( "Kurtarma modelim iyi! Günlük hala artıyor! )
Bu aynı zamanda kontrolsüz ve kontrolsüz kütük büyümesinin bir nedeni olabilir. Kurtarma modeli ne olursa olsun, ancak genellikle "Ama Basit Kurtarma Modelindeyim - günlüğüm neden hala büyüyor ?!" olarak ortaya çıkıyor.
Bunun nedeni basittir: SQL yukarıda açıklandığı gibi kurtarma amacıyla bu işlem günlüğünü kullanıyorsa, işlem başlangıcına geri dönmesi gerekir.
Uzun süren veya çok fazla değişiklik yapan bir işleminiz varsa, günlüğe hala açık işlemlerde olan veya işlem başladığından bu yana başlayan değişikliklerin hiçbirinin denetim noktasında kesilmesi mümkün değildir.
Bu, bir delete ifadesinde milyonlarca satırı silen büyük bir silme işleminin tek işlem olduğu ve tüm silme işlemi tamamlanıncaya kadar günlük kesmenin yapamayacağı anlamına gelir. Olarak Full Recovery Model
, bu günlüğe silmek ve bu günlük kayıtlarının çok olabilir. İndeks optimizasyonu ile aynı şey bakım pencerelerinde çalışır. Ayrıca, zayıf işlem yönetimi ve açık işlemleri izlememek ve kapatmamak, size ve günlük dosyanıza gerçekten zarar verebilir.
Bu uzun süren işlemler hakkında ne yapabilirim?
Kendinizi burada kaydedebilirsiniz:
- Bakım veya bilinen büyük işlemler gibi, en kötü durum senaryosunu hesaba katarak günlük dosyanızı doğru şekilde boyutlandırın. Ve log dosyanızı büyüttüğünüzde, Kimberly Tripp'un bu kılavuzuna (ve size gönderdiği iki bağlantıya) bakmalısınız . Doğru boyutlandırma burada çok önemlidir.
- İşlem kullanımınızı izliyorum. Uygulama sunucunuzda bir işlem başlatmayın ve SQL Server ile uzun konuşmalar yapmaya başlayın ve birini çok uzun süre açık bırakma riskiyle karşı karşıya kalın.
- DML ifadelerinizde zımni işlemleri izlemek . Örneğin:
UPDATE TableName Set Col1 = 'New Value'
bir işlemdir. Oraya bir yer BEGIN TRAN
koymadım ve mecbur kalmadım, hala yapıldığında otomatik olarak işleyen bir işlem. Bu nedenle, çok sayıda satırda işlem yapıyorsanız, bu işlemleri daha yönetilebilir parçalara ayırmayı ve kurtarılması için günlük vermeyi düşünün. Veya bununla başa çıkmak için doğru boyutu düşünün. Veya dökme yük penceresi sırasında belki kurtarma modellerini değiştirme konusuna bakın.
Bu iki neden Log Günlüğü için de geçerli midir?
Kısa cevap: evet. Aşağıda daha uzun cevap.
Soru: Günlük kaydı kullanıyorum, bu nedenle günlük yedeklemelerim otomatikleştiriliyor ... Neden hala işlem günlüğü büyümesi görüyorum?
Cevap: okumaya devam edin.
Günlük Gönderimi Nedir?
Günlük sevkıyatı tam olarak göründüğü gibi - işlem günlüğü yedeklerinizi DR amacıyla başka bir sunucuya gönderiyorsunuz. Bazı başlangıçlar var ancak ondan sonra süreç oldukça basittir:
- Günlüğü bir sunucuda yedekleyecek bir iş,
- o günlük yedeklemesini kopyalamak için bir iş ve
- Hedef sunucuda kurtarmadan (ya
NORECOVERY
da STANDBY
) geri yüklemek için bir iş .
Ayrıca, işler planladığınız gibi gitmezse izlenmesi ve uyarılması gereken bazı işler de vardır.
Bazı durumlarda, günlük sevkiyat geri yüklemesini yalnızca günde bir kez veya her üç günde bir veya haftada bir kez yapmak isteyebilirsiniz. Bu iyi. Ancak, bu değişikliği tüm işlerde (günlük yedekleme ve kopyalama işleri dahil) yaparsanız, o zaman tüm zamanların günlük yedeğini almayı beklersiniz. Bu, çok fazla günlük büyümesine sahip olacağınız anlamına gelir - çünkü günlük yedeği olmadan tam kurtarma modundasınızdır - ve muhtemelen kopyalanacak büyük bir günlük dosyası anlamına da gelir. Yalnızca geri yükleme işinin zamanlamasını değiştirmeli ve günlük yedeklemelerinin ve kopyalarının daha sık gerçekleşmesine izin vermelisiniz, aksi halde bu cevapta açıklanan ilk sorundan muzdarip olacaksınız.
Durum kodlarıyla genel sorun giderme
Bu ikisinden başka nedenler var ama bunlar en yaygın olanları. Sebep ne olursa olsun: bu açıklanamayan kütük büyümesi / kesilme eksikliği için nedeninizi analiz etmenin ve bunların ne olduğunu görmenin bir yolu vardır.
sys.databases
Katalog görünümünü sorgulayarak, günlük dosyanızın kısaltılması / yeniden kullanılmasını beklemesinin nedenini açıklayan bilgileri görebilirsiniz.
Neden log_reuse_wait
kodunun arama kimliğiyle birlikte adlandırılan bir log_reuse_wait_desc
sütun ve bekleme nedeninin açıklamasını içeren bir sütun vardır. Başvurulan kitaplardan çevrimiçi makale, nedenlerin çoğu (görmesi muhtemel olanlar ve nedenlerini açıklayabildiklerimizin çoğunluğudur. Eksik olanlar kullanım dışı veya iç kullanım içindir) italik :
0 = Nothing
Neye benziyor .. Beklememelisin
1 = Kontrol Noktası
Bir kontrol noktasının oluşmasını bekliyor. Bu olmalı ve iyi olmalısınız - ancak daha sonra cevaplar veya düzenlemeler için burada aranacak bazı durumlar vardır.
2 = İşlem kaydı yedekleme İşlem
kaydı işleminin gerçekleşmesini bekliyorsunuz. Ya onları planladınız ve yakında ortaya çıkacak ya da burada açıklanan ilk probleminiz var ve şimdi nasıl düzelteceğinizi biliyorsunuz.
3 = Aktif yedekleme veya geri
yükleme Veritabanında bir yedekleme veya geri yükleme işlemi çalışıyor
4 = Aktif işlem Günlük yedeklenmeden önce
tamamlanması gereken (her iki şekilde - ROLLBACK
veya COMMIT
) bir aktif işlem var . Bu cevapta açıklanan ikinci sebep budur.
5 = Veritabanı yansıtma
Yüksek performanslı yansıtma durumunda bir ayna ya gecikmenin altına veya altına düşüyor ya da yansıma bir nedenden dolayı duraklatılıyor
6 = Çoğaltma Buna
neden olacak çoğaltma ile ilgili sorunlar olabilir - bir günlük okuyucu aracısının çalışmaması gibi, artık olmadığının ve bunun çeşitli nedenlerden dolayı çoğaltma için işaretlendiğini düşünen bir veritabanı gibi. Bu nedeni de görebilirsiniz ve bu tamamen normaldir, çünkü işlemlerin günlük okuyucusu tarafından tüketildiği gibi doğru zamanda bakıyorsunuzdur.
7 = Veritabanı anlık görüntüsü oluşturma Veritabanı anlık görüntüsü oluşturuyorsunuz , anlık görüntü oluşturulurken
doğru zamanda bakarsanız bunu görürsünüz
8 = Günlük Taraması
Bu, sonsuza dek sürecek bir sorunla karşılaşmadım. Yeterince uzun ve yeterince sık bakarsanız bunun olduğunu görebilirsiniz, ancak gördüğüm aşırı işlem günlüğü büyümesinin bir nedeni olmamalıdır.
9 = AlwaysOn Kullanılabilirlik Grupları ikincil kopyası, bu veritabanının işlem günlüğü kayıtlarını ilgili ikincil veritabanına uyguluyor.
Henüz en net açıklama hakkında ..