Environnement de démo, réduire la taille des bases de données en mode Standalone

March 23, 2010

Il vous est peut être déjà arrivé de devoir migrer une machine virtuelle d’un serveur de développement vers un serveur démo, typiquement un laptop avec peu d’espace disque.

Pour gagner en place, il peut être intéressant de réduire la taille des bases de données. La commande DBCC SHRINKDATABASE (site technet) vient à notre secours !

Pour réduire au maximum la taille de votre base, utilisez la syntaxe ci dessous :

DBCC SHRINKDATABASE (nom_de_votre_base_de_contenu)

Et hop ! 2 Go gagné pour mon site d’équipe de démo.

Comment exécuter cette requête sur une installation en mode standalone ?

Lorsque vous installez SharePoint en mode Standalone (c’est souvent le cas pour les machines de démo), vous n’avez pas accès à Sql Management Studio… enfin presque. En effet, l’installation en mode Standalone utilise une version particulière de SQL Server, à savoir la version Windows Internal Database (anciennement Sql Server Embedded Edition). Cette dernière n’est accessible qu’en local et via les canaux nommés. Il est possible d’utiliser une chaine de connexion comme celle ci :

\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query

Cette chaine de connexion accèdera au serveur par canaux nommés, ce qui est l’unique possibilité ouverte par la version Windows Internal Database.

Avec cette chaine de connexion, vous devriez être en mesure d’administrer la base depuis Sql Management Studio.

Scripter la réduction de toutes les bases depuis la ligne de commande

Vous voudrez peut être scripter cette réduction depuis la ligne de commande. Soit parce que vous ne voulez pas installer les outils SQL sur une machine de démo, soit parce que vous souhaitez automatiser cette réduction (j’ai par exemple sur le bureau de ma machine un fichier .cmd que je lance avant de sauvegarder / dupliquer le ficher vhd pour réduire la taille de ce dernier).

Pour se faire, vous pouvez passer par l’utilitaire en ligne de commande sqlcmd. Ce dernier vous permet d’exécuter des requêtes depuis la ligne de commande. Par exemple, la commande suivante var réduire la taille de la base de contenu wss_content :

sqlcmd.exe -E -S \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query –Q "DBCC SHRINKDATABASE ( wss_content)" -c go

Enfin, la procédure stockée sp_MSforeachdb (qui n’est pas supportée par Microsoft, mais ce n’est pas un souci dans notre cas) permet d’exécuter une commande sur toutes les bases d’un serveur. Appliqué à notre besoin, la requête ressemblera à celle ci :

EXEC sp_MSforeachdb @command1=N'DBCC SHRINKDATABASE (?)', @replacechar='?'

Ou encore dans la version ligne de commande :

sqlcmd.exe -E -S \\.\pipe\mssql$microsoft##ssee\sql\query -Q "EXEC sp_MSforeachdb @command1=N'DBCC SHRINKDATABASE (?)', @replacechar='?'" -c go

Vous pouvez, comme moi, créer un fichier .cmd qui lancera cette commande à la demande avant copie de vhd, ou selon vos besoins, planifier la commande une fois par jour, etc.

Quid de la production ?

Vous pourriez être tenté de vouloir appliquer cette méthode sur un serveur de production, mais avant que les DBA soient sur votre dos, je vous rappelle qu’il est déconseillé d’utiliser cette approche en production. En effet, lorsque la base est pleine, SQL Server va interrompre les connexions en cours, puis augmenter la taille des fichiers de la base… ce qui a le double impact négatif de prendre du temps et de favoriser la fragmentation. Le sujet de l’article n’est pas de parler de la production donc je vous laisse chercher sur la toile ces best-practices !