2011-08-03 5 views
1

Je semble avoir un problème. J'ai une vue où je peux permettre aux utilisateurs du personnel de télécharger la base de données MySQL pour ce programme, mais cela ne fonctionne pas du tout. Je reçois une erreur qui dit Errno 2] No such file or directory: '/usr/local/src/djcode/c2duo_mms/backup.gz'.Impossible de vider une base de données mysql

Je ne sais pas pourquoi j'ai l'erreur, mais la réponse probable est parce que je ne peux pas vider correctement la base de données. Il ne peut pas trouver backup.gz, car il ne peut pas trouver le fichier parce que l'étape où il est censé vider le fichier ne fonctionne pas.

views.py

@login_required 
def dbbackup(request): 
    if not (request.user.is_authenticated() and request.user.is_staff): 
     raise http.Http404 
    os.popen3("mysqldump -u *username* -p*password* *database* > /usr/local/src/djcode/c2duo_mms/backup.sql") 
    os.popen3("gzip -c /usr/local/src/djcode/c2duo_mms/backup.sql > /usr/local/src/djcode/c2duo_mms/backup.gz" 
    dataf = open('/usr/local/src/djcode/c2duo_mms/backup.gz', 'r') 
    return HttpResponse(dataf.read(), mimetype='application/x-gzip') 

EDIT: Je ai essayé de lancer un petit script python. Maintenant, le fichier python suivant fonctionne (sauvegarde un fichier nommé backup.gz dans le répertoire c2duo_mms). Alors, pourquoi ne puis-je pas faire la même chose avec mon fichier views.py?

#!/usr/bin/env python 
import os 

    os.popen3("mysqldump -u *username* -p*password* *database* > /usr/local/src/djcode/c2duo_mms/backup.sql") 
    os.popen3("gzip -c /usr/local/src/djcode/c2duo_mms/backup.sql > /usr/local/src/djcode/c2duo_mms/backup.gz") 
+0

ne me reste qu'une supposition et pourquoi il est un commentaire, assurez-vous que le django utilisateur est en cours d'exécution tout comme les autorisations nécessaires pour écrire dans ce répertoire. Vérifiez la sortie de mysqldump et gzip pour les erreurs aussi. –

+0

Avez-vous essayé d'exécuter la commande manuellement pour vous assurer qu'elle fonctionne? –

+0

@Mike Ramirez: Les autorisations sont définitivement très bien. La sortie pour mysqldump et gzip semble bien aussi. Bien que la base de données ne soit pas vidée, cette ligne peut être à l'origine du problème. 'os.popen3 (" mysqldump --add-drop-table -u "+ les paramètres.DATABASE_USER +" -p "+ les paramètres.DATABASE_PASSWORD +" "+ les paramètres.DATABASE_NAME +"> backup.sql ") os.popen3 ("gzip -c backup.sql> backup.gz") ' – Shehzad009

Répondre

0

Le serveur Web était en cours d'exécution en tant qu'utilisateur différent de root (il doit être le même), je n'avais donc pas les autorisations pour enregistrer dans ce dossier. J'ai changé la propriété du dossier que je voulais sauvegarder et qui a fonctionné maintenant.

chown -R "apache" c2duo_mms

1

Utilisez un chemin complet ici:

os.popen3("mysqldump --add-drop-table -u " + settings.DATABASE_USER + " -p" + settings.DATABASE_PASSWORD + " " + settings.DATABASE_NAME + " > backup.sql") 

à savoir où vous enregistrez sur le sql.

+0

J'ai utilisé le chemin complet du répertoire et cela ne fonctionne pas. – Shehzad009

+0

Peut-être aussi essayer d'utiliser le chemin complet de la commande mysqldump aussi. Avez-vous été en mesure de déboguer pour déterminer quelle partie du script échoue. –

+0

Aussi vaut la peine de vérifier. Voyez-vous le fichier sql dans le dossier? Je note qu'il n'y a pas de commande rm, donc vous vous attendez à voir les deux fichiers restent. Si ce n'est pas le cas, cela suggèrerait que la décharge échoue, sinon quelque chose à l'avance. –

0

Popen ouvre un processus, mais il ne crée pas de shell autour de celui-ci. Comme je ne m'attends pas à un shell intermédiaire, je ne m'attends pas à ce que les redirections soient interprétées. Popen renvoie les descripteurs de fichiers aux différents flux entrant/sortant du processus - il s'agirait de la sortie stdout sans les redirections.

Si vous lisez et stockez le contenu de ces poignées de tuyaux, vous pouvez effectuer la redirection dans le code Python.

Peut-être que vous pourriez considérer le module de sous-processus - http://docs.python.org/library/subprocess.html - et vous pouvez spécifier quel shell à utiliser avec lui, qui peut ensuite interpréter les redirections.

0

Essayez quelque chose comme ceci:

import subprocess  
command = "mysqldump -u *username* -p*password* *database* > /usr/local/src/djcode/c2duo_mms/backup.sql" 
p = subprocess.Popen(command, shell=True, bufsize=0, stdout=subprocess.PIPE, universal_newlines=True) 
p.wait() 
output = p.stdout.read() 
p.stdout.close() 

Le var « sortie » vous donnera accès à tous les messages d'erreur de la commande.

Questions connexes