Supprimer les dossiers résiduels SQL Server (binn, DATA, Log) après désinstallation : guide complet Windows

Après la désinstallation de Microsoft SQL Server, Windows peut refuser de supprimer les dossiers binn, DATA et Log à cause de verrous de fichiers ou de droits insuffisants. Ce guide pratique détaille des méthodes fiables (CMD et PowerShell) pour un nettoyage complet et sans dégâts.

Sommaire

Vue d’ensemble

Il n’est pas rare qu’après une désinstallation de SQL Server, des reliquats demeurent sur le disque. Les cas les plus fréquents : fichiers encore utilisés par un service oublié, droits NTFS détenus par un compte de service, attributs système/lecture seule ou une instance partielle restée installée. Vous trouverez ci‑dessous une procédure « express » puis une procédure détaillée, des scripts prêts à l’emploi, des check‑lists et des réponses aux erreurs les plus courantes.

Où se cachent généralement ces dossiers ?

  • C:\Program Files\Microsoft SQL Server\<Instance>\MSSQL\Binn
  • C:\Program Files\Microsoft SQL Server\<Instance>\MSSQL\DATA
  • C:\Program Files\Microsoft SQL Server\<Instance>\MSSQL\Log
  • Et selon la version/architecture :
    • C:\Program Files (x86)\Microsoft SQL Server\ (composants 32 bits)
    • C:\ProgramData\Microsoft\SQL Server\ (données d’application)

Les noms d’instance typiques ressemblent à MSSQL15.MSSQLSERVER (instance par défaut) ou MSSQL15.<NomInstance> pour une instance nommée.

Procédure express (résumé)

  1. Arrêtez tous les services SQL (SQL Server, Agent, Browser, VSS Writer, SSIS/SSRS/SSAS le cas échéant).
  2. Ouvrez un Invite de commandes Administrateur (ou PowerShell Admin).
  3. Prendre la propriété + attribuer les droits au dossier parent.
  4. Supprimer les dossiers binn, DATA, Log.
  5. Si blocage : Mode sans échec, ou identifiez le processus verrouillant et fermez‑le.
  6. Nettoyage additionnel (registre, PATH, services orphelins) puis redémarrage.

Tableau récapitulatif des actions

ÉtapeActionDétails / commandes utiles
Arrêter tous les services SQL restantsVia services.msc ou Gestionnaire des tâches : SQL Server (MSSQLSERVER ou MSSQL$Nom), SQL Server Agent, SQL Browser, SQL Writer, SSIS (MsDtsServer), SSRS, SSAS, Full‑Text (MSSQLFDLauncher), télémétrie/CEIP.sc query type= service state= all | findstr /I "SQL" net stop MSSQLSERVER net stop SQLSERVERAGENT net stop SQLBrowser net stop SQLWriter taskkill /f /im sqlservr.exe taskkill /f /im fdlauncher.exe
Ouvrir un invite de commandes AdministrateurRechercher « cmd », clic droit → Exécuter en tant qu’administrateur (ou PowerShell en admin).Les opérations sur les dossiers système requièrent l’élévation.
Se placer dans le répertoire parentAccéder au conteneur principal avant suppression.cd /d "C:\Program Files\Microsoft SQL Server"
Supprimer les dossiersSuppression récursive et silencieuse.rmdir /s /q "MSSQL15.MSSQLSERVER\MSSQL\Binn" rmdir /s /q "MSSQL15.MSSQLSERVER\MSSQL\DATA" rmdir /s /q "MSSQL15.MSSQLSERVER\MSSQL\Log"
Si refus d’accèsPrendre la propriété et forcer les droits. Redémarrer en Mode sans échec si besoin. Identifier et fermer le processus verrouillant (Process Explorer/Handle).takeown /f "C:\Program Files\Microsoft SQL Server" /r /d y icacls "C:\Program Files\Microsoft SQL Server" /grant Administrators:F /t attrib -R -S -H "C:\Program Files\Microsoft SQL Server" /S /D
Nettoyage additionnelRelancer le setup.exe de SQL Server en mode Remove. Purger les clés orphelines et le PATH.regedit (avec prudence) sysdm.cpl (Variables d’environnement → PATH)
RedémarrerValider qu’aucun service SQL ne réapparaît, et que les dossiers ne sont pas recréés.Contrôlez services.msc et l’Explorateur.

Procédure détaillée pas à pas

1. Arrêter et supprimer les services résiduels

Commencez par geler toute activité autour de SQL Server. Un service encore démarré garde des poignées (handles) ouvertes sur binn, DATA ou Log.

REM — Lister les services contenant "SQL"
sc query type= service state= all | findstr /I "SQL"

REM — Arrêter les plus courants
net stop MSSQLSERVER
net stop SQLSERVERAGENT
net stop SQLBrowser
net stop SQLWriter
net stop MsDtsServer150
net stop SQLTELEMETRY*  (selon version)
net stop MSSQLFDLauncher*

REM — (Option) Supprimer un service orphelin
sc delete MSSQLSERVER
sc delete MSSQL$MONINSTANCE
sc delete SQLSERVERAGENT 

Astuces :

  • Si un net stop échoue, forcez la fin de processus : taskkill /f /im sqlservr.exe.
  • Vérifiez qu’aucun client ne pointe encore sur l’instance (applications, services tiers, tâches planifiées).

2. Ouvrir une console élevée et nettoyer les attributs

Beaucoup d’échecs viennent d’attributs système ou lecture seule. Nettoyez‑les avant la suppression.

attrib -R -S -H "C:\Program Files\Microsoft SQL Server" /S /D

3. Prendre la propriété et donner les droits complets

Les dossiers peuvent appartenir au compte de service (NT Service\MSSQLSERVER) ou SYSTEM. Reprenez la main :

takeown /f "C:\Program Files\Microsoft SQL Server" /r /d y
icacls "C:\Program Files\Microsoft SQL Server" /grant Administrators:F /t

Si votre instance était sur un autre volume (ex. D:\SQLData), répétez les mêmes commandes sur ce chemin.

4. Supprimer les dossiers binn, DATA, Log

Ensuite, lancez la suppression récursive :

rmdir /s /q "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn"
rmdir /s /q "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA"
rmdir /s /q "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log"

Variante PowerShell :

Remove-Item "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log"  -Recurse -Force -ErrorAction SilentlyContinue

5. Si « Accès refusé » ou « Fichier utilisé » persiste

Plusieurs leviers complémentaires :

  • Mode sans échec : redémarrez Windows en mode minimal pour empêcher les services SQL résiduels de se lancer, puis rejouez les étapes 3–4.
  • Identifier le verrou : utilisez un utilitaire de type Process Explorer ou handle.exe pour trouver le processus tenant le verrou sur un fichier .mdf, .ldf ou un binaire de binn. Fermez ce processus proprement et réessayez.
  • Session SYSTEM avancée (administrateurs expérimentés) : si nécessaire, exécutez une console en compte SYSTEM et supprimez depuis cette session. À réserver aux cas bloquants.
  • Renommage différé : renommez le dossier en *.old, redémarrez puis supprimez. Cela contourne certains locks tenaces.

6. Nettoyage additionnel (facultatif mais recommandé)

Assurez‑vous que rien ne recrée ces dossiers.

  • Désinstallation complète via setup : relancez le setup.exe de la même version de SQL Server, choisissez Remove et cochez toutes les fonctionnalités restantes (Moteur de base de données, SSIS, SSRS, SSAS, Outils).
  • Registre (précaution) : inspectez et supprimez les clés orphelines uniquement si vous êtes sûr de vous :
    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
    • HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server
    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQL* (services résiduels)
    Pensez à exporter les clés avant suppression.
  • PATH système : supprimez les chemins SQL résiduels (...\Tools\Binn, ...\DTS\Binn, ...\Client SDK\ODBC\...\Binn) dans Variables d’environnement.
  • Tâches planifiées : purgez d’éventuelles tâches (SQLTelemetry, sauvegardes, maintenance) pointant vers l’ancienne instance.
  • ProgramData & Logs : si besoin, videz C:\ProgramData\Microsoft\SQL Server après sauvegarde.

Scripts prêts à l’emploi

CMD : nettoyage robuste

@echo off
setlocal enabledelayedexpansion

REM === 1) Arrêt de services SQL communs ===
for %%S in (MSSQLSERVER SQLSERVERAGENT SQLBrowser SQLWriter MsDtsServer150 MSSQLFDLauncher SQLTELEMETRY) do (
sc query "%%S" | findstr /I RUNNING >nul && net stop "%%S" /y
)

REM === 2) Tuer les binaires SQL au besoin ===
for %%P in (sqlservr.exe fdlauncher.exe msdtssrvr.exe ReportingServicesService.exe) do (
taskkill /f /im "%%P" 2>nul
)

REM === 3) Prendre la propriété + droits sur les répertoires clés ===
for %%D in (
"C:\Program Files\Microsoft SQL Server"
"C:\Program Files (x86)\Microsoft SQL Server"
"C:\ProgramData\Microsoft\SQL Server"
"D:\SQLData"
"D:\SQLLogs"
) do (
if exist %%D (
attrib -R -S -H %%D /S /D
takeown /f %%D /r /d y
icacls %%D /grant Administrators:F /t
)
)

REM === 4) Supprimer les dossiers ciblés ===
for %%F in (
"C:\Program Files\Microsoft SQL Server\MSSQL*\MSSQL\Binn"
"C:\Program Files\Microsoft SQL Server\MSSQL*\MSSQL\DATA"
"C:\Program Files\Microsoft SQL Server\MSSQL*\MSSQL\Log"
) do (
if exist %%F rmdir /s /q %%F
)

echo Terminé. Pensez à vérifier le PATH et les services orphelins. 

PowerShell : suppression ciblée et sûre

Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'

# 1) Services SQL typiques

$svcNames = @(
'MSSQLSERVER','SQLSERVERAGENT','SQLBrowser','SQLWriter',
'MsDtsServer150','MSSQLFDLauncher','SQLTELEMETRY'
)
foreach ($s in $svcNames) {
try {
$svc = Get-Service -Name $s -ErrorAction Stop
if ($svc.Status -eq 'Running') { Stop-Service -Name $s -Force -ErrorAction SilentlyContinue }
} catch {}
}

# 2) Processus récalcitrants

'sqlservr','fdlauncher','msdtssrvr','ReportingServicesService' | ForEach-Object {
Get-Process -Name $_ -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
}

# 3) Cibles

$targets = @(
'C:\Program Files\Microsoft SQL Server',
'C:\Program Files (x86)\Microsoft SQL Server',
'C:\ProgramData\Microsoft\SQL Server'
)

# 4) Prendre possession + droits + suppression ciblée

foreach ($t in $targets) {
if (Test-Path $t) {
& attrib -R -S -H $t /S /D | Out-Null
& takeown /f $t /r /d y      | Out-Null
& icacls $t /grant Administrators:F /t | Out-Null
}
}

# 5) Dossiers binn/DATA/Log uniquement

Get-ChildItem 'C:\Program Files\Microsoft SQL Server' -Recurse -Directory -ErrorAction SilentlyContinue |
Where-Object { $*.Name -in @('Binn','DATA','Log') } |
ForEach-Object { Remove-Item $*.FullName -Recurse -Force -ErrorAction SilentlyContinue }

Write-Host 'Nettoyage SQL terminé. Vérifiez PATH et registre si nécessaire.' 

Erreurs fréquentes et solutions

MessageCause probableSolution
Accès refusé / You require permission from SYSTEMDroits NTFS détenus par SYSTEM ou compte de service SQLtakeown + icacls sur le dossier parent, puis nouvelle tentative
The action can’t be completed because the file is open in SQL Server Windows NTUn processus garde un handle ouvertArrêter service, taskkill /f et/ou identifier le handle avec un utilitaire d’analyse
Le dossier n’est pas videFichiers cachés/système, flux alternatifs (rare)attrib -R -S -H /S /D puis rmdir /s /q
Impossible de supprimer le point de jonctionReparse point (jonction NTFS)fsutil reparsepoint query <chemin> puis suppression depuis la racine réelle
Setup blocked ou échec de désinstallationComposant partiellement installéRelancer setup.exeRemove, supprimer services restants avec sc delete

Cas particuliers et bonnes pratiques

Instances nommées et chemins non standard

Adaptez tous les chemins à votre instance (ex. MSSQL15.MARKETING). Si vos données/logs étaient sur un autre volume (D:\SQLData, E:\SQLLogs), exécutez takeown, icacls et rmdir également sur ces emplacements.

Composants optionnels

  • SSRS/SSIS/SSAS ont leurs propres services et dossiers (\Reporting Services, \MSAS, \DTS). N’oubliez pas de les arrêter/supprimer.
  • Full‑Text (FDLauncher) peut empêcher la suppression du dossier binn.

Clusters (WSFC) et machines de production

Sur un cluster de basculement, passez le rôle hors connexion sur le nœud concerné et désinstallez les fonctionnalités via l’installateur. Évitez toute suppression manuelle tant que la ressource cluster n’est pas retirée.

Édition du registre et du PATH : prudence

Le nettoyage manuel du registre est réservé aux utilisateurs avertis. Créez une sauvegarde avant modification. Côté PATH, supprimez uniquement les entrées pointant vers des dossiers SQL supprimés (ex. ...\150\Tools\Binn ou ...\DTS\Binn).

Checklist de validation

  • Plus aucun service SQL présent dans services.msc (ou marqués Absent/Failed après sc query).
  • Les dossiers binn, DATA, Log ne sont plus visibles dans les emplacements d’origine.
  • Plus de binaire SQL dans le PATH système (tester sqlcmd -? ou sqlservr -? → devrait échouer).
  • Redémarrage effectué sans recréation automatique de dossiers.
  • Event Viewer exempt d’erreurs liées à SQL au démarrage.

FAQ rapide

Puis‑je supprimer sans risque les fichiers .mdf/.ldf ?
Oui si vous êtes certain de ne plus avoir besoin des bases. Effectuez des sauvegardes avant toute suppression définitive.

Faut‑il supprimer C:\ProgramData\Package Cache ?
Évitez tant que possible : ce cache est utilisé par l’installateur pour réparer/désinstaller. Après nettoyage complet, laissez‑le tranquille sauf contrainte d’espace disque.

Et les Redistribuables Visual C++ ?
Ils sont partagés par d’autres applications : ne les désinstallez pas uniquement parce que SQL Server n’est plus présent.

La désinstallation a échoué. Réinstaller puis désinstaller ?
Oui, réinstaller la même version par‑dessus puis exécuter Remove peut remettre les composants dans un état cohérent et débloquer la suppression.

Exemples de commandes utiles (mémo)

Découverte des services

sc query type= service state= all | findstr /I "MSSQL SQLServer SQLBrowser SQLWriter SSRS SSIS SSAS FDLauncher"
Get-Service *SQL* | Sort-Object Status, Name

Contrôle des ports et connexions

netstat -ab -n | findstr /R /C:":1433 " /C:":1434 "

Nettoyage du PATH avec PowerShell

$paths  = [Environment]::GetEnvironmentVariable('Path','Machine') -split ';'
$filtered = $paths | Where-Object { $_ -and ($_ -notmatch 'Microsoft SQL Server') }
[Environment]::SetEnvironmentVariable('Path', ($filtered -join ';'), 'Machine')

Bonnes pratiques pour l’avenir

  • Volumes dédiés : placez DATA/Log sur des volumes séparés (D:\/E:\). Le nettoyage est plus simple et limite les risques.
  • Arrêt propre : arrêtez l’instance et l’Agent avant la désinstallation.
  • Inventaire : documentez les services et tâches planifiées liés à SQL afin d’éviter les orphelins.

Conclusion

En combinant l’arrêt complet des services, la reprise de propriété (takeown) et l’attribution des droits (icacls), puis la suppression en mode administrateur (ou sans échec), vous pouvez éliminer sans douleur les dossiers binn, DATA et Log laissés par SQL Server. Ajoutez un passage de vérification (registre, PATH, services) et un redémarrage : votre machine redevient propre, prête pour une réinstallation nette ou un autre usage.

Annexe : procédure guidée détaillée (copiable pas‑à‑pas)

  1. Stopper les services : services.msc → arrêter SQL Server (MSSQLSERVER ou MSSQL$Nom), SQL Server Agent, SQL Browser, SQL Writer, SSIS, SSRS, SSAS, Full‑Text. En cas d’échec : taskkill /f /im sqlservr.exe.
  2. Élever la console : cmd.exe ou PowerShell en tant qu’administrateur.
  3. Nettoyer attributs : attrib -R -S -H "C:\Program Files\Microsoft SQL Server" /S /D.
  4. Prendre la propriété : takeown /f "C:\Program Files\Microsoft SQL Server" /r /d y.
  5. Donner droits : icacls "C:\Program Files\Microsoft SQL Server" /grant Administrators:F /t.
  6. Supprimer les répertoires : rmdir /s /q "...\MSSQL\Binn" rmdir /s /q "...\MSSQL\DATA" rmdir /s /q "...\MSSQL\Log"
  7. Si blocage : redémarrer en Mode sans échec puis répéter les deux dernières étapes, ou trouver le verrou avec un utilitaire adapté.
  8. Nettoyage final : setup.exe → Remove, purge des clés orphelines (regedit) et du PATH (variables d’environnement).
  9. Redémarrage : vérifier qu’aucun service/dossier ne réapparaît.

Rappels essentiels

  • Sauvegardes : les dossiers DATA et Log contiennent vos bases (.mdf, .ldf). Ne les supprimez qu’en connaissance de cause.
  • Réinstallation propre : si la suppression reste impossible, installez brièvement la même version de SQL Server puis exécutez une désinstallation complète.
  • Outils tiers : des utilitaires « unlocker » existent, mais takeown + icacls couplés à l’arrêt des services couvrent déjà l’immense majorité des cas.
Sommaire