2011-08-03 4 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 파일이 작동합니다 (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

이 난 단지 추측을하고 코멘트를 왜, 그 디렉토리에 쓰기 위해 필요한 권한을 가지고로 확인 사용자 장고가 실행되어 있는지 확인합니다. 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

웹 서버가 루트가 아닌 다른 사용자로 실행 중이므로 (동일한 이름이어야 함) 해당 폴더에 저장할 수있는 권한이 없습니다. 나는 지금 저장 한 폴더의 소유권을 변경했다.

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이됩니다.

파이프 핸들에서 내용을 읽고 저장하면 파이썬 코드에서 리디렉션 할 수 있습니다.

아마도 하위 프로세스 모듈 인 http://docs.python.org/library/subprocess.html을 고려해 볼 수 있으며 어떤 쉘을 사용할 지 지정할 수 있습니다. 그러면 리디렉션을 해석 할 수 있습니다. 이 같은

0

시도 뭔가 :

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

var에 "출력"명령에서 오류 메시지에 액세스 할 수 있습니다.

관련 문제