SQL Log e transazioni attive
-
10-10-2019 - |
Domanda
Ho un server Web con SQL 2008 l'esecuzione di un simulato db SQL 2005, e ho un db locale di SQL 2005 per testare l'ambiente.
Questo mi fa utilizzare gli script per il backup / ripristino dei dati per testare i backup dei server 2008 non ripristinare a un server 2005.
Quando eseguo questa query SQL per ridurre le dimensioni di una tabella sul mio Web di produzione di SQL Server (2008)
DELETE FROM TickersDay
WHERE (DATEDIFF(day, TickersDay.[date], GETDATE()) >= 8)
GO
ottengo questo messaggio:
Msg 9002, Level 17, State 4, Line 3
The transaction log for database 'VTNET' is full. To find out why space in the log
cannot be reused, see the log_reuse_wait_desc column in sys.databases
Si ha quando ho pubblicare scritti anche a volte.
Quando eseguo questo comando mi SQL ottenere il seguente risultato:
SELECT [name], recovery_model_desc, log_reuse_wait_desc
FROM sys.databases
Risultati:
[name] recovery_model_desc log_reuse_wait_desc
VTNET SIMPLE ACTIVE_TRANSACTION
Ecco le mie domande e questioni:
- I get it .. Ho una dichiarazione transazione che ha bisogno di un comando ROLLBACK
-
nel frattempo ... come posso sradicare questo problema ?? Ho provato contrazione e ho cercato backuping il Db ...
-
Come si può vedere, è in modalità SEMPLICE ... Non ho idea di come fare il backup di un file di LOG SOLO ... (non hanno trovato come fare) ...
Soluzione
Si potrebbe essere in grado di aggirare questo problema semplicemente da ottenere SQL non per elaborare l'intera tabella con l'uso l'indice su un solo le date tenuti da eliminare. Riformulare per essere indice amichevole
DELETE FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO
Se si esegue questo abbastanza spesso (almeno al giorno), allora ha solo elaborare 1/9 ° o meno tramite un indice su TickersDay ([Data]), invece di dover passare attraverso l'intera tabella se si utilizza DATEDIFF sul campo.
Se questo provoca ancora questo:
Il log delle transazioni per il database 'VTNET' è pieno
Hai davvero bisogno di aumentare la dimensione del registro, perché ho il sospetto che non sia impostato su aumento e non è abbastanza grande per questa operazione. Uno che o iniziare a guardare la dosatura di eliminazioni (sempre ammesso che abbiate un indice su data, quindi questo si rivolge in modo efficiente solo le 100 righe), per es.
DELETE TOP (100) FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO
È possibile loop (mentre @@ rowcount> 0) o semplicemente pianificare più frequentemente come sfondo gocciolando cancellare.