Odstraňte nepotřebné soubory protokolu transakcí serveru SQL Server

od: Sergey Gigoyan | Aktualizováno: 2015-11-18 | Komentáře (9) | související: více > Správa databáze

problém

SQL Server umožňuje používat více než jeden soubor protokolu transakcí, ale vyvstává otázka, zda je to nutnéa jaká je výhoda mít více souborů protokolu transakcí. Mezi některými vývojáři existuje mylná představa, že soubory protokolu multipletransaction mohou zvýšit výkon, protože SQL Server je může používat paralelně. SQL Server používáPouze jeden soubor protokolu transakcí v současné době a v tomto případě neexistuje paralelismus. Někdy může být více než jeden soubor protokolupotřebné pro účely řešení problémů. Takže obvykle není nutné mít více než jeden soubor protokolu.Podívejme se na případ, kdy naše databáze má více než jeden soubor protokolu a měli bychom si ponechat pouze jeden.Cílem tohoto tipu je popsat, jak správně odstranit nepotřebné soubory protokolu a zachovat pouze jeden.

řešení

než začneme ilustrovat, jak odstranit nepotřebné soubory protokolu, stručně popíšeme, jak funguje SQL Server se soubory protokolu: pokud má databáze více než jeden soubor protokolu, SQL Server stále zapisuje do prvního, dokud není plný, pak se přepne na druhý a tak dále. Po posledním souboru protokolu se stane plný SQL Server vrátí zpět na první a cyklus pokračuje.Jak jsme však zmínili, někdy může být vyžadováno více než jeden soubor protokolu. Například když je disk, kde je umístěn soubor protokolubude plný a musíme vytvořit druhý soubor protokolu na jiném místě, ale po vyřešení problému bychom měli odstranit druhý soubor protokolu,protože nemá smysl mít více než jeden soubor protokolu.Nyní předpokládejme, že máme databázi se dvěma soubory protokolu a naším úkolem je odstranit druhý.Následující skript vytvoří databázi TestDB se dvěma soubory protokolu a tabulkou TestTable. Chcete-li jej spustit sami, budete muset vyměnit“D:\SQL Data“ s existující cestou ke složce.

USE GOCREATE DATABASE ON PRIMARY ( NAME = N'TestDB', FILENAME = N'D:\SQL DATA\TestDB.mdf' , SIZE = 4096KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'TestDB_log1', FILENAME = N'D:\SQL DATA\TestDB_log1.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%), ( NAME = N'TestDB_log2', FILENAME = N'D:\SQL DATA\TestDB_log2.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GOUSE TestDBGOCREATE TABLE TestTable(ID INT IDENTITY(1,1),Value BIGINT)--Change recovery model for TestDB to FULL (if your model database is in FULL recovery model, TestDB has been already created in this mode)ALTER DATABASE TestDB SET RECOVERY FULL 

nyní pochopíme fyzickou strukturu protokolu transakcí: interně soubor protokolu transakcí se skládá zvirtuální soubory protokolu (VLF), které jsou jednotkou správy v souboru protokolu transakcí. To znamená, že když databázový stroj roste nebo zmenšuje soubor protokolu, dělá to s úplnými VLFs (například nemůže zmenšit polovinu VLF). Velikost virtuálních souborů protokolu, stejně jakojejich číslo ve fyzickém souboru protokolu není pevná a je řízena dynamicky bythe databázový stroj. Monitorovatsoubor protokolu transakcí interněpoužíváme příkaz „DBCC LOGINFO“, který poskytuje informace o souborech virtuálních protokolů. Ve skriptu níže jsme použili tento příkaz pro naši databázi:

--Getting log files infoDBCC LOGINFO('TestDB')

a výsledek je následující:

TestDB

FileID je ID souboru protokolu pro naši databázi. Stav indikuje, že je VLF opakovaně použitelný nebonot (možné hodnoty: 0-ano, 2-ne). Jak vidíme, existuje pouze jeden VLFSTAV=2. Nyní, když vložíme data do testovacího stolu a sledujeme, jak rostou soubory protokolu:

USE TestDBGO--Checking log information before insertionSELECT file_id, name, type_desc, physical_name, size, max_sizeFROM sys.database_files--Inserting data into TestTable;WITH ValueTable AS(SELECT 1 nUNION ALL SELECT n+ 1FROM ValueTableWHERE n 

v tomto příkladu vidíme, že oba soubory protokolu rostly a nyní existují VLFs s „Status=2“ ve druhém souboru protokolu (FileID=3) také:

VLFs_with_Status=2

nyní musíme odstranit TestDB_log2.soubor ldf. Všimněte si, že můžeme odstranit pouze sekundární soubory protokolu. Removingthe primární soubor protokolu není povolen SQL Server.Každá databáze má pouze jeden primární soubor protokolu a první soubor protokolu, který je vytvořen v skriptu pro vytvoření databáze, je považován za primární.Pokud se pokusíme odstranit druhý soubor protokolu:

USE masterGO--Remove TestDB_log2 fileALTER DATABASE TestDB REMOVE FILE TestDB_log2

obdržíte následující zprávu:

ALTER_DATABASE_TestDB

soubor protokolu transakcí můžeme odstranit pouze tehdy, když je prázdný, proto je třeba nejprve vyprázdnit it.To udělejte to, měli bychom zálohovat protokol transakcí. Vzhledem k tomu, že naše databáze „TestDB“ je nově vytvořena a neexistují žádné úplné zálohy, musíme pro databázi TestDB vydat úplnou zálohu databáze, po které můžeme vydat zálohu protokolu transakcí:

--Full backupBACKUP DATABASE TestDB TO DISK =N'D:\SQL DATA\TestDB.bak'--Transaction log backupBACKUP LOG TestDB TO DISK =N'D:\SQL DATA\TestDB.trn'

záloha protokolu transakcí zkracuje soubor protokolu (existují některé výjimky, které jsou mimo rozsah tohoto protokolu). Zkrácení protokolu odstraní neaktivní soubory virtuálního protokoluzačátek logického protokolu a uvolní místo v souboru protokolu. Zkrácení však nezmenšuje Velikost souboru fyzického protokolu. Uvolňuje v něm pouze prostor, který lze znovu použít. Pojďme znovu spustit „DBCC LOGINFO“ :

 DBCC LOGINFO

jak vidíme, v „TestDB_log2 nejsou žádné virtuální soubory protokolu.ldf “ soubor se stavem=2 a nyní je náš soubor protokolu prázdný a připraven k odstranění:

--Remove TestDB_log2 fileALTER DATABASE TestDB REMOVE FILE TestDB_log2

odstranění je úspěšné.

 Odebrat TestDB

když však znovu zkontrolujeme protokolování informací, uvidíme, že soubor logického protokolu stále existuje:

--Checking log informationSELECT file_id, name, type_desc, physical_name, size, max_sizeFROM sys.database_files

sys.database_files

pokud provedeme další zálohu protokolu, soubor bude smazán:

--Transaction log backupBACKUP LOG TestDB TO DISK =N'D:\SQL DATA\TestDB.trn'--Checking log informationSELECT file_id, name, type_desc, physical_name, size, max_sizeFROM sys.database_files

Kontrola informací protokolu
další kroky
  • mějte na paměti tento tip, abyste zjistili použití protokolu transakcí a jak odstranit nepotřebný soubor protokolu.
  • podívejte se na tyto zdroje:
    • Správa databáze / protokol transakcí
    • https://technet.microsoft.com/en-us/library/ms191433(v = sql.105).aspx
    • https://technet.microsoft.com/en-us/library/ms179355(v = sql.105).aspx
    • https://technet.microsoft.com/en-us/library/ms345414(v = sql.105).aspx

získat skripty

tlačítko Další tip

o autorovi
MSSQLTips autor Sergey GigoyanSergey Gigoyan je databáze Profesionální s více než 10 let zkušeností, se zaměřením na návrh databáze, vývoj, ladění výkonu, optimalizace, vysoká dostupnost, BI a DW design.
Zobrazit všechny mé tipy

článek naposledy aktualizován: 2015-11-18

Leave a Reply

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.