2012-04-03 10 views
4

Ich habe eine (winzige) dynamische Website, die (ungefähr) ein Perl-CGI-Skript ist, das eine SQLite-Datenbank verwendet. Paket-DBI ist die Abstraktionsschicht, die in Perl verwendet wird.Disk-E/A-Fehler mit SQLite

Etwa eine Woche vor, begann ich diese Fehlermeldung zu sehen:

disk I/O error(10) at dbdimp.c line 271

Da dies eine gehostete Website mit Apache ist, kann ich nicht sehen, ob die Festplatte (fast) voll ist. Der Zugriff auf den Befehl "df" ist deaktiviert .... aber ich habe den (UNIX) Shell-Befehl "yes> blah" verwendet, um zu testen, ob der Datenträger noch neue Dateien erstellen kann. Meine Datenbank ist sehr klein - weniger als 50 Kilobyte.

Ich überprüft Datei-und Verzeichnisberechtigungen: Directory und alle Eltern sind a + r, a + x (alle + lesen/ausführbar). Das Verzeichnis, das meine SQLite-Datenbankdatei enthält, ist auch ein + w (all + write). Die Datenbankdatei selbst hat ein + w, ein + r (alles + lesen/schreiben).

Ich schrieb ein einfaches Perl-Programm zu testen, ich kann die fehlgeschlagene Select-Abfrage ausführen: Es läuft gut.

Ich führte Abfrage "VACUUM" auf der Datenbank. Ich habe meine Tests erneut versucht - keine Verbesserung.

Ich warf die SQLite-Datenbank auf Raw SQL (mit SQLite Shell-Befehl ".dump") und neu erstellt. Ich habe meine Tests erneut versucht - keine Verbesserung.

Irgendwelche Vorschläge? Ich bin so verwirrt ... Normalerweise kann die obige Liste die meisten Programmier-/Setup-Fehler auffangen.

+0

Können Sie den Code posten, der ausgeführt wird, wenn der Fehler auftritt? –

+0

Welche Version von SQLite verwenden Sie? Und wie groß ist Ihre Datenbank? Ist das nützlich - http://www.sqlite.org/cvstrac/tktview?tn=3094,3 –

Antwort

2

Leider ist sqlite3.h nicht sehr beschreibend, was das spezifische Problem ist. Fehlercode 10 ist hier definiert:

#define SQLITE_IOERR  10 /* Some kind of disk I/O error occurred */ 

Sie haben ein Problem mit dem/tmp voll ist an bestimmten Punkten oder SQLite nicht Zugriff auf den Speicher, dessen Seiten-Cache zu schreiben. Dies ist jedoch unwahrscheinlich, wenn Ihre db 50kb ist, da sqlite Ihren Seitencache im Speicher halten kann.

Sie könnten versuchen, eine Kopie der db in der Hoffnung zu machen, dass die kopierte Datenbank lesen und aktualisieren Sie Ihren Code, reflektieren sqlite können:

$sqlite3 your.db 
sqlite> begin immediate; 
<press CTRL+Z> 
$cp your.db copyofyour.db 
$exit 
sqlite> rollback; 

Sie sollten auch die Protokolle überprüfen, um zu sehen, ob dies geschieht, ist, mit jeder Anfrage oder intermittierend. Vielleicht möchten Sie sehen, ob Sie Zugriff auf andere Befehle haben, um den Serverzustand zu überwachen (oben, kostenlos). In der Lage zu sein, das Problem zu reproduzieren, scheint Ihre erste Aufgabe zu sein. Wenn Sie es nicht konsistent reproduzieren können, handelt es sich wahrscheinlich um ein Speicherproblem.

+0

Netter Vorschlag! Coole Ideen. Ich werde eine Notiz für zukünftige Probleme nehmen. Leider, in diesem Fall - es war aufgrund eines FreeBSD-Kernel-Bugs (wie von Support-Foren für NearlyFreeSpeech.net erklärt). – kevinarpe

+0

Können Sie etwas mehr über den Fehler sagen? Denke ich könnte gegen etwas Ähnliches stoßen ... –

+0

@ChrisVandevelde: Sorry, NFS.net admins lieferte keine weiteren Details über den FreeBSD <-> SQLite Bug. Mein Problem wurde jedoch behoben. – kevinarpe

0

Eine mögliche und möglicherweise schwer zu erkennende Fehlerquelle kann sein, wenn die Dateisperrung fehlschlägt. Sie könnten testen, ob Ihr Dateisystem zur Zeit des Sperren von Dateien mit

flock testfile touch testfile 

NFS-Dateisystemen zum Beispiel zeigen kann dieses Verhalten abhängig von NFS-Server-Konfiguration unterstützt.