it-swarm-eu.dev

Sql Server - doporučené postupy pro pěstování databázových souborů

Sledoval jsem růst souborů pomocí sběrače dat na serveru SQL Server 2008 R2 dva týdny. Databáze neustále roste kolem 35 (MB)/den. DB dosud nedosáhl počáteční velikosti 2 GB.

Automatický růst souborů DB je nastaven na 5 MB a chtěl bych vyzkoušet jiný přístup, takže hledám návrhy nebo komentáře.

Úkol ladění probíhá každý týden v neděli v 13:30. Úkol bude:

  • Zkontrolujte integritu databáze
  • Zmenšit soubor protokolu - (To je v pořádku, protože režim protokolování je jednoduchý)
  • Zmenšit databázi
  • Reorganizovat index
  • Znovu vytvořit index
  • Aktualizujte statistiku
  • Historie čištění

Chtěl bych přidat další dva kroky k týdennímu plánu ladění:

  1. Pokud použité místo dosáhne určitého prahu nebo celkové velikosti, rozbalte databázový soubor o 500 MB.
  2. Pokud využité místo dosáhne určitého prahu celkové velikosti, vytvořte soubor protokolu o 250 MB (po zmenšení).

Umístěním růstové zátěže v offline hodinách doufám, že dosáhnu výkonu snížením počtu událostí auto-růstu během velkého zatížení.

Mám dvě otázky týkající se automaticky rostoucích souborů.

  • Nejlepší místo pro vložení kroků růstu souboru by bylo před aktuálními kroky nebo po nich?
  • Pokud použiji ALTER DATABASE|MODIFY FILE Pro růst souboru, jak zjistím, zda SpaceUsedInFile >= ([email protected])?
16
Ross Bush

Měli byste se snažit o co nejmenší automatický růst. Sedmkrát denně je nesnesitelné, a to i při okamžité inicializaci souboru.

Nedělejte Shrink Database. Vůbec. Možná smršťovací, ale až po mimořádné události. Zmenšit to jen proto, aby znovu rostlo, je cvičení v marnosti a mělo by se vlastně nazývat auto-fragment.

Pokud je model obnovy jednoduchý, na zemi neexistuje způsob, jak byste měli zvýšit svůj soubor protokolu o 250 GB. Využité místo v souboru se v průběhu času automaticky vyčistí, pokud jste transakci nezačali před měsícem a nemáte v úmyslu ji nikdy zavázat nebo vrátit zpět.

Moje rada by tedy byla:

Automaticky pěstujte datový soubor ručně během tichého období na velikost, která pojme několik měsíců růstu. Na co to mezitím ukládáte?

Nastavte přírůstek automatického růstu pro datový soubor na něco relativně malého (aby nepřerušoval uživatele, když k tomu dojde) a upozorněte na tuto událost (můžete ji zachytit ve výchozí stopě, například nebo prostřednictvím rozšířeného Události). To vám může říct, že zasáhnete nejvyšší bod, který jste odhadli, a je čas opět ručně růst. V tomto okamžiku budete chtít tuto příručku ponechat pro případ, že chcete přidat nový soubor/skupinu souborů na jinou jednotku, aby vyhovovala místu, protože nakonec vyplníte aktuální jednotku.

Auto-log soubor protokolu, řekněme, dvakrát největší, jaký kdy byl. Nemělo by se dále automaticky růst, ledaže by nějaké neobvyklé transakce zadržovaly věci. Také byste měli sledovat tuto událost, abyste o nich věděli.

24
Aaron Bertrand

Automatický růst je něco, čemu byste se měli pokud možno vyhnout. Problém spočívá v tom, že nemáte kontrolu nad tím, kdy se může růst uskutečnit, a váš systém přitom může zasáhnout vážný zásah.

Nastavte velikost vašeho souboru na něco rozumného za měsíc nebo tak a sledujte svou míru růstu odtamtud, zjistěte, kolik místa odhadujete pro X množství času a nastavte velikost na tuto + meze chyby.

Nastavil jsem jednoduchou monitorovací úlohu, která mě upozorní, když velikost souboru dosáhne předdefinovaného maxima před automatickým růstem. Můžete použít něco takového:

SELECT instance_name,
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
       into ##Logsize
FROM
(
   SELECT *
   FROM sys.dm_os_performance_counters
   WHERE counter_name IN
   (
       'Data File(s) Size (KB)',
       'Log File(s) Size (KB)',
       'Log File(s) Used Size (KB)',
       'Percent Log Used'
   )
     AND instance_name = 'database your interested in' 
) AS Src
PIVOT
(
   MAX(cntr_value)
   FOR counter_name IN
   (
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
   )
) AS pvt 
go
declare @logsize int
Select @logsize = [Percent Log Used] from ##Logsize

If @logsize > the maximum percent you want the log to fill too i.e 90
    BEGIN
        --Do your thing here
    END

Drop table ##Logsize

To by samozřejmě mohlo být naplánováno jako práce.

10
Nick Winstanley