Comment sauvegarder la base de données sqlite?

93

Quelle est la bonne façon de le faire? Dois-je simplement copier le fichier .sq3?

Que faire s'il y a des utilisateurs sur le site et que le fichier est en cours d'écriture pendant sa copie?

thelolcat
la source
6
SQLite a une API pour cela
Colonel Thirty Two
1
Quelle langue et quel pilote utilisez-vous pour accéder à la base de données?
CL.
1
J'utilise
Il y a actuellement une demande de fonctionnalité pour exposer l'API de sauvegarde sqlite dans php: bugs.php.net/bug.php?id=70950
Brian Minton

Réponses:

152

L'outil de ligne de commande sqlite3 comprend la .backupcommande dot .

Vous pouvez vous connecter à votre base de données avec:

sqlite3 my_database.sq3

et exécutez la commande backup dot avec:

.backup backup_file.sq3

Au lieu de la connexion interactive à la base de données, vous pouvez également faire la sauvegarde et fermer la connexion par la suite avec

sqlite3 my_database.sq3 ".backup 'backup_file.sq3'"

Dans tous les cas, le résultat est une copie nommée backup_file.sq3de la base de données my_database.sq3.

C'est différent de la copie régulière de fichiers, car il prend en charge tous les utilisateurs travaillant actuellement sur la base de données. Il y a des verrous appropriés définis sur la base de données, la sauvegarde est donc effectuée exclusivement.

Googie
la source
68
Vous pouvez tout faire en une seule ligne ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell
@Googie: Pouvons-nous l'utiliser pour la réplication? ou
mOna
4
@mOna: C'est juste un mécanisme pour faire des sauvegardes. La réplication signifie propager les modifications à la volée (sorte de base de données distribuée), ce que cela ne fera pas pour vous.
Googie
Merci pour la réponse :)
mOna
1
@RonJohn Il fait en fait une copie d'un fichier, mais il répond aussi que l'accès en écriture à la base de données est restreint avec des verrous appropriés, donc c'est une opération atomique, pas de modifications intermédiaires.
Googie
5

.backup est le meilleur moyen.

sqlite3 my_database .backup my_database.back

vous pouvez également essayer la commande .dump, elle vous donne la possibilité de vider toute la base de données ou les tables dans un fichier texte. Si TABLE est spécifié, vider uniquement les tables correspondant au modèle LIKE TABLE.

sqlite3 my_database .dump > my_database.back

Un bon moyen de faire une copie d'archivage en utilisant dump and store, Reconstruisez la base de données ultérieurement.

sqlite3 my_database .dump | gzip -c > my_database.dump.gz
zcat my_database.dump.gz | sqlite3 my_database

Vérifiez également cette question. Les commandes SQLite3 .backup et .dump verrouillent-elles la base de données?

Lava Sangeetham
la source
4
Sur SQLite 3.8.2, .backupne fonctionne pas comme indiqué ci-dessus ("argument FILENAME manquant sur .backup")
Francesc Rosas
4
C'est la meilleure réponse. Si vous utilisez .backup sur une base de données de travail utilisée par beaucoup, cela peut ne pas fonctionner car à un moment donné, la base de données est verrouillée. Donc, si vous l'utilisez dans un CRON, cela ne fonctionnera pas et ne vous dira pas qu'il y a une erreur ... mieux utiliser .dump (fonctionne toujours) ou l'API fournie par SQLite.
Memristor
@Memristor Mais .dump ne verrouille-t-il pas la base de données pour les autres? FWIW, je préférerais une sauvegarde échouée (avec courrier à l'administrateur) à un service interrompu.
Torsten Bronger
1
Veuillez corriger la syntaxe .backup dans votre réponse. Il n'a pas besoin de l'opérateur '>'
Nashev
-23
try {
    final String inFileName = "/data/data/your app package/databases/db";
    File dbFile = new File(inFileName);
    FileInputStream fis = new FileInputStream(dbFile);
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CALC/Backup";
    File dir = new File(path);
    if (!dir.exists()) dir.mkdirs();
    String outFileName = path + "/filename"; // output file name
    // Open the empty db as the output stream
    OutputStream output = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = fis.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
    Toast.makeText(getActivity(), "Backup Successfully", 2).show();
    // Close the streams
    output.flush();
    output.close();
    fis.close();
} 
catch (Exception e) {
    e.printStackTrace();
}
RAM
la source
Impliquez-vous la copie par programmation au niveau du système de fichiers des fichiers de base de données?
Andreas Tasoulas
4
1. Vous ne dites même pas la langue de ce code. L'OP a dit qu'il utilise PHP mais cela semble être du code java. 2. Vous copiez un fichier octet par octet. Quel devrait être l'avantage de le faire? Java (et php) ont des méthodes pour copier des fichiers. Lisez docs.oracle.com/javase/tutorial/essential/io/copy.html 3. Cela ne résout pas le problème dans lequel la base de données peut être écrite pendant que vous la copiez.
Christopher K.