SQLite : sauvegarde et maintenance
Un fichier SQLite se sauvegarde en le copiant, à condition qu’aucune écriture ne soit en cours. Pour une base utilisée, la copie à chaud doit passer par SQLite. Les exemples utilisent boutique.db.
Sauvegarde à chaud : .backup
Section intitulée « Sauvegarde à chaud : .backup »sqlite3 boutique.db ".backup 'sauvegarde.db'"sqlite3 boutique.db ".backup 'sauvegarde-$(date +%F).db'".backup produit une copie cohérente même si l’application continue d’écrire.
Copie compactée : VACUUM INTO
Section intitulée « Copie compactée : VACUUM INTO »sqlite3 boutique.db "VACUUM INTO 'copie-compacte.db';"Crée une copie défragmentée, cohérente, souvent plus petite. Le fichier de destination ne doit pas exister.
Sauvegarde en SQL
Section intitulée « Sauvegarde en SQL »sqlite3 boutique.db .dump | gzip > boutique-$(date +%F).sql.gzFormat lisible, indépendant de la version de SQLite et portable (voir Import et export).
Restaurer
Section intitulée « Restaurer »cp sauvegarde.db boutique.db # application arrêtéegunzip -c boutique-2026-10-05.sql.gz | sqlite3 restauree.dbToujours restaurer d’abord dans un nouveau fichier pour vérifier le contenu :
sqlite3 restauree.db "PRAGMA integrity_check; SELECT COUNT(*) FROM clients;"Vérifier l’intégrité
Section intitulée « Vérifier l’intégrité »PRAGMA integrity_check; -- affiche « ok » si le fichier est sainPRAGMA quick_check; -- version plus rapidePRAGMA foreign_key_check; -- lignes qui violent une clé étrangèreMode WAL : lectures et écritures simultanées
Section intitulée « Mode WAL : lectures et écritures simultanées »Par défaut, une écriture bloque les lectures. Le mode WAL (journal d’écriture anticipée) permet aux lectures de continuer pendant une écriture et améliore les performances :
PRAGMA journal_mode = WAL; -- réglage persistant, enregistré dans le fichierPRAGMA busy_timeout = 5000; -- attend jusqu'à 5 s au lieu d'échouer avec « database is locked »PRAGMA synchronous = NORMAL; -- compromis sûr en mode WALEn mode WAL, SQLite crée à côté de la base les fichiers boutique.db-wal et boutique.db-shm : ils font partie de la base et ne doivent pas être supprimés quand l’application tourne. PRAGMA wal_checkpoint(TRUNCATE); reporte le journal dans le fichier principal.
journal_mode et synchronous doivent être définis à chaque ouverture si on ne veut pas dépendre de la valeur enregistrée ; busy_timeout est propre à chaque connexion.
Maintenance
Section intitulée « Maintenance »VACUUM; -- reconstruit le fichier (libère l'espace des suppressions)PRAGMA optimize; -- met à jour les statistiques si utile (à lancer avant de fermer)ANALYZE; -- statistiques pour l'optimiseurPRAGMA page_count;PRAGMA page_size;PRAGMA freelist_count; -- pages libres récupérables par VACUUMVACUUM demande, pendant l’opération, de la place libre égale à la taille de la base et la verrouille en écriture : le lancer hors heures d’activité.
Récupérer une base endommagée
Section intitulée « Récupérer une base endommagée »sqlite3 boutique.db ".recover" | sqlite3 recuperee.db.recover extrait ce qui est lisible d’un fichier corrompu. Vérifier ensuite recuperee.db avec PRAGMA integrity_check;. Si la base avait été analysée (ANALYZE), des messages d’erreur sur sqlite_stat1 peuvent apparaître pendant la récupération : sans gravité, relancer ANALYZE; ensuite pour recréer les statistiques.
Planifier avec cron
Section intitulée « Planifier avec cron »Script /usr/local/bin/sauvegarde-sqlite.sh :
#!/usr/bin/env bashset -euo pipefail
BASE="/srv/application/boutique.db"DEST="/var/backups/sqlite"mkdir -p "$DEST"
sqlite3 "$BASE" ".backup '$DEST/boutique-$(date +%F_%H%M).db'"
# Conserve 14 joursfind "$DEST" -name "boutique-*.db" -mtime +14 -deletesudo chmod 750 /usr/local/bin/sauvegarde-sqlite.shcrontab -e30 2 * * * /usr/local/bin/sauvegarde-sqlite.sh >> /var/log/sauvegarde-sqlite.log 2>&1Copier ensuite les sauvegardes hors du serveur.
Droits sur les fichiers
Section intitulée « Droits sur les fichiers »chmod 640 boutique.dbchown application:application boutique.dbLe dossier contenant la base doit aussi être accessible en écriture par l’application : SQLite y crée des fichiers temporaires et de journal.
Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
database is locked |
Écriture simultanée : mode WAL et busy_timeout, transactions courtes |
database disk image is malformed |
Fichier corrompu : restaurer une sauvegarde, ou tenter .recover |
disk I/O error |
Disque plein, ou dossier non accessible en écriture |
Le fichier -wal devient très gros |
Une lecture longue empêche le point de contrôle : fermer les lectures, PRAGMA wal_checkpoint(TRUNCATE); |
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : Backup API et Write-Ahead Logging
- Planification : Bonnes pratiques Bash