SQL Log et ACTIVE TRANSACTIONS
-
10-10-2019 - |
Question
J'ai un serveur Web avec SQL 2008 l'exécution d'une simulation SQL 2005 db, et j'ai SQL 2005 db locale pour l'environnement de test.
Cela me fait d'utiliser des scripts pour les données de sauvegarde / restauration pour tester en 2008 des sauvegardes du serveur ne restaure pas à un serveur 2005.
Quand je lance cette requête SQL pour réduire la taille d'une table sur ma production Web SQL Server (2008)
DELETE FROM TickersDay
WHERE (DATEDIFF(day, TickersDay.[date], GETDATE()) >= 8)
GO
Je reçois ce message:
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
Il est quand je publie des scripts aussi parfois.
Quand je lance cette commande SQL je reçois le résultat suivant:
SELECT [name], recovery_model_desc, log_reuse_wait_desc
FROM sys.databases
RÉSULTAT:
[name] recovery_model_desc log_reuse_wait_desc
VTNET SIMPLE ACTIVE_TRANSACTION
Voici mes questions et problèmes:
- Je comprends .. J'ai une déclaration de transaction qui a besoin d'une commande Rollback
-
EN ATTENDANT ... Comment puis-je éliminer ce problème ?? Je l'ai essayé et je DIMINUTION ai essayé backuping le Db ...
-
Comme vous pouvez le voir, il est en mode simple ... Je n'ai aucune idée comment sauvegarder un journal de fichier SEULEMENT ... (n'ont pas trouvé comment faire) ...
La solution
Vous pourriez être en mesure de contourner ce problème simplement en obtenant SQL pas pour traiter toute la table en utilisant l'index uniquement sur les dates doivent être supprimées. Reformulez pour être convivial indice
DELETE FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO
Si vous exécutez ce assez souvent (au moins tous les jours), alors il n'a qu'à traiter 1 / 9ème ou moins par un index sur TickersDay ([Date]) au lieu d'avoir à passer par la table entière si vous utilisez DATEDIFF sur la champ.
Si cela provoque encore ceci:
Le journal des transactions pour la base de données 'VTNET' est plein
Vous avez vraiment besoin d'augmenter la taille journal parce que je soupçonne que ce n'est pas réglé sur et n'est pas une croissance automatique assez grand pour cette opération. Ou bien commencer à regarder les Batching suppressions (en supposant que vous avez à nouveau un index sur la date, cette cible efficacement que les 100 lignes), par exemple.
DELETE TOP (100) FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO
Vous pouvez en boucle (en @@ rowcount> 0) ou programmer simplement plus souvent en arrière-plan ruisselant supprimer.