web-dev-qa-db-fra.com

Comment puis-je réduire la taille initiale d'un fichier journal?

J'ai hérité d'une base de données SQL Server 2008r2; le fichier de données a été créé avec une taille initiale de 1 000 Mo, mais le journal des transactions a une taille initiale de 28 016 Mo. Aucune sauvegarde n'était en cours.

J'ai implémenté des sauvegardes complètes et transactionnelles pour répondre à nos besoins de récupération, et en conséquence, le fichier de transaction est toujours vide à ~ 99,9%, ne dépassant jamais 30 ou 40 Mo utilisés. Je voudrais réduire la taille initiale afin de pouvoir réduire le journal à une taille plus appropriée, 200 Mo environ.

Est-ce que quelqu'un sait comment je peux redéfinir le fichier journal avec une taille Init de 200 Mo?

5
Brent Brown

Est-ce que quelqu'un sait comment je peux redéfinir le fichier journal avec une taille Init de 200 Mo?

Vous devez utiliser ALTER DATABASE [YOUR_DB_NAME] ... MODIFY FILE ... SIZE

ALTER DATABASE [your_db_name] 
SET RECOVERY SIMPLE;

CHECKPOINT;

-- shrink the log file to 200MB
DBCC SHRINKFILE (your_db_name_log,200);

--- define the initial size to 200MB as well.. CHANGE it as per your needs!
ALTER DATABASE [your_db_name]
MODIFY FILE (NAME=your_db_name_LOGICAL_log,SIZE=200MB,MAXSIZE=UNLIMITED,FILEGROWTH=100MB);

--Optional if you want the database in full recovery mode 
--for point in time recovery going forward
ALTER DATABASE [your_db_name] 
SET RECOVERY FULL;
--- Take full backup to establish log chain
-- take log backups to help truncate the log file and keep it manageable

Suggestions:

  • La taille initiale de 200 Mo est très inférieure. Selon la façon dont votre système est occupé et la fréquence à laquelle vous effectuez des sauvegardes de journaux (si votre base de données est en pleine récupération), je vous suggère de chercher à créer une taille initiale et une croissance automatique plus judicieux .
  • C'est toujours une bonne idée d'activer l'initialisation instantanée des fichiers pour aider aux événements de croissance automatique des fichiers de données (ainsi que la création et la restauration de la base de données). Reportez-vous à Défragmentation de la base de données et paramètres de croissance automatique réponse pour plus de détails.
6
Kin Shah

Tout d'abord, veuillez noter taille initiale n'est pas réellement ce que cela signifie. Oui, vous pouvez le faire, mais assurez-vous de ne pas utiliser l'interface graphique SSMS.

ALTER DATABASE [db_name] 
SET RECOVERY SIMPLE;

sp_helpdb db_name --get logical log file name

CHECKPOINT;

DBCC SHRINKFILE (db_name_log,0);

ALTER DATABASE [db_name]
MODIFY FILE (name=db_name_log,SIZE=240MB,MAXSIZE=UNLIMITED,FILEGROWTH=500MB);--dummy values change accordingly

ALTER DATABASE [db_name] 
SET RECOVERY FULL;

Vous pouvez lire cet article et utiliser les requêtes fournies pour calculer la valeur appropriée pour la taille de croissance automatique. Une taille initiale appropriée préallouerait l'espace et éviterait des croissances automatiques fréquentes qui ne sont pas de si bons événements

2
Shanky

Brent,

Votre approche dépendra du mode de récupération dans lequel se trouve la base de données.

Il s'agit de la référence MSDN DBCC SHRINKFILE pour votre version de SQL Server.

Pour les bases de données en mode de récupération SIMPLE, vous devriez pouvoir exécuter

    DBCC SHRINKFILE (N'<logical_file_name_of_the_log>'<Size In MB>)          

Cela devrait être tout ce qui est requis et la taille initiale devrait être réinitialisée à ce que vous venez de réduire le fichier.

Pour les bases de données qui sont en mode de récupération COMPLÈTE, vous avez deux options, car la commande de réduction ne réduira pas le fichier s'il existe des transactions qui n'ont pas été marquées comme sauvegardées.

La première consiste à effectuer une sauvegarde du journal des transactions qui marquera tous les éléments sauvegardés comme réutilisables. Après cela, vous pouvez exécuter la commande de réduction.

La seconde consiste à changer le mode de récupération en SIMPLE, puis à exécuter la commande de réduction et une fois que cela est terminé, changez le mode de récupération en FULL. (Avec cette approche, vous ne pourrez récupérer que votre sauvegarde complète plus récente la plus récente). Vous pouvez trouver les détails sur la façon de procéder dans le lien MSDN fourni.

Les deux options réinitialiseront également la taille initiale du fichier à ce que vous venez de réduire.

Une fois le fichier journal réduit, vous devrez configurer des sauvegardes régulières du journal des transactions pour l'empêcher de se développer à nouveau.

Dans tous les modes de récupération et les options de réduction du journal des transactions, préparez-vous à ce que tous les utilisateurs de la base de données rencontrent des erreurs lors de la réduction du fichier. SQL Server peut également échouer votre commande si les demandes de maintenance sont trop occupées. Si possible, programmez un temps d'arrêt et mettez la base de données en mode mono-utilisateur à l'aide des commandes

    use <database>
    Go
    alter database <database> set single_user with rollback immediate 
    Go
    DBCC SHRINKFILE (N'<logical_file_name_of_the_log>'<Size In MB>)
    Go
    alter database <database> set multi_user with rollback immediate
    Go

Cela vous permettra d'obtenir la réduction sans que d'autres instructions ne vous bloquent.

2
Aaron