web-dev-qa-db-fra.com

Un grand journal transactionnel ne diminuera pas après une sauvegarde transactionnelle

Je vais commencer par dire que nos bases de données utilisent le mode de récupération complète et nous exécutons SQL Server 2014.

Au cours des derniers jours, nos sauvegardes ont semblé spirale hors de contrôle au point que nos sauvegardes complètes/différentielles échouaient et que seules des sauvegardes transactionnelles extrêmement importantes ont été créées. Ceci a bien sûr entraîné une question d'espace disque et nécessitait un peu d'intervention manuelle pour restaurer l'ordre.

Je fais manuellement une sauvegarde complète sur chaque base de données, puis j'ai essayé de faire un suivi en exécutant une sauvegarde de transaction. Au cours de cette période, le fichier journal d'une base de données a augmenté de taille au point qu'il a manqué d'espace disque. Habituellement, le fichier journal serait d'environ 1 Go, il est maintenant assis à environ 30 Go.

Exécution d'une sauvegarde transactionnelle n'a pas réduit la taille du fichier journal et j'ai été bloqué dans une position où le fichier journal était plein et il n'y avait plus de place sur le disque. En tant que dernier effort de fossé, j'ai dirigé le filtre de lit (DBName, 4096) qui réduit instantanément la taille et tout semblait normal.

Après cela, j'ai remarqué que mes sauvegardes ne fonctionnaient plus et je recevais une erreur:

Erreur de données (contrôle de redondance cyclique) a échoué. J'ai essayé d'exécuter Checkdb et j'ai été présenté avec le message suivant:

Une erreur grave s'est produite sur la commande actuelle. Les résultats, le cas échéant, doivent être jetés.

Étant donné que j'étais incapable de soutenir la base de données, j'ai décidé d'essayer de restaurer de plus tôt dans la journée de congé une sauvegarde complète et une sauvegarde transactionnelle unique que j'avais créée. Ces deux fichiers étaient grands. La raison pour laquelle je n'avais que 1 sauvegarde transactionnelle était parce que j'avais handicapé le travail de gérer pour éviter les choses en spirale.

La nouvelle DB est opérationnelle et les sauvegardes fonctionnent bien, mais la question du grand fichier journal prévaut toujours. Mes sauvegardes transactionnelles sont très petites maintenant, mais je n'arrive pas à réduire la DB.

Quelqu'un a des idées? Sinon, s'il existe un moyen de résoudre le problème de redondance sur la base de données d'origine qui serait une solution préférable car je n'aurais aucune perte de données alors.

Pas de transactions ouvertes. Le log_reuse_wait_desc Est "log_backup" que ma compréhension signifie qu'il attend qu'une sauvegarde de journal soit exécutée. C'est la folie parce que j'en ai fait plusieurs;) dbcc sqlperf(logspace) prétend que j'utilise 92% d'espace.

Les sauvegardes de journal sont exécutées toutes les 15 minutes dans des circonstances normales, mais comme je l'ai mentionné, celles-ci ont échoué au cours du week-end. Je les ai éteints pour le moment d'arrêter le lecteur se remplir et je viens d'exécuter manuellement des sauvegardes transactionnelles. La base de données n'est pas en direct pour le moment afin qu'aucune donnée supplémentaire ne se passe là-bas, j'ai peut-être exécuté 4 sauvegardes transactionnelles comme test dans la dernière heure environ.

Aucun des réplication, miroir ou AOAG n'est configuré ici.

2
Sami.C

Quelle est la fréquence des sauvegardes de journal?

Utilisez DBCC SQLPERF (logspace) pour vérifier combien de% est un espace libre dans les journaux.

Il y a quelque chose qui tient les grumes. Vérifiez le log_ruse_wait_desc pour cette base de données et agissez en conséquence.

Suivez l'article ci-dessous:

https://www.brentozar.com/archive/2016/03/my-favorite-system-column-log_reuse_wait_descs/

3
Ramakant Dadhichi

log_ruse_wait_desc dans les sys.databases de votre base de données peut afficher log_backup sous 2 circonstances:

  1. en attente d'une sauvegarde de journal pour exécuter
  2. ou les enregistrements de journal sauvegardés étaient tous dans le courant VLF et il ne pouvait donc pas être effacé. Si la sauvegarde du journal a couru, mais toujours log_ruse_wait_desc affiche comme "log_backup", c'est probablement à cause de la 2ème raison. Ce que cela signifie qu'il existe très peu de transactions sur la base de données et sont toutes sur le même VLF. Lorsque la sauvegarde du journal fonctionne, il ne peut pas effacer le VLF actuel; Donc, log_ruse_wait_desc ne peut pas être réinitialisé.

Paul Randal a un excellent message à ce sujet ici .

0