Le Post Infeeny

Les articles des consultants et experts Infeeny

Comment réduire la taille de la base de données de TFS

Lorsque l’on est administrateur TFS (Team foundation server), il convient de s’assurer d’une bonne maintenance des bases de données TFS.

Je vous propose dans cet article quelques bonnes pratiques et la procédure pour réduire et optimiser la taille de la base de données de Team foundation server.

En effet, j’ai récemment été confronté à ce problème, la taille de la base étant de 23 Go elle était donc difficile de maintenir.

Voici les propriétés de la base Tfs_DefaultCollection:

Le principe est de supprimer tout ce qui est de type : workspace , shelvset,et builds, puis les résultats de test et enfin de libérer l’espace disponible à la fin.
Pour commencer nous allons supprimer les workspaces inutiles, les shelvest, les builds, et les éléments du contrôle de sources qui sont en état de suppression.

Nettoyage des workspaces

Au fil du temps plusieurs workspaces de développeurs peuvent s’accumuler, il faut donc les supprimer.
Pour ce faire, on utilise l’outil Team Foundation Sidekicks 2013, disponible ici (gratuit)
Cette outil permet de faire une recherche sur les noms des pc, utilisateurs, date, Puis de supprimer les workspaces sélectionnés.

Après suppression des worspaces inutiles

Nettoyage des Shelvset (Réservations en attente)

Comme pour les worspaces , il faut supprimer les anciens Shelvsets, avec l’outil Team Foundation Sidekicks 2013.
Leur suppression ne diminue pas la taille de la base, mais fait partie des taches de maintenances d’un administrateur TFS.

Supprimer les éléments en statut supprimé du contrôle de sources

Lorsqu’un élément du contrôle de sources est supprimé il ne l’est pas vraiment afin de permettre de le restaurer.
Pour le supprimer définitivement il faut utiliser la commande tf destroy qui fait partie des lignes de commandes de tfs
Plus d’info ici

Supprimer les informations des Builds

L’extension à VS 2013 TFS Build Manager possède plein de fonctionnalités, l’une d’entre elle est de pouvoir supprimer toutes les Informations de builds (répertoire de package et les informations en bdd) en fonction de critères de recherche et de filtres.

Un guide sur l’outil se trouve ici

Supprimer les tests attachements

Les tests attachements sont tous les résultats des tests unitaires exécuter dans les Builds.
Ces résultats sont conservés dans des fichiers qui sont stockés dans la base de données de tfs.
Ce sont ces résultats qui prennent une grande partie de l’espace occupé de la base.
Pour les nettoyer il faut:

  • les analyser et les identifier via des requêtes TSQL.
  • puis utiliser des outils d’administration pour les supprimer.

Analyse des éléments volumineux la base

Voici les étapes qui vont permettre d’identifier les éléments volumineux

Taille par bases de données

La requête ci-dessous renvoie la taille (en MB) des bases correspondantes aux collections

use master
select DB_NAME(database_id) AS DBName, (size/128) SizeInMB
FROM sys.master_files
where type=0 and substring(db_name(database_id),1,4)='Tfs_'
and DB_NAME(database_id)<>'Tfs_Configuration' order by size desc

Taille par table

Une fois la base la base à nettoyer détectée, voici la requête qui renvoie la taille de ses tables ordonnées par taille.

-- Table rows and data sizes
 CREATE TABLE #t ( [name] NVARCHAR(128), [rows] CHAR(11), reserved VARCHAR(18), data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18))</pre>
GO
 INSERT #t
 EXEC [sys].[sp_MSforeachtable] 'EXEC sp_spaceused ''?'''
 GO
SELECT
name as TableName,
Rows,
ROUND(CAST(REPLACE(reserved, ' KB', '') as float) / 1024,2) as ReservedMB,
ROUND(CAST(REPLACE(data, ' KB', '') as float) / 1024,2) as DataMB,
ROUND(CAST(REPLACE(index_size, ' KB', '') as float) / 1024,2) as IndexMB,
ROUND(CAST(REPLACE(unused, ' KB', '') as float) / 1024,2) as UnusedMB
FROM #t
ORDER BY CAST(REPLACE(reserved, ' KB', '') as float) DESC
GO
DROP TABLE #t
GO

Taille des attachements contents par projet

A partir de la requête précédente nous voyons bien que ce sont les AttachementContent qui prennent le plus de place.
La requête qui suit renvoie la taille des AttachementContent par projet

use Tfs_DefaultCollection
select p.projectname, sum(a.uncompressedlength)/1024/1024 as sizeInMBUncompressed, SUM(f.compressedlength)/1024/1024 as sizeInMBCompressed from dbo.tbl_Attachment as a
inner join tbl_File as f on a.TfsFileId=f.FileId
inner join tbl_testrun as tr on a.testrunid=tr.testrunid
inner join tbl_project as p on p.projectid=tr.projectid
group by p.projectname
order by sum(f.compressedlength) desc

Taille des Eléments des tests

Dans les AttachementContent il y a plusieurs catégories, la requête ci-dessous donne la taille de ces catégories

use Tfs_DefaultCollection
select  a.attachmenttype,
sum(f.compressedlength)/1024/1024 as sizeInMB from dbo.tbl_Attachment as a
inner join tbl_File as f on a.TfsFileId=f.FileId
inner join tbl_testrun as tr on a.testrunid=tr.testrunid
inner join tbl_project as p on p.projectid=tr.projectid
group by a.attachmenttype
order by sum(f.compressedlength) desc

Nous voyons bien que ce sont les résultats de tests qui sont important

Taille par extension

La requête qui suit renvoie la taille par extensions de fichiers

use Tfs_DefaultCollection
select  SUBSTRING(a.filename,
len(a.filename)-CHARINDEX(‘.’,REVERSE(a.filename))+2,999)as Extension,
sum(f.compressedlength)/1024 as SizeInKB from tbl_Attachment as a
inner join tbl_File as f on a.TfsFileId=f.fileid
group by SUBSTRING(a.filename,len(a.filename)-CHARINDEX(‘.’,REVERSE(a.filename))+2,999)
order by sum(f.compressedlength) desc

Taille par Mois

Et enfin voici la requête qui permet d’obtenir la taille des résultats de test par mois

USE Tfs_DefaultCollection
SELECT
DATEADD(month,DATEDIFF(month,0,creationdate),0) as [Month],
SUM(UncompressedLength) / 1024 / 1024 as AttachmentSizeMB
FROM tbl_Attachment WITH (nolock)
GROUP BY DATEADD(month,DATEDIFF(month,0,creationdate),0)
ORDER BY DATEADD(month,DATEDIFF(month,0,creationdate),0)

La suppression de ces éléments

En utilisant l’extension de VS TFS adminsitration toolkit qui contient l’outil « Test Attachement Cleaner »

Disponible dans la gallerie visual studio

Une fois lancé, il faut choisir le projet, sélectionner la configuration à utiliser puis cliquez sur le bouton « Start Clean ».
Cet outil (TAC) a été intégré au TFS power tools (en ligne de commande).
Que ce soit avec TFS adminsitration toolkit ou avec les power tools il se base sur un fichier de configuration qui indique quel sont les éléments à supprimer.
Le détail de son exécution peut enregistrer dans un fichier de log et peut être aussi exécuté en mode preview.

Le fichier de configuration (setting)

Voici un exemple de fichier de configuration qui supprimer tous les tests attachements depuis le 05/11/2011 et pour toutes les extensions de fichiers de test.

<!-- Scenario: Suppression des attachements depuis 2011 pour toutes les extensions -->
<DeletionCriteria>
<TestRun>
<Created After="2011-05-30" />
</TestRun>
<Attachment>
<Extensions>
<Include value="tr_" />
<Include value="trx" /> <!-- pour tfs 2013-->
<Include value="dll" />
<Include value="pdb" />
<Include value="itrace" />
<Include value="sdf" />
<Include value="log" />
<Include value="coverage" />
<Include value="config" />
<Include value="db" />
<Include value="exe" />
</Extensions>
</Attachment>
</DeletionCriteria>

D’autres exemples de configurations sont fournis avec l’outil.

Lancement du programme dans un cmd

Voici un exemple de son exécution en ligne de commande dans un fichier bat

On peut aussi générer la ligne de commande en cliquant sur le bouton « Open command.. »

D:\Test_Attachment_Cleaner\tcmpt.exe attachmentcleanup /collection:http://serveur/tfs/geode /teamproject:"projecttest" /settingsfile:"D:\Test_Attachment_Cleaner\ConfigAll.xml" /mode:"delete" /outputfile:"D:\Test_Attachment_Cleaner\Logs\%date:~0,2%-%date:~3,2%-%date:~6,4%-%time:~0,2%-%time:~3,2%-%time:~6,2%.txt"

La durée de son exécution peut prendre du temps selon la volumétrie de la base de données.
Une fois ce fichier batch testé, nous pouvons le planifier dans le planificateur de tache afin que régulièrement il nettoie les tests attachements.

  • La libération de l’espace disque disponible

    Toutes les manipulations que nous avons vu dans cet article a bien supprimer des éléments de la base de données, cependant la libération de l’espace libre disponible ne pourra se faire qu’après avoir fait un Shrink (réduction) et mise à jour des statistique de la base de données.
    Voici le script SQL qui fait le shrink et la mise à jour des stat

    USE [Tfs_DefaultCollection]
    GO
    DBCC SHRINKFILE (N'Tfs_DefaultCollection' , 0, TRUNCATEONLY)
    GO
    DBCC SHRINKFILE (N'Tfs_DefaultCollection_log' , 0, TRUNCATEONLY)
    GO
    DBCC SHRINKDATABASE(N'Tfs_DefaultCollection' )
    GO
    EXEC sp_MSforeachtable @command1="print '?'
    DBCC DBREINDEX ('?', ' ', 80)"
    GO
    EXEC sp_updatestats
    

    Ce script peut très bien être mis dans un job de maintenance SQL Server, mais son exécution ne doit pas être faite trop régulièrement car cela peut altérer les performances de la base de données.

    Voilà à la fin de toutes ces étapes je suis parvenue à réduire la base de données à 3 Go ce qui va permettre :

  • Une meilleur maintenabilité (backup, restauration, …)
  • Des meilleures performances

Mais comme pour un administrateur système, ce travail d’administrateur TFS doit se faire au quotidien.

Ressource:
http://blogs.msdn.com/b/granth/archive/2011/02/12/tfs2010-test-attachment-cleaner-and-why-you-should-be-using-it.aspx

http://geekswithblogs.net/terje/archive/2011/11/15/guide-to-reduce-tfs-database-growth-using-the-test-attachment.aspx

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :