Modèle de récupération simple ou complet pour les bases de données?


38

Quand dois-je utiliser le modèle de récupération complet et quand dois-je utiliser le modèle de récupération simple pour les bases de données?

J'ai toujours utilisé le modèle de récupération complète, car il s'agit du modèle par défaut, mais aujourd'hui, j'ai rencontré cette erreur:

Fournisseur Microsoft OLE DB pour SQL Server (0x80040E14) Le journal des transactions de la base de données 'DATABASE NAME' est saturé. Pour savoir pourquoi l'espace dans le journal ne peut pas être réutilisé, consultez la colonne log_reuse_wait_desc dans sys.databases.

La base de données spécifique est en fait l’une des bases de données les plus petites et les plus inactives sur mon serveur. Par conséquent, je ne sais pas du tout comment le journal peut être saturé sur cette base de données, pas sur les autres.

Pour réduire le journal et rendre la base de données accessible à nouveau, j'ai remplacé le modèle de récupération de COMPLET par SIMPLE et rétréci le journal des fichiers logiques à l'aide de la commande suivante.

alter database myDbName SET recovery simple
go
dbcc shrinkfile('LOG FILE LOGICAL NAME', 100)
go

Cela a aidé, mais je dois maintenant comprendre POURQUOI cela a aidé, COMMENT cette situation a commencé et COMMENT éviter que cela ne se produise à l'avenir?

MODIFIER:

Tous les soirs à 13 heures, nous effectuons une sauvegarde par script de chaque base de données du serveur. Ceci est fait par un script de 31 lignes où la partie la plus importante est

set @Filename = 'D:\backup\' + convert(varchar, getDate(), 112) + ' - ' + @DBName + '.bak'
set @Description = 'Full backup of database ' + @Filename
BACKUP DATABASE @DBName TO DISK = @Filename WITH INIT , NOUNLOAD , NAME = @Description, NOSKIP , STATS = 10, NOFORMAT

Le nouveau modèle de récupération et les bases de données seront-ils en conflit avec ce script?

Nous ne faisons aucune autre sauvegarde des bases de données, et donc pas des journaux de transactions, devrions-nous?


Il convient de noter qu’à présent, ce n’est pas un choix dans Azure SQL: il utilise toujours la récupération COMPLETE. azure.microsoft.com/en-us/blog/…
jocull

Réponses:


60

Quand dois-je utiliser le modèle de récupération complet et quand dois-je utiliser le modèle de récupération simple pour les bases de données?

Vous devez utiliser le modèle de récupération complète lorsque vous avez besoin d'une récupération ponctuelle de votre base de données. Vous devez utiliser un modèle de récupération simple lorsque vous n'avez pas besoin de restaurer votre base de données à un moment précis et lorsque la dernière sauvegarde complète ou différentielle est suffisante en tant que point de récupération. (Remarque: il existe un autre modèle de récupération, enregistré en bloc. Pour plus d'informations sur le modèle de récupération enregistré en bloc, voir cette référence. )

Fournisseur Microsoft OLE DB pour SQL Server (0x80040E14) Le journal des transactions de la base de données 'DATABASE NAME' est saturé. Pour savoir pourquoi l'espace dans le journal ne peut pas être réutilisé, consultez la colonne log_reuse_wait_desc dans sys.databases.

La raison pour laquelle vous avez eu cette erreur (très probablement) est que vous n'avez pas sauvegardé votre journal des transactions. Lorsqu'il n'est pas sauvegardé, le fichier journal de transactions continue de croître physiquement (à condition que croissance automatique soit activée et que maxsize le permette), car il ne peut réutiliser aucune des "parties" du journal des transactions (fichiers journaux virtuels). Il ne peut que réutiliser les fichiers VLF et autoriser le "bouclage" du journal des transactions lorsque vous effectuez une sauvegarde du journal des transactions (et quelques autres exigences, telles que l'absence de transactions actives, certains aspects de la réplication, etc.).

Pour réduire le journal et rendre la base de données accessible à nouveau, j'ai remplacé le modèle de récupération de COMPLET par SIMPLE et rétréci le journal des fichiers logiques à l'aide de la commande suivante.

......

Cela a aidé, mais je dois maintenant comprendre POURQUOI cela a aidé, COMMENT cette situation a commencé et COMMENT éviter que cela ne se produise à l'avenir?

Cela vous a aidé car, en définissant votre base de données sur le modèle de récupération simple, vous avez indiqué à SQL Server que la récupération à un moment donné ne vous intéressait plus et qu'il était nécessaire de garantir que les fichiers journaux virtuels ne doivent plus être conservés et marqués comme actifs. maintenant, un processus de point de contrôle marque ces VLF comme inactifs.

Extrait / citation tiré de cette référence MSDN :

Dans le modèle de récupération simple, à moins qu'un facteur ne retarde la troncation du journal, un point de contrôle automatique tronque la section non utilisée du journal des transactions. En revanche, dans les modèles de récupération journalisés complets et en bloc, une fois qu'une chaîne de sauvegarde de journal a été établie, les points de contrôle automatiques ne provoquent pas de troncature de journal.

Vous avez ensuite procédé à une réduction physique du fichier de base de données et, du fait qu’il y avait de l’espace libre dans votre journal des transactions, il était maintenant possible de réduire physiquement le fichier NTFS.

Lire vaut la peine de passer du temps sur:

  1. Modèles de récupération
  2. Gestion des journaux de transactions (Gail Shaw)
  3. Facteurs pouvant retarder la troncature du journal

EDIT après votre Edit :

Le nouveau modèle de récupération et les bases de données seront-ils en conflit avec ce script?

Cette BACKUP DATABASEcommande fonctionnera avec l'un ou l'autre des modèles de récupération. En ce qui concerne la réduction de la base de données de routine ... NE LE FAITES PAS !!!! Sérieusement, dimensionner votre base de données en conséquence, et si vous utilisez le modèle de récupération complet, assurez-vous que vous utilisez des fichiers de journaux de transactions fréquents et courants, non seulement pour garder la taille du journal des transactions à distance, mais également pour répondre aux objets de point de récupération.

Nous ne faisons aucune autre sauvegarde des bases de données, et donc pas des journaux de transactions, devrions-nous?

Si votre base de données utilise le modèle de récupération complète, alors oui, vous devriez effectuer des sauvegardes du journal des transactions. Si votre base de données est en restauration simple, vous ne pouvez physiquement pas effectuer de sauvegarde du journal des transactions.

En ce qui concerne le modèle de récupération à utiliser (simple ou complet), nous ne pouvons pas prendre cette décision à votre place. Seuls vous, votre équipe commerciale et vos accords de niveau de service peuvent le faire.


Vous pouvez également ajouter que si vous utilisez la mise en miroir de base de données, vous devez utiliser le modèle de récupération complète car il utilise le fichier journal pour maintenir le miroir à jour.
Holger

C'était une excellente réponse . Une partie que je ne comprends pas est «de rencontrer également des objets de points de récupération». Souhaitez-vous clarifier cette phrase? J'ai d'abord pensé que vous aviez l'intention d'écrire des «objectifs», mais je ne suis pas certain de cette hypothèse.
Anthony G - justice pour Monica
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.