2011-08-03 5 views
1

私は問題があるようです。私はスタッフのユーザーにそのプログラムのMySQLデータベースをダウンロードさせることができるという見解を持っていますが、それは全く機能しません。 Errno 2] No such file or directory: '/usr/local/src/djcode/c2duo_mms/backup.gz'というエラーが表示されます。mysqlデータベースをダンプできないようです。

私はなぜエラーが出るのかはわかりませんが、データベースを適切にダンプできないため、答えが出る可能性があります。それはファイルを見つけることができないので、それがファイルをダンプするはずのステップが動作しないので、backup.gzを見つけることができません。

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') 

編集:私は小さなPythonスクリプトを実行しようとしている。以下のpythonファイルが動作します(c2duo_mmsディレクトリにbackup.gzという名前のファイルが保存されます)。では、なぜ私は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

私は推測し、なぜそれがコメントだを持って、そのディレクトリへの書き込みに必要な権限を持っているように、ユーザDjangoが実行されていることを確認してください。 mysqldumpとgzipの出力もエラーがないかチェックしてください。 –

+0

コマンドを手動で実行して正常に動作することを試したことがありますか? –

+0

@Mike Ramirez:パーミッションはかなり良いです。 mysqldumpとgzipの出力もうまくいくようです。データベースをダンプしないので、問題の原因となっているこの行である可能性があります。 'os.popen3(" mysqldump --add-drop-table -u "+ settings.DATABASE_USER +" -p "+ settings.DATABASE_PASSWORD +" "+ settings.DATABASE_NAME +"> backup.sql ") os.popen3 "gzip -c backup.sql> backup.gz") – Shehzad009

答えて

0

Webサーバーはrootとは別のユーザーとして実行されていたため、同じフォルダに保存する権限がありませんでした。保存したいフォルダの所有権が変更されました。

chown -R "apache" c2duo_mms

1

は、ここに完全なパスを使用します。

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

つまりあなたは、SQLを下に保存されている場合。

+0

私は完全なディレクトリパスを使用しており、動作しません。 – Shehzad009

+0

また、mysqldumpコマンドのフルパスを使用してみてください。スクリプトのどの部分が失敗しているかを判断するためにデバッグできましたか? –

+0

チェックする価値もあります。フォルダにsqlファイルがありますか? rmコマンドがないので、両方のファイルが残っていることを期待しています。それがなければ、ダンプが失敗していることを示唆しています。 –

0

Popenはプロセスを開きますが、その周囲にシェルは作成されません。私は中間的なシェルを期待していないので、そこのリダイレクトが解釈されるとは思っていません。 Popenは、プロセス内/外のさまざまなストリームへのファイルハンドルを返します。リダイレクトせずに取得するのはstdoutです。

これらのパイプハンドルからコンテンツを読み込んで保存する場合は、Pythonコード内でリダイレクトを行うことができます。

おそらくサブプロセスモジュール - http://docs.python.org/library/subprocess.htmlと考えることができます。また、どのシェルを使用するかを指定することができます。リダイレクトを解釈することができます。

0

このような何かしてみます。var「出力」は、コマンドからのエラーメッセージにアクセスできるようになります

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() 

を。

関連する問題