it-swarm-eu.dev

SQL Server log zmenšení problém

Možný duplikát:
Proč protokol transakcí neustále roste nebo dochází do vesmíru?

Mám na serveru SQL Server protokol databáze o kapacitě 300 GB. Chci zmenšit všechny protokoly, ale neumožňuje mi to. Vyzkoušel jsem pomocí dotazu a uživatelského rozhraní v serveru SQL Server 2008 R2. Použil jsem

USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO

Ale bez jakýchkoli chyb protokoly databáze se nesnižují.

Pak chci použít ještě jednu metodu, jak je uvedeno níže:

Odpojím databázi od serveru SQL, poté po přesunu konkrétní .LDF soubor do jiného umístění a připojit pouze databázový soubor zpět k serveru SQL. Dokážu úspěšně přesunout všechny protokoly ze serveru SQL na jiný server.

Prosím, dejte mi vědět, že je to dobrý postup pro přesun protokolu transakcí na jiný disk. Pokud ne, navrhněte nějaké jiné řešení pro zotavení ze zmenšujícího se protokolu databáze.

7
kuldeep verma

Pokud zmenšujete soubor protokolu, nebudete jej moci zmenšovat méně než aktivní část protokolu. Jinými slovy, pokud se nacházíte v úplném modelu obnovy a neprováděli jste žádné zálohy protokolu transakcí (což je důvod, proč by mohlo narůstat tak velké ), poté spustíte DBCC SHRINKFILE nedělá absolutně nic.

BOL má příklad, jak to udělat:

USE AdventureWorks2012;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2012
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2012_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2012
SET RECOVERY FULL;
GO

To bylo vzato přímo z BOL na DBCC SHRINKFILE .

Ve výše uvedeném příkladu stojí za zmínku, že změna modelu obnovy na jednoduché přeruší řetězec protokolů. Jakmile je tato operace dokončena, musíte okamžitě spustit nový řetězec protokolu spuštěním zálohy databáze.

Rovněž stojí za zmínku, že pokud váš soubor protokolu takto roste, neberete [dostatečné] zálohy protokolu transakcí (za předpokladu, že jste skutečně v režimu úplného zotavení, protože k tomu by došlo pouze ve velmi vzácných situacích v jednoduchém zotavení). Možná budete muset začít provádět zálohování protokolu transakcí nebo zálohovat váš protokol častěji, aby zkrátil protokol trans a vytvořil část opakovaně použitelného souboru, takže tento růst souboru nemáte.

11
Thomas Stringer

Pár bodů neuvedených v ostatních odpovědích.


Mohou existovat i jiné důvody, proč se protokol nevymaže kromě nedostatku záloh protokolu (i když je tomu tak obvykle), jako je zrcadlení databáze nebo replikace.

Spusťte tento dotaz, abyste určili model obnovy databáze a proč nelze vymazat protokol transakcí:

SELECT
    name,
    log_reuse_wait_desc,
    recovery_model_desc
    FROM sys.databases

Úplný seznam log_reuse_wait_desc hodnoty lze najít zde . Jak již bylo zmíněno, pravděpodobně uvidíte LOG_BACKUP, ale je dobré se ujistit, že v situaci, která by komplikovala záležitosti, se nic jiného neděje.


Můžete použít bezpečný nezdokumentovaný příkaz DBCC LOGINFO (spouštět v kontextu cílové databáze) pro výpis informací o souborech virtuálních protokolů transakčních protokolů (aka VLF, popsaných v jiné odpovědi). Hodnota stavu 2 znamená VLF se používá, a 0 znamená, že se nepoužívá (hodnota 1 není možná)).

Jako další odpověď zmíněna, SQL Server zmenší pouze soubor protokolu, jak dlouho jako poslední v provozu VLF.

Pokud je databáze v FULL nebo BULK_LOGGED zotavení a vidíte hodně nul, ale 2 na poslední, možná budete muset počkat na některé transakce v databázi, aby se log obtočil, a poté si vytvořte zálohu protokolu, abyste vyčistili koncové VLF, a konečně smrštění znovu spustíme.

Pokud je databáze v zotavení SIMPLE, možná budete muset ručně spustit příkaz CHECKPOINT, abyste zahájili zúčtování protokolu, než se pokusíte znovu zmenšit.

5
Jon Seigel

Bezpečným způsobem, jak zmenšit soubor ldf, je přepnout na jednoduchý model obnovy a poté provést zmenšení.

Používání SQL Server Management Studio:

  1. Přihlaste se k serveru SQL.
  2. Rozbalte složku "Databáze", klikněte pravým tlačítkem na databázi, vyberte vlastnosti.
  3. Na stránce „Možnosti“ změňte „Model obnovy:“ na „Jednoduchý“ a stiskněte tlačítko „OK“.
  4. Možná budete chtít/potřebovat zálohu databáze (klikněte pravým tlačítkem myši na databázi, Tasks\Back Up ...).
  5. Klikněte pravým tlačítkem na databázi, otevřete podnabídku "Úkoly", otevřete podnabídku "Zmenšit" a vyberte "Databáze".
  6. V novém okně zaškrtněte "reorganizovat soubory před uvolněním nevyužitého místa." zaškrtněte políčko a stiskněte tlačítko „OK“.
  7. Klikněte pravým tlačítkem na databázi, otevřete podnabídku "Úkoly", otevřete podnabídku "Zmenšit" a vyberte "Soubory".
  8. Pro „Typ souboru:“ vyberte „Protokol“.
  9. Ujistěte se, že je vybrána možnost „Uvolnit nevyužité místo“ a stiskněte tlačítko „OK“.

Váš problém to vyřeší, i když již nebudete moci obnovit z protokolů transakcí. Zkontrolujte dokumentace a zjistěte, který model obnovy je pro vás nejlepší. Obvykle používám jednoduché, protože děláme velké množství příloh a hodinové/denní zálohy jsou dost dobré pro naše potřeby. Také, pokud používáte jednoduché, pak protokol neroste tak velký.

Pokud nechcete změnit typ obnovy, zkuste provést úplnou zálohu před zmenšením souborů DB a DB. Z důvodů výkonu doporučujeme na obrazovce Zmenšit databázi nastavit „Maximální volné místo v souborech po zmenšení“ alespoň 10%. Používáte-li db s protokolem, který může růst poměrně rychle na 300 GB, budete jej chtít nechat mnohem větší a na obrazovce „Zmenšit soubor“ nastavte „Zmenšit soubor na:“ na 1024 MB.

Pokud potřebujete další pomoc, dejte nám vědět, jinak přijměte odpověď. Komunita neradi odpovídá na otázky lidí, kteří nepřijímají odpovědi. :)

Upravit : Výše ​​uvedené kroky by měly fungovat. Pravděpodobně jste udělali něco špatného (například vyberte nesprávnou databázi). Alternativní způsob, jak toho dosáhnout, naleznete tento článek .

Při provádění zálohy se také ujistěte, že je „Typ zálohy:“ plný, není zaškrtnuto políčko „Záloha pouze pro kopírování“ a v části „Zálohovací komponenta“ je vybrána položka „Databáze“. Pokud je to možné, vyberte přepínač „Zkrácení protokolu transakcí“ pro „Protokol transakcí“ na stránce „Možnosti“.

Před spuštěním výše uvedených kroků zkuste databázi odpojit a poté ji znovu uvést do režimu online. Pokud se nepodaří vypnout řádek, budete muset ručně ukončit připojení SQL (uživatelé jsou stále přihlášeni do databáze, která těmto změnám brání).

Pokud tyto možnosti stále nefungují, budete muset použít méně bezpečnou metodu, jako je zálohování databáze do souboru a její obnovení nad existující databází a poté zmenšení souborů.

Další odkazy :

Ujistěte se také, že upravujete databázi přidruženou k souboru. To lze provést otevřením vlastností databáze a přechodem na stránku „Soubory“.

3
Trisped

Stejný problém jsem měl s tím, že soubor protokolu rostl v databázi spuštěné v jednoduchém režimu. Soubor protokolu se rozrostl na 70 gig. ani po kontrolním bodě jsem nemohl zmenšit soubor protokolu. Použil jsem replikaci se snímkem. Služba předplatitele sql nebyla spuštěna několik dní. Tento problém se mi podařilo vyřešit úpravou vlastností publikace na vydavateli z výchozího velmi velkého počtu hodin na jednu hodinu. Poté jsem byl schopen zkontrolovat a zmenšit protokol.

0
Remy

nebudu opakovat, co @Trisped řekl, že pokud převedete na jednoduché zotavení, jaké budou důsledky a také potřeba zálohovat databázi před provedením níže uvedených kroků

Níže uvedený kód převede obnovení vaší databáze na jednoduchou a zmenší soubor protokolu transakcí na minimum a nastaví obnovení na plnou hodnotu, pokud to budete chtít.

ALTER DATABASE [DBNAME] SET RECOVERY SIMPLE;
use DBNAME
DBCC SHRINKFILE(DBNAME_log,1)
ALTER DATABASE [DBNAME] SET RECOVERY FULL;

ale doporučuji před zmenšením souboru vidět výsledky

DBCC SQLPERF(LOGSPACE)

Ukáže vám velikost každého souboru protokolu každé databáze a ukáže vám, jaké místo se používá v protokolu transakcí

nebo

Pokud se operace zmenšení spustí bez chyby, jak jste řekli, ale zdá se, že se soubor nezměnil, ověřte, zda má soubor dostatečné volné místo k odstranění provedením jedné z následujících operací:

Spusťte následující dotaz.

use DBNAME
 SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;

doporučuji přečíst následující

http://msdn.Microsoft.com/en-us/library/ms189493.aspx Poznámky

a také si přečtěte o (Zmenšení protokolu transakcí) http://msdn.Microsoft.com/en-us/library/ms178037 (SQL.105) .aspx

je třeba si uvědomit, že soubor protokolu lze zmenšit pouze na hranici virtuálního souboru protokolu, zmenšení souboru protokolu na velikost menší než je velikost souboru virtuálního protokolu nemusí být možné, i když se nepoužívá

chcete-li se dozvědět více o tom, co je soubory virtuálního protokolu , přečtěte si zde http://msdn.Microsoft.com/en-us/library/ ms179355 (SQL.105) .aspx

Databázový stroj SQL Server interně rozděluje každý fyzický soubor protokolu do několika virtuálních souborů protokolu. Virtuální soubory protokolu nemají pevnou velikost a neexistuje žádný pevný počet souborů virtuálního protokolu pro fyzický soubor protokolu. Databázový stroj volí velikost virtuálních souborů protokolu dynamicky při vytváření nebo rozšiřování souborů protokolu. Databázový stroj se pokouší udržovat malý počet virtuálních souborů. Velikost virtuálních souborů po rozšíření souboru protokolu je součtem velikosti existujícího protokolu a velikosti nového přírůstku souboru. Správce nemůže nakonfigurovat ani nastavit velikost nebo počet souborů virtuálního protokolu.


druhá část otázek Odpojím databázi od serveru SQL, poté po přesunutí konkrétního souboru .LDF do jiného umístění a připojím pouze databázový soubor zpět k serveru SQL

pokud odpojíte a přesunete soubor ldf, při pokusu o opětovné připojení se zobrazí zpráva (Nebyl nalezen) a bude mít možnost buď odkazovat na nové umístění, nebo jej pouze odstranit, a pokud jej odstraníte Bude vytvořen nový soubor protokolu transakcí .


Poslední část vašich otázek

Prosím, dejte mi vědět, že je to dobrý postup pro přesun protokolu transakcí na jiný disk. Pokud ne, navrhněte nějaké jiné řešení pro zotavení ze zmenšujícího se protokolu databáze.

Odpojení a připojení je dobrá metoda, pokud můžete zastavit aplikaci, která je ve vašem případě, uživatelům zabránit v používání ostrých bodů.

0
AmmarR

Nedávno jsem narazil na problém s databází, jejíž soubor protokolu neustále rostl, a to i se zálohou protokolu. Nakonec jsem zjistil, že to má něco společného s replikací snímku, která se objevila v databázi. Jakmile jsem změnil replikaci ze Snapshot na Transactional, zaznamenaný začátek pracoval podle plánu znovu.

Zkontrolujte, zda v této databázi běží replikace.

0
DForck42