| 

.NET C# Java Javascript Exception

3
Hallo,

ich habe eine Anwendung, die auf SQLite aufsetzt. Die Anwendung kann mehrere Mandanten haben und jeder Mandant hat eine eigene SQLite-Datenbank.

Jetzt geht es an den Backup. Ich hatte eigentlich gedacht, dass dies mit XCOPY ganz einfach klappt.
Aber dem ist nicht so, denn wenn in der Datenbankdatei gerade eine Transaktion aktiv ist, kann XCOPY sehr wahrscheinlich zu dem hier führen: http://www.sqlite.org/howtocorrupt.html

SQLite hat auch eine Backup-API, aber die wurde wohl in dem .NET-Wrapper System.Data.SQLite vergessen.

Was mir als Workaround einfällt, wäre eine Transaktion auf die Datebank zu starten und dann XCOPY durchzuführen:

private static bool backupDB(string dbFile, string backupFile)
{
using (System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection(new SQLiteConnectionStringBuilder() { DataSource = dbFile }.ConnectionString))
{
conn.Open();

SQLiteTransaction tx;
try
{
tx = conn.BeginTransaction(System.Data.IsolationLevel.Serializable);
}
catch
{
// db is locked
return false;
}

File.Copy(dbFile, backupFile);
tx.Dispose();
return true;
}
}


Falls bereits eine Transaktion auf der Datenbank läuft, landet das Backup in einem Timeout und bricht ab.

Ist das eine gute Idee?

Oder kann ich mir dabei doch irgendwie die Datenbank zerschießen?

Grüße,
Andreas
News:
21.05.2012
kleffel 654 1 9
kleffel 654 1 9
3 Antworten
2
Hi, ist die Command Line Shell von SQLite eine Option? Ich habe es selbst nicht getestet, aber die müsste eigentlich mit .backup die besagte Api nutzen.
22.05.2012
KCT 937 1 1 8
2
Hallo Andreas,
ich sehe hier 2 Möglichkeiten:

a) mit Shared Lock wie es auf der Hilfeseite beschrieben ist:
1. Establish a shared lock on the database file using the SQLite API (i.e. the shell tool).
2. Copy the database file using an external tool (for example the unix 'cp' utility or the DOS 'copy' command).
3. Relinquish the shared lock on the database file obtained in step 1.

Den Shared Lock bekommt man nicht durch Öffnen einer Transaktion sondern erst nach dem ersten Select:
"Note that the BEGIN command does not acquire any locks on the database. After a BEGIN command, a SHARED lock will be acquired when the first SELECT statement is executed."

Wichtig scheint hier also das SELECT (fehlt noch oben in deinem Codebeispiel).

b) Die hier beschriebenen C-Funktionen mit P-Invoke aufrufen, falls sie nicht im Wrapper enthalten sind.

Gutes Gelingen, Daniel
22.05.2012
puls200 3,8k 1 7
+1. Ich hab in absehbarer Zeit auch mit SQLite zu tun, da kann man solche Hinweise schon mal in die Favorites aufnehmen.
ffordermaier 22.05.2012
0
Der Backup via Command Line Shell klappt:

sqlite3.exe "U:/HostingRoot/LicenseStore.s3db" ".backup U:/HostingRoot/LicenseStore.bak"


so einfach muss es sein!

Link: http://sqlite.org/sqlite-3_6_21.zip

Wichtig: Pfad in Form U:\... geht nicht, es muss U:/... geschrieben werden (ist halt LINUX-Frickelei)
24.05.2012
kleffel 654 1 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH