La réduction du fichier journal ne réduit pas la taille

24

J'ai une base de données qui contient un fichier de données de 350 Mo (.mdf) et un fichier journal de 4,9 Go (.ldf). Le modèle de récupération est défini sur FULL.

Lorsque j'essaie de réduire le fichier journal, il ne rétrécit pas.

Je sais que réduire une base de données n'est pas bon et cela ne devrait pas être fait. Mais j'essaie toujours de le faire pour réduire le fichier journal.

Quand j'ai couru

DBCC SQLPerf(logspace) 

J'ai trouvé que la taille du journal est de 4932 Mo et que l'espace utilisé pour le journal est de 98,76% !

J'ai ensuite essayé cette commande

USE <databasename>;
DBCC loginfo;

Maintenant, presque tous les VLF ont le «statut 2», ce qui signifie que tous sont en cours d'utilisation.

J'ai essayé de faire une sauvegarde du journal, puis de réduire le fichier journal. Le rétrécissement n'a pas réduit la taille.

J'ai changé le modèle de récupération SIMPLEet j'ai essayé de réduire à nouveau, mais cela n'a pas aidé non plus.

J'ai vérifié les transactions ouvertes

DBCC opentran (database);

et a constaté qu'aucune transaction n'est ouverte actuellement.

Qu'est-ce qui m'empêche de réduire le fichier journal? Comment puis-je résoudre ça?

Navaneet
la source

Réponses:

12

Voici la réponse à ma propre question.

Exécutez la requête ci-dessous pour obtenir des informations sur l'attente de réutilisation du fichier journal:

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = 'DBName'

J'ai obtenu la sortie suivante:

log_reuse_wait_desc
-------------------
REPLICATION 

Il restait des objets liés à la réplication dans la base de données, même après la suppression de la réplication.

Pour supprimer la réplication de la base de données, sp_removedbreplicationpeut être utilisé. Mais cela n'a pas fonctionné pour nous car la réplication n'était pas active à l'époque et la réplication avait été supprimée bien avant.

La solution consistait à importer le contenu de la base de données dans une autre base de données à l'aide de l'option d'importation de SQL Server.

Navaneet
la source
J'ai eu le même problème et l'ai utilisé pour voir qu'il y avait une transaction active dans la base de données. log_reuse_wait_desca donné ACTIVE_TRANSACTION. Dès que la transaction a été conclue, le retrait a très bien fonctionné.
squillman
10

Les étapes pour réduire le journal vont être

Sauvegarder le journal des transactions via SSMS ou T-SQL, puis effectuer une réduction

les commandes pour SSMS sont sous les tâches si vous cliquez avec le bouton droit sur le nom de la base de données

BACKUP LOG <Databasename> TO DISK N'<path\database_log.ldf';
GO

DBCC SHRINKFILE (<FileName>, <TargetSize>) WITH NO_INFOMSGS

Vous devrez probablement le faire plusieurs fois

Si une transaction ou un travail bloque l'action, utilisez le moniteur d'activité pour identifier le processus et le tuer, ou utilisez le moniteur d'activité du travail de l'Agent SQL pour terminer le travail.

source: http://support.microsoft.com/kb/907511

Cougar9000
la source
Mais le problème que j'ai rencontré est différent.Veuillez voir ma réponse ci
Navaneet
Heureux d'apprendre que vous l'avez compris, merci pour la mise à jour!
Cougar9000
Syntaxe incorrecte - un signe égal est manquant: JOURNAL DE SAUVEGARDE <Nom de la base de données> SUR LE DISQUE = N '<chemin \ base de données_log.ldf';
Ingénieur inversé
9

Lisez Comment réduire le journal SQL Server pour une explication sur la façon dont la nature circulaire du journal peut empêcher la réduction après la troncature. Il est possible que vous connectiez le dernier point LSN de votre VLF à la fin du LDF. Contre intuitivement, vous devez faire avancer le journal, en générant des écritures de journal, pour lui permettre de rétrécir.

Remus Rusanu
la source
0

Vous devez d'abord créer une sauvegarde, en fonction du modèle de sauvegarde configuré pour la base de données avant de pouvoir réduire la base de données.

Vous pouvez essayer d'exécuter ceci:

USE <databasename>
GO

BACKUP DATABASE <databasename> TO DISK '<absolute path goes here>\<databasename>.bak';
GO

Ou vous pouvez le faire à partir de SSMS et utiliser les outils graphiques disponibles (voir ici pour plus de détails: http://msdn.microsoft.com/en-us/library/ms187510.aspx )

Une fois que vous avez sauvegardé votre base de données, vous pouvez la compresser. Cependant, la réduction de la base de données n'est pas une bonne idée car une forte fragmentation d'index se produira et la recherche de données deviendra lente.

J'espère que cela t'aides.

Toni Kostelac
la source
Je sais comment sauvegarder et tronquer le journal et réduire la taille du fichier journal. Mais pour cette base de données, j'ai un problème. Je viens d'exécuter la requête select log_reuse_wait_desc de sys.databases où name = 'dbname' et j'ai constaté que la réplication est à l'origine du problème .Mais je n'ai pas de réplication définie. Alors, comment supprimer la réplication de cette base de données qui est affichée dans le journal de réutilisation wait_desc?
Navaneet
Quelle version de SQL Server utilisez-vous?
Toni Kostelac
La réplication peut être définie comme un travail, alors ouvrez le dossier de l'Agent SQL Server et développez le dossier Travaux, vérifiez s'il y a un travail de réplication configuré et si c'est le cas, désactivez-le en cliquant avec le bouton droit et en sélectionnant Arrêter le travail
Toni Kostelac
Si vous utilisez SQL Server 2005 et versions ultérieures, sp_removedbreplication 'DB_NAME' supprimera la réplication. Pour SQL Server 2000 .. reportez-vous à blogs.msdn.com/b/repltalk/archive/2010/11/17/…
Kin Shah
Mais le problème que j'ai rencontré est différent.Veuillez voir ma réponse
Navaneet
0

J'ai constaté que je dois effectuer 2 ou 3 sauvegardes de la base de données et du journal des transactions pour que le journal des transactions soit réellement réduit. J'ai une base de données qui a été créée avec le modèle de récupération complète. Chaque nuit, il effectue des sauvegardes de la base de données et du journal des transactions, mais inévitablement, le journal des transactions semble augmenter continuellement sur 2-3 semaines. Lorsque l'espace disque restant atteint 1 Go, je constate que le journal des transactions fait environ 30 Go. J'ai suivi les étapes recommandées par Microsoft et après la 4e ou la 5e itération de sauvegarde de la base de données et du journal des transactions, le journal des transactions libérera enfin son espace supplémentaire et se réduira. Ensuite, je reviens en arrière et supprime les multiples sauvegardes que j'ai créées.

SQL King
la source
Je pense que vous faites quelque chose de mal. Si vous effectuez correctement la sauvegarde du journal, le journal inutilisé doit être tronqué. Les commandes données dans ma question peuvent vous aider à résoudre le problème.
Navaneet
-8

Mon travail autour de la réplication qui bloque la réduction du fichier journal est le suivant:

  1. Définissez le modèle de récupération de base de données sur Simple
  2. Mettre DB hors ligne
  3. Créer une sauvegarde du fichier journal (au cas où)
  4. Supprimer le fichier journal
  5. Mettre DB en ligne

Dans mon cas, cela a fonctionné. Après avoir mis DB en ligne, le journal a été créé automatiquement et sa taille était de 512 Ko au lieu de 70 Go. Mais ce n'est qu'une solution de contournement. Le problème racine n'est pas résolu. Dans mon cas, nous utilisons la réplication.

Mecool
la source
4
C'est un conseil terrible, ne supprimez jamais votre journal des transactions, toutes sortes de problèmes peuvent en découler tels que la corruption
Tom V - Team Monica