Cos'è un registro delle transazioni?
C'è un requisito nei sistemi di database relazionali che le transazioni devono essere durevoli. Questa è la "D" nelle proprietà ACID delle transazioni. Il sistema deve garantire che in caso di arresto anomalo improvviso, la transazione possa essere ripetuta. SQL Server soddisfa questo requisito acquisendo tutte le transazioni in un file fisico denominato file di registro delle transazioni .
In sostanza, ogni volta che viene eseguito il commit di una transazione, SQL Server registra le modifiche prodotte da tale transazione in un registro delle transazioni. Anche se la transazione non è stata mantenuta nel file di dati, è disponibile nel registro delle transazioni e può essere riprodotta in caso di arresto anomalo improvviso.
Modelli di ripristino e registri delle transazioni
SQL Server funziona con tre modelli di ripristino:completo, con registrazione in blocco e semplice.
Nella modalità di ripristino completo, TUTTE le transazioni vengono registrate. Pertanto, il database può essere completamente ripristinato in caso di arresto anomalo. Ciò significa anche che il backup del database può essere ripristinato in un momento specifico se la transazione o il relativo backup è disponibile. Nelle modalità di ripristino completo e con registrazione in blocco, i registri delle transazioni vengono troncati ogni volta che viene eseguito un backup del registro.
Nella modalità di ripristino semplice, TUTTE le transazioni vengono comunque registrate. Tuttavia, l'operazione del registro delle transazioni viene troncata ogni volta che il database esegue il checkpoint.
Un checkpoint si verifica quando SQL Server scrive buffer sporchi nel file di dati. I buffer sporchi sono pagine essenziali archiviate in memoria che sono state modificate dalle transazioni, ad esempio che lo stato in memoria non corrisponde allo stato del disco. Tuttavia, non ne discuteremo qui. Nella modalità di ripristino semplice, SQL Server acquisisce tutte queste modifiche nel registro delle transazioni per conservarle finché non vengono mantenute.
La struttura del registro delle transazioni
Il registro delle transazioni è un file fisico visibile sul livello del sistema operativo del server in cui è ospitato il database di SQL Server. Ogni database ha un registro delle transazioni, ma è possibile configurarne di più. Il fatto è che avere più log SQL di transazione non porta alcun vantaggio in termini di prestazioni. SQL Server scrive nel registro delle transazioni in sequenza:un file deve essere pieno prima che il file successivo venga utilizzato. Tuttavia, più file che si trovano su dischi separati possono salvare la giornata se il primo file si riempie.
Internamente, il file di registro delle transazioni è una serie di file di registro virtuali. La dimensione e il numero di questi file influiscono sul tempo necessario per eseguire il backup del database o per portarlo online. È sempre una buona idea dimensionare correttamente il registro delle transazioni e assicurarsi che le impostazioni di crescita automatica si adattino al livello di attività previsto. Quindi le espansioni dei file non si verificheranno troppo spesso.
Cosa fa crescere il registro?
Iniziamo creando un piccolo database usando il codice nel Listato 1. Il file di dati ha una dimensione di 4 MB, il file di registro è di 2 MB per cominciare. I tuoi database di produzione non sarebbero mai di queste dimensioni, specialmente con la pratica popolare della pre-allocazione . Abbiamo scelto tali dimensioni solo a scopo dimostrativo.
-- Listing 1: Create a Small Database
create database tranlogexperiment
on primary
( name = N'tranlogexperiment', filename = N'C:\MSSQL\Data\tranlogexperiment.mdf', size = 4MB , FILEGROWTH = 1024KB )
log on
( name = N'Test1_log', filename = N'E:\MSSQL\Log\Test1_log.ldf' , size = 2MB , FILEGROWTH = 1024KB );
go
In quel database, creiamo una singola tabella per le ulteriori istruzioni DML (Listato 2).
-- Listing 2: Create a Table
use tranlogexperiment
go
create table txn_log (
ID int
, FName varchar(50)
, LName varchar(50)
, CountryCode char (2)
)
Eseguendo il codice nel Listato 3, controlliamo e verifichiamo ciò che abbiamo fatto.
-- Listing 3: Check Recovery Model and File Sizes
select name, recovery_model_desc, log_reuse_wait_desc from sys.databases where name='tranlogexperiment';
select DB_NAME(database_id) [Database Name]
, type_desc [Database Name]
, name [Logical file Name]
, physical_name [Physical file Name]
, size*8/1024 [File Size (MB)]
, growth*8/1024 [File Growth (MB)]
from sys.master_files where database_id=DB_ID('tranlogexperiment');
Presta attenzione alla dimensione del file colonna. Procediamo a invocare la crescita del log delle transazioni eseguendo INSERT e DELETE 100.000 volte (Listato 4).
-- Listing 4: Create a Small Table
use tranlogexperiment
go
insert into txn_log values (1, 'Kenneth','Igiri', 'NG');
delete from txn_log where ID=1;
go 100000
Il Listato 4 inserisce una singola riga nel txn_log tabella ed elimina la stessa riga, ripetendo questa azione 100.000 volte.
Nel complesso, la tabella non aumenta a causa di questa attività, ma il registro delle transazioni aumenta in modo significativo. Quando ripetiamo la query nel Listato 3 dopo aver eseguito l'istruzione DML dal Listato 4, vediamo quanto è cresciuto il log delle transazioni:
Il registro delle transazioni è cresciuto da 4 MB a 40 MB a causa di questa attività anche se le dimensioni del file di dati non sono state modificate. Questo ci mostra chiaramente che la dimensione del registro delle transazioni ha poco a che fare con la dimensione dei dati. L'impatto sulla dimensione deriva dall'attività (DML) che si verifica nel database.
Come gestiamo i registri delle transazioni?
Gli amministratori di database che gestiscono istanze locali di SQL Server delle installazioni IaaS devono eseguire regolarmente il backup dei registri delle transazioni. È utile disporre delle configurazioni di ripristino di emergenza come Log Shipping o AlwaysOn AG . Tali configurazioni eseguono automaticamente i backup.
In modalità di ripristino completo, un backup del registro di SQL Server troncherà le parti del registro delle transazioni che non sono più necessarie per il ripristino. Il troncamento del registro elimina i file di registro virtuali inattivi. In questo modo, libera spazio nei registri delle transazioni per il riutilizzo.
Il codice nel Listato 6 mostra la dimensione del registro delle transazioni e quanto spazio libero abbiamo in esso.
-- Listing 6: Change Recovery Model
USE [tranlogexperiment]
GO
SELECT DB_NAME() AS [Database Name],
name AS [Logical File Name],
type_desc,
size/128.0 AS [Current Size (MB)],
size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0 AS [Free Space (MB)]
FROM sys.database_files
WHERE type IN (0,1);
Possiamo anche ridurre il registro delle transazioni fisiche usando il codice nel Listato 7. Prima di ridurre, assicurati di avere un backup del registro delle transazioni. In produzione, è meglio pianificare i backup dei log per evitare la crescita incontrollata dei file di log fisici e garantire la conservazione dei dati. Con l'opzione di ripristino di emergenza come Log Shipping o AlwaysOn AG configurato, questo è già concesso.
Possiamo interrogare il log_reuse_wait_desc colonna su sys.databases vista catalogo per determinare eventuali condizioni che impediscono la riduzione del registro delle transazioni. Nota che abbiamo interrogato questa colonna nel Listato 3.
Tali condizioni potrebbero essere un checkpoint in sospeso, un backup del registro in sospeso, un backup o ripristino in corso, una transazione attiva di lunga durata e attività simili nel database.
-- Listing 7: Change Recovery Model
USE [tranlogexperiment]
GO
DBCC SHRINKFILE (N'Test1_log' , 0, TRUNCATEONLY)
GO
Usiamo il codice nel Listato 8 per eseguire il backup del database. Nel nostro caso particolare, dobbiamo prima eseguire un backup completo perché i backup dei log fanno sempre riferimento a un backup completo. L'"ultimo" backup completo avvia la catena durante la gestione del ripristino point-in-time.
-- Listing 8: Backup Transaction Log
backup database tranlogexperiment to disk='tranlogexperiment.bkp';
backup log tranlogexperiment to disk='tranlogexperiment_log.trn';
Quando si esegue un database in modalità Simple Recovery, il registro delle transazioni viene troncato a ogni checkpoint . In questa modalità non è possibile eseguire il backup dei log.
La posizione del file di registro delle transazioni deve essere dimensionata correttamente per adattarsi alle transazioni di lunga durata che si verificano occasionalmente. In caso contrario, il registro delle transazioni può ancora riempire lo spazio su disco. La figura 4 mostra cosa accade internamente al registro quando viene eseguito un backup. Nota che il file fisico è ancora 40 MB, ma ora abbiamo circa 37 MB di spazio libero.
Cosa succede in modalità di ripristino semplice?
Ora, impostiamo il tranlogexperiment database in modalità di ripristino semplice.
-- Listing 9: Change Recovery Model
use master
go
alter database tranlogexperiment set recovery simple;
Quando eseguiamo il codice presentato in precedenza nel Listato 4, otterremo un comportamento leggermente diverso.
La Figura 6 mostra la crescita del log delle transazioni in modalità Simple Recovery quando eseguiamo il codice nel Listato 4. La dimensione del file di log fisico è di soli 15 MB. È la metà in meno rispetto a prima con il modello di recupero completo. Inoltre, nota lo spazio libero di 11,5 MB.
Significa che c'è stata una crescita dei log inferiore?
No. La Figura 7 mostra che mentre la sessione era in esecuzione, il nostro SQL Server ha eseguito anche diversi checkpoint. Ciò ha troncato il registro e ha dato spazio alle transazioni per riprendere la crescita del registro a intervalli.
Conclusione
Il registro delle transazioni è un componente incredibilmente importante di un database di SQL Server. Influisce su tutto ciò che richiede o fa affidamento sul ripristino:backup, ripristini, ripristino di emergenza e così via. Puoi anche registrare l'attività db.
In questo articolo, abbiamo discusso la natura del registro delle transazioni, gli aspetti della sua corretta gestione e abbiamo dimostrato il comportamento di DML nei database con modalità di ripristino completo o semplice in atto. Tuttavia, c'è molto altro da imparare sul registro delle transazioni. Le voci nei riferimenti sarebbero un buon punto di partenza per te.
Riferimento s
- Registro delle transazioni
- Database e archiviazione di SQL Server
Leggi anche
Importanza del registro delle transazioni in SQL Server