2011-07-13 3 views
3

J'ai SQLite db hébergé sur mon site et là, il fonctionne très bien. J'ai besoin d'ajouter une nouvelle requête et j'aime les tester localement avant d'aller en live. Le problème est qu'après avoir téléchargé le fichier db pour le travailler localement, lorsque j'essaie d'exécuter une requête (la même qui fonctionne en ligne), je reçois une "image disque de base de données est mal formée".sqlite db malformé que localement

Une idée où le problème est?

Mon site détail

serveur: linux

AOP pilote pour 3.x SQLite: activé

SQLite Bibliothèque: 3.3.7

Mes coordonnées locales

serveur: Windows 7 avec XAMPP (1.7.2)

AOP pilote pour 3.x SQLite: activé

SQLite Bibliothèque: 3.6.16

Répondre

0

Comment télécharger le fichier SQLite3 DB votre système local?

Si vous utilisez quelque chose comme FTP ou SCP pour obtenir directement tandis que le serveur est en ligne, il est tout à fait possible que vous récupérer un fichier corrompu. Pensez-y: sur Internet, le transfert d'un tel fichier nécessiterait au moins quelques secondes - quelques secondes pendant lesquelles votre site est toujours en ligne et les transactions sont effectuées sur le fichier DB du serveur. Ainsi, les premiers octets du fichier refléteraient, par exemple, transaction 1003, tandis que les derniers octets refléteraient la transaction 1015. Essentiellement, le fichier DB change pendant que vous le téléchargez.

Et on n'a pas encore entré dans les fichiers journaux DB et les transactions partielles.

Qu'est-ce que vous avez besoin est une copie atomique du fichier DB. Même cp sur le serveur peut ne pas être assez rapide. Vous avez besoin d'un moyen de verrouiller la DB lors de la copie du fichier.

Il y a trois façons de le faire:

  • Utilisez le utilty shell sqlite3 sur le serveur et le .dump DB. Vous pouvez ensuite compresser le vidage SQL, le télécharger et reconstruire une base de données locale. Un peu encombrant mais presque garanti de fonctionner.

  • Utilisez le SQLite3 backup API. Le sqlite3 shell utility a une commande .backup qui fait à peu près la même chose. Ensuite, vous pouvez simplement télécharger le nouveau fichier DB. Malheureusement, les anciennes versions de SQLite ne peuvent pas supporter cela.

  • Verrouillez le fichier DB à l'aide de l'utilitaire shell sqlite3, utilisez cp pour le copier, déverrouiller. L'ancien, un peu dangereux, c'est pourquoi je ne vais pas entrer dans plus de détails.

  • Arrêtez votre serveur afin qu'aucune transaction ne soit effectuée, copiez le fichier, redémarrez. Je ne considère pas cela comme une solution réelle, d'où le fait qu'il ne soit pas inclus dans le décompte final.

BTW, this page contient quelques façons communes à un SQLite3 DB corrompu - vous pouvez jeter un oeil ...

+0

Oui via FTP, mais le fichier est très petit comme 64Ko et il n » est pas J'ai tellement utilisé, mon doute est que le fichier peut toujours être suspendu et non fermé. – BrainCrash

+0

@BrainCrash: Il est tout à fait possible qu'il existe un fichier journal actif que vous ne téléchargez pas. En général, le seul moyen de copier de façon fiable les fichiers DB - dans * tout * SGBD, et pas seulement SQLite - est le SGBD lui-même. – thkala

+0

D'une façon ou d'une autre, j'ai pu télécharger une copie de travail du fichier. Mon problème est que j'ai un de ces hôtes bon marché donc je ne peux pas exécuter les commandes shell sur le serveur. Merci. – BrainCrash