Introduction
SQL Server Express est l'édition gratuite de SQL Server par Microsoft. Limitations :
- 10 Go max par base de données
- 1410 Mo de RAM utilisée pour le buffer pool
- 4 cores CPU max
- Pas de SQL Server Agent (jobs auto)
Mais pour beaucoup d'apps Windows (.NET, ERP métier, petits ETL), ça suffit largement. Et c'est gratuit en production sans licence.
Prérequis
- Windows Server 2019 / 2022 / 2025
- Au moins 4 Go RAM
- 5 Go d'espace pour l'installation + espace pour vos données
- Accès admin
Étape 1 : Télécharger SQL Server Express
Téléchargez la dernière version (SQL Server 2022 Express) :
# Téléchargement direct
$url = "https://go.microsoft.com/fwlink/p/?linkid=2216019"
Invoke-WebRequest -Uri $url -OutFile "C:\Temp\SQL2022-SSEI-Expr.exe"
Ou via le site : https://www.microsoft.com/en-us/sql-server/sql-server-downloads
Étape 2 : Installation
cd C:\Temp
.\SQL2022-SSEI-Expr.exe
Dans l'assistant :
- Basic : installation simple (recommandé pour démarrer)
- Custom : installation avancée avec choix des composants
- Download Media : télécharge l'ISO pour install offline ou sur d'autres serveurs
Cliquez Basic → Accept → Install.
L'installation prend ~10 minutes.
Étape 3 : Notez la chaîne de connexion
À la fin, l'installeur affiche :
Instance name: SQLEXPRESS
Connection string: Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;
Notez-la. Vous en aurez besoin pour vos apps.
Étape 4 : Installer SQL Server Management Studio (SSMS)
Pour gérer SQL Server visuellement :
$ssmsUrl = "https://aka.ms/ssmsfullsetup"
Invoke-WebRequest -Uri $ssmsUrl -OutFile "C:\Temp\SSMS-Setup-ENU.exe"
Start-Process "C:\Temp\SSMS-Setup-ENU.exe" -ArgumentList "/install /quiet /norestart" -Wait
Lancez SQL Server Management Studio depuis le menu Démarrer.
Étape 5 : Première connexion
Dans SSMS, à l'écran de connexion :
- Server name :
localhost\SQLEXPRESS - Authentication : Windows Authentication
- Connect
Vous accédez à l'arborescence : Databases, Security, Server Objects, etc.
Étape 6 : Activer l'authentification SQL (mixed mode)
Par défaut SQL Express utilise Windows Authentication uniquement. Pour permettre des logins SQL :
- Clic droit sur le serveur (racine de l'arborescence) → Properties
- Security → SQL Server and Windows Authentication mode
- OK
Activez le compte sa :
- Security → Logins → sa → Properties
- General : définissez un mot de passe fort
- Status : Login Enabled
Redémarrez le service :
Restart-Service -Name "MSSQL`$SQLEXPRESS"
Étape 7 : Créer une base de données
Via SSMS (GUI)
Clic droit sur Databases → New Database → nom : MyApp → OK.
Via SQL
CREATE DATABASE MyApp
ON PRIMARY (
NAME = 'MyApp_data',
FILENAME = 'D:\SQLData\MyApp.mdf',
SIZE = 100MB,
MAXSIZE = 10GB,
FILEGROWTH = 100MB
)
LOG ON (
NAME = 'MyApp_log',
FILENAME = 'D:\SQLLogs\MyApp.ldf',
SIZE = 50MB,
MAXSIZE = 1GB,
FILEGROWTH = 50MB
);
⚠️ Mettez data et logs sur disques séparés si possible (perf I/O).
Étape 8 : Créer un user dédié à l'app
Évitez d'utiliser sa depuis votre app.
-- Créer le login
USE master;
CREATE LOGIN myapp_user WITH PASSWORD = 'UnMotDePasseFort_2024!';
-- Donner accès à la base
USE MyApp;
CREATE USER myapp_user FOR LOGIN myapp_user;
-- Permissions
ALTER ROLE db_datareader ADD MEMBER myapp_user;
ALTER ROLE db_datawriter ADD MEMBER myapp_user;
-- Pour DDL (CREATE TABLE, etc.) :
-- ALTER ROLE db_ddladmin ADD MEMBER myapp_user;
Chaîne de connexion .NET :
Server=localhost\SQLEXPRESS;Database=MyApp;User Id=myapp_user;Password=UnMotDePasseFort_2024!;TrustServerCertificate=True;
Étape 9 : Activer TCP/IP (pour connexions distantes)
Par défaut SQL Express n'écoute que sur named pipes (local).
# Ouvrir SQL Server Configuration Manager
SQLServerManager16.msc # SQL 2022, adaptez selon version
- SQL Server Network Configuration → Protocols for SQLEXPRESS
- TCP/IP → Enabled : Yes
- Clic droit TCP/IP → Properties → IP Addresses
- Tout en bas, IPAll → TCP Port : 1433
- OK
- Redémarrer le service :
Restart-Service -Name "MSSQL`$SQLEXPRESS"
Ouvrez le firewall :
New-NetFirewallRule -DisplayName "SQL Server" -Direction Inbound -Protocol TCP -LocalPort 1433 -Action Allow
⚠️ Si SQL est exposé, restreignez aux IPs autorisées :
New-NetFirewallRule -DisplayName "SQL Server" -Direction Inbound -Protocol TCP -LocalPort 1433 -RemoteAddress "10.0.0.0/24" -Action Allow
Étape 10 : Backup automatique
SQL Express n'a pas de SQL Server Agent. On utilise les Tâches planifiées Windows.
Script de backup PowerShell
# C:\Scripts\backup-sql.ps1
$Server = "localhost\SQLEXPRESS"
$BackupDir = "D:\Backups\SQL"
$Date = Get-Date -Format "yyyy-MM-dd_HHmm"
$Retention = 14 # jours
if (-not (Test-Path $BackupDir)) {
New-Item -ItemType Directory -Path $BackupDir | Out-Null
}
# Backup de toutes les bases user (skip system)
$Databases = Invoke-Sqlcmd -ServerInstance $Server -Query @"
SELECT name FROM sys.databases
WHERE database_id > 4
AND state_desc = 'ONLINE'
"@
foreach ($db in $Databases) {
$DbName = $db.name
$BackupFile = "$BackupDir\$DbName`_$Date.bak"
Write-Host "Backup de $DbName..."
Invoke-Sqlcmd -ServerInstance $Server -Query @"
BACKUP DATABASE [$DbName]
TO DISK = '$BackupFile'
WITH FORMAT, COMPRESSION, INIT, STATS = 10
"@ -QueryTimeout 3600
}
# Rotation
Get-ChildItem -Path $BackupDir -Filter "*.bak" |
Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$Retention) } |
Remove-Item -Force
Write-Host "Backup terminé. Fichiers dans $BackupDir"
⚠️ Installez le module Sqlcmd si nécessaire :
Install-Module -Name SqlServer -Scope AllUsers -Force
Planifier en tâche Windows
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\backup-sql.ps1"
$Trigger = New-ScheduledTaskTrigger -Daily -At 2am
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
$Principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName "SQL Backup Daily" `
-Action $Action -Trigger $Trigger -Settings $Settings -Principal $Principal
Vérifiez :
Get-ScheduledTask -TaskName "SQL Backup Daily" | Get-ScheduledTaskInfo
Étape 11 : Tester la restauration
Un backup non testé n'existe pas.
-- Restaurer dans une nouvelle base pour tester
RESTORE DATABASE MyApp_test
FROM DISK = 'D:\Backups\SQL\MyApp_2026-05-16_0200.bak'
WITH MOVE 'MyApp_data' TO 'D:\SQLData\MyApp_test.mdf',
MOVE 'MyApp_log' TO 'D:\SQLLogs\MyApp_test.ldf',
REPLACE, STATS = 10;
Étape 12 : Synchroniser les backups hors site
Les backups sur le même VPS ne protègent pas contre la perte du serveur. Synchronisez vers du stockage externe.
Vers Backblaze B2 avec rclone
# Installer rclone
choco install rclone -y
# ou télécharger : https://rclone.org/downloads/
# Configurer
rclone config
# n → b2 → nom : b2-sql → entrez vos credentials Backblaze
# Sync quotidien (à intégrer dans le script de backup)
rclone sync "D:\Backups\SQL" "b2-sql:verycloud-sql-backups/" --transfers 4
Vers OneDrive / Azure Blob
Idem, rclone supporte 70+ providers.
Étape 13 : Maintenance régulière
Mise à jour des statistiques
USE MyApp;
EXEC sp_updatestats;
Rebuild des index fragmentés
USE MyApp;
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql = @sql + 'ALTER INDEX ' + QUOTENAME(i.name) +
' ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) +
' REBUILD;' + CHAR(13)
FROM sys.indexes i
JOIN sys.objects o ON i.object_id = o.object_id
JOIN sys.schemas s ON o.schema_id = s.schema_id
JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ps
ON i.object_id = ps.object_id AND i.index_id = ps.index_id
WHERE ps.avg_fragmentation_in_percent > 30
AND o.type = 'U';
EXEC sp_executesql @sql;
À planifier en tâche hebdomadaire.
Shrink (à éviter sauf cas critique)
DBCC SHRINKDATABASE (MyApp, 10);
⚠️ Provoque fragmentation. À utiliser uniquement après une grosse purge de données.
Dépannage
"Cannot connect to localhost\SQLEXPRESS"
Get-Service -Name "MSSQL`$SQLEXPRESS"
Start-Service -Name "MSSQL`$SQLEXPRESS"
Vérifiez aussi le SQL Server Browser :
Set-Service -Name "SQLBrowser" -StartupType Automatic
Start-Service -Name "SQLBrowser"
"Database is at capacity (10 GB limit)"
Vous avez atteint la limite Express. Solutions :
- Purger les données anciennes
- Migrer vers SQL Server Standard (payant)
- Migrer vers PostgreSQL (gratuit, sans limite)
Backup échoue avec "Access denied"
Le compte SQL Server n'a pas les droits sur le dossier de backup :
icacls "D:\Backups\SQL" /grant "NT SERVICE\MSSQL`$SQLEXPRESS:(OI)(CI)F"
Performances dégradées
Vérifiez :
- Le buffer pool est-il saturé ?
SELECT * FROM sys.dm_os_performance_counters WHERE counter_name = 'Buffer cache hit ratio'; - Index manquants ? Outil Database Engine Tuning Advisor dans SSMS
Commandes utiles
-- Version
SELECT @@VERSION;
-- Bases de données et tailles
SELECT name,
SUM(size * 8 / 1024) AS Size_MB
FROM sys.master_files
WHERE database_id > 4
GROUP BY name;
-- Sessions actives
SELECT session_id, login_name, host_name, program_name, status
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;
-- Top des requêtes lentes
SELECT TOP 10
qs.execution_count,
qs.total_elapsed_time / 1000 / qs.execution_count AS avg_ms,
SUBSTRING(qt.text, qs.statement_start_offset/2+1,
(CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2 + 1) AS query
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY avg_ms DESC;
-- Tuer une session
KILL <session_id>;
# Statut service
Get-Service -Name "MSSQL`$SQLEXPRESS"
# Restart
Restart-Service -Name "MSSQL`$SQLEXPRESS"
# Logs SQL Server
Get-Content "C:\Program Files\Microsoft SQL Server\MSSQL16.SQLEXPRESS\MSSQL\Log\ERRORLOG"
Conclusion
SQL Server Express est parfait pour :
- Petites apps métier (.NET)
- Bases < 10 Go
- Dev / test
- Apps héritées qui exigent SQL Server
Limites de SQL Express vs Standard :
| Feature | Express | Standard |
|---|---|---|
| Taille DB | 10 Go | 524 PB |
| RAM buffer pool | 1.4 Go | 128 Go |
| CPU | 4 cores | 24 cores |
| SQL Agent | ❌ | ✅ |
| Always On | ❌ | ✅ (partiel) |
| Replication | ❌ | ✅ |
| Prix | Gratuit | ~3500 €/core |
Pour aller plus loin :
- Migrez vers PostgreSQL si vous voulez gratuit + illimité
- Passez à SQL Server Standard si vous avez besoin de SQL Agent et > 10 Go
- Envisagez Azure SQL Database pour du cloud-native géré
Ressources
- Documentation officielle : https://learn.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-version-15
- SSMS Download : https://aka.ms/ssmsfullsetup
- Tuto VeryCloud — PowerShell Remoting :
/docs/article/winrm - Tuto VeryCloud — Tâches planifiées :
/docs/article/task-scheduler


















