SQL Server 2008 R2'yi küçültdükten sonra günlük dosyası boyutunu el ile ayarlayın


10

İş yerinde biraz istemsiz bir DBA haline geliyorum ve gerçekten bir şey için biraz yardıma ihtiyacım var.

Tam Kurtarma Modunda 40 GB'lık bir veritabanımız var, günlük yedeklemesi yapılandırılmamış ve 84 GB'lık büyük bir günlük dosyası var. Bu durumu kurtarmak için şimdiye kadarki planım veritabanında tam bir günlük yedeklemesi çalıştırmak, günlük dosyasını küçültmek ve her gün bir veritabanı yedeklemesini kontrol altında tutmaya yardımcı olmak için bir günlük yedekleme çalıştırmak için bir bakım planı başlatmaktır.

Benim sorunum, günlük dosyasının hiçbir şeye küçülmesini ve ilk sabahı Pazartesi günü sürekli büyümesini istemiyorum. Dosya (veritabanı yaklaşık% 20) ne olması gerektiği hakkında kaba bir tahmin var ve mümkün olduğunca çok bitişik alan sağlamak için bu get-go ayarlamak istiyorum. Bu sadece veritabanı Özellikleri -> Dosyalar altında "Başlangıç ​​Boyutu" değiştirme bir durum mudur? Ben de bunun gerçekleşmesi için veritabanı çevrimdışı olması gerektiğini tahmin ediyorum?

Şimdiden teşekkürler


2
Veritabanını gece bir kez yedeklemeyi ve bir günlük yedeklemeyi çalıştırmayı mı planlıyorsunuz? Belki basit bir kurtarma modeli düşünmelisiniz ki günlük kendini yönetsin.
Aaron Bertrand

Aaron, DR kurtarma açısından sana katılıyorum ama operasyonel iyileşme için hala tam olarak isteyebilirler. Unutmayın ki sadece günde bir kez bir günlük yedekleme yapıyor olsalar da, zaman içinde kurtarmaya izin verir.
Kenneth Fisher

1
@Kenneth bu yüzden gece yarısı tam bir yedekleme yaparsanız, o zaman bir günlük yedekleme 12:05, oldukça sahte buluyorum. YMMV.
Aaron Bertrand

@Aaron tekrar, tüm operasyonel ama yanılmıyorsam önceki gecenin tam yedekleme kullanabilirsiniz ve günlük 12:05 alınan ve önceki gün herhangi bir noktaya kurtarma için. Ayrıca bir sorunla karşılaşırlarsa, geri oturum açmak, önceki geceden geri yüklemek ve birkaç dakika önce geri dönmek için zamanında bir nokta yapmak önemli değildir. Bunu tam olarak tutmaları gerektiğini söylemiyorum, sadece DR bakış açısıyla ilgili daha fazla şey olduğunu söylüyorum. Bu kadar dolu tutuyorlarsa, günlük yedeklerini günde bir kereden daha sık yapmaları gerektiği söylenir.
Kenneth Fisher

2
@Kenneth ancak günlüğü yalnızca günde bir kez yedekliyorsanız, bu yüzden ilk etapta çok büyük! Dün saat 12: 07'ye kadar iyileşmeniz gerekiyorsa, 2 dakika boyunca iyileşmek için tüm günlüğün tamamını yüklemeniz gerekir. Çok faydalı değil.
Aaron Bertrand

Yanıtlar:


6

En uygun boyut olduğunu düşündüğünüz şeye küçültün. Kullanıcı arayüzünü kullanmayın, sadece bunu yapın - diyelim ki 200 MB en uygun boyutunuz:

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

Bir günlük yedeklemesini yalnızca günde bir kez almakla ilgileniyorsanız ve zamanında kurtarma ile ilgilenmiyorsanız, basit kurtarma modeline geçmelisiniz. Bu, günlük yedeklemelerinin gereksiz (aslında imkansız) olduğu anlamına gelir, ancak günlük içeriği kendi kendini yönetir.

Günlük yedeklemelerinin anlamlı olmasını istiyorsanız, geceleri tam yedeklemeyi ve hemen ardından tek bir günlük yedeklemesi almayı planlamayın. Bu, sizi tam kurtarma modelinde tutar, günlüğün gerçekten çok çalışmasını sağlar ve size hiçbir şey satın almaz. Bu nedenle, zaman içinde kurtarma istiyorsanız, günlük yedeklerini veri kaybı toleransınızı karşılayan bir oranda daha sık çalıştırın. 15 dakikadan fazla veri kaybetmek istemiyorsanız, 15 dakikada bir günlük yedeklemesi gerçekleştirin.


Bunun için teşekkürler. Basit kurtarma modeline geçişle ilgili tüm yorumları tamamen anlıyorum. maalesef bu karar veremiyorum ve çeşitli düzeylerde bürokrasiden geçmesi gerekiyor. Kesinlikle olsa önereceğim bir şeydir.
Tim Alexander,

12

Dosya yönetiminiz tamamen çevrimiçi bir işlem olabilir. Kurtarma amacıyla günlük bilgilerinizi saklama gereksiniminize bağlı olarak iki yolunuz vardır:

Zamanında kurtarma gerekli değildir

  1. Veritabanını SIMPLEkurtarmaya dönüştürün . İşlemleri diske yazmak için bir kontrol noktası yürütün.
  2. Günlüğü düzleştirin.
  3. Günlüğü uygun boyuta yeniden boyutlandırın.

Ayrıca sabit bir büyüme miktarı ve sınırsız büyüme (günlüğünüzü daha iyi yönetmenize yardımcı olacak şekilde) ayarlamanızı da öneririm. Sabit büyüme miktarı çok miktarda bağlıdır, başlangıçta bu günlük ne kadar büyüme görmeyi bekleyebilirsiniz bağlı olarak 1-2 GB ile devam etmenizi tavsiye ederim. İdeal olarak, günlüğünüz çok fazla büyümeyecektir, bu yüzden çok fazla bir etkisi olmamalıdır. Günlüğünüz düzenli olarak büyüyorsa, boyutunuzu tekrar gözden geçirmeniz gerekebilir.

Kullanılarak başarılı:

ALTER DATABASE [foo] 
SET RECOVERY SIMPLE;

CHECKPOINT;

DBCC SHRINKFILE (foo_log,0);

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

--Optional if you want the database in full recovery mode 
--for point in time recovery going forward
ALTER DATABASE [foo] 
SET RECOVERY FULL;

Zamanında kurtarma gerekiyor

En büyük askıya alma, günlük dosyanızı etkin olan VLF segmentinizin ötesine daraltamayacağınızdır. Bunu görmek DBCC LOGINFOiçin veritabanı bağlamında kullanabilirsiniz. Status = 2 olan tüm segmentler etkindir. Etkin segmentleri temizlemek için, o segmentte aktif olan hiçbir işlem olmadığında bir işlem günlüğü yedeklemesi çalıştırmanız gerekir. Adımlarınız:

  1. Bir işlem günlüğü yedeklemesi çalıştırın.
  2. Dosyanızı küçültün. (İdeal olarak düzleştirin, ancak veritabanınız aktifse bunu yapmak zor olacaktır).
  3. Günlüğünüz uygun bir boyut olana ve ideal olarak mümkün olduğunca küçük olana kadar 1. ve 2. adımları tekrarlayın.
  4. Günlüğü uygun boyuta yeniden boyutlandırın.

Kullanılarak başarılı:

BACKUP LOG [foo] TO DISK='<Location of t-log backup>';

DBCC SHRINKFILE (foo_log,0);

--Repeat the above until your log file is small "enough"

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

Burada neler olduğunu anlamak için bazı ek kaynaklar:


2

Aslında hayır, günlüğü küçültmek için veritabanının çevrimdışı olması gerekmez. Ve bunun muhtemelen kütüğün küçülmesinin iyi bir fikir olduğu birkaç durumdan biri olduğunu söyleyeceğim. Başlangıç ​​boyutunu ayarlayabilirsiniz, ancak küçültmeyi yapmak ve belirli bir boyuta küçülmesini söylemek daha kolay olurdu.

USE [DBName]
GO
DBCC SHRINKFILE (N'LogName' , SizeInMg)
GO

GUI'yi kullanarak ve günlüğün sonunda ne kadar büyük olmasını istediğinizi belirten onay kutusunu ve ikinci radyo düğmesini kullanarak da yapabilirsiniz. SSMS'de nesne gezgininde veritabanına sağ tıklayıp görevleri, küçültmeyi, dosyaları seçerek GUI'ye ulaşabilirsiniz.


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.