SQL Server Express : installation et sauvegardes auto

SQL Server Express : installation et sauvegardes auto

Installez SQL Server Express gratuit sur votre VPS Windows, sécurisez-le et automatisez les sauvegardes. La version Express est limitée mais suffit pour la majorité des apps métiers (10 Go par base, 1 Go RAM utilisable, 4 cores).

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 :

  1. Basic : installation simple (recommandé pour démarrer)
  2. Custom : installation avancée avec choix des composants
  3. 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 :

  1. Clic droit sur le serveur (racine de l'arborescence) → Properties
  2. SecuritySQL Server and Windows Authentication mode
  3. OK

Activez le compte sa :

  1. Security → Logins → sa → Properties
  2. General : définissez un mot de passe fort
  3. 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
  1. SQL Server Network Configuration → Protocols for SQLEXPRESS
  2. TCP/IP → Enabled : Yes
  3. Clic droit TCP/IP → Properties → IP Addresses
  4. Tout en bas, IPAll → TCP Port : 1433
  5. OK
  6. 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 :

FeatureExpressStandard
Taille DB10 Go524 PB
RAM buffer pool1.4 Go128 Go
CPU4 cores24 cores
SQL Agent
Always On✅ (partiel)
Replication
PrixGratuit~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

Rejoignez notre serveur communautaire Discord

Pour toute question, suggestion ou simplement pour discuter avec la communauté, rejoignez-nous sur Discord !

900+Membres