Не могу сбросить базу данных MySQL - PullRequest
1 голос
/ 03 августа 2011

Кажется, у меня проблема.У меня есть представление, где я могу позволить штатным пользователям загружать базу данных MySQL для этой программы, однако она вообще не работает.Я получаю сообщение об ошибке: Errno 2] No such file or directory: '/usr/local/src/djcode/c2duo_mms/backup.gz'.

. Я не знаю, почему я получаю сообщение об ошибке, но вероятный ответ - потому что я не могу сбросить базу данных должным образом.Он не может найти 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 ниже (сохраняет файл с именем backup.gz в каталоге c2duo_mms).Так почему я не могу сделать то же самое из моего файла 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")

Ответы [ 4 ]

1 голос
/ 03 августа 2011

Используйте полный путь здесь:

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

т.е. где вы экономите вниз sql.

0 голосов
/ 23 августа 2011

Веб-сервер работал от имени другого пользователя, нежели root (он должен быть таким же), поэтому у меня не было разрешений для сохранения в этой папке. Я сменил владельца папки, которую хотел сохранить, и теперь работает.

chown -R "apache" c2duo_mms

0 голосов
/ 03 августа 2011

Попробуйте что-то вроде этого:

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 "output" предоставит вам доступ к любым сообщениям об ошибках из команды.

0 голосов
/ 03 августа 2011

Popen открывает процесс, но не создает оболочку вокруг него. Поскольку я не ожидаю промежуточную оболочку, я не ожидаю, что перенаправления будут интерпретироваться. Popen действительно возвращает дескрипторы файлов в различные потоки, входящие и выходящие из процесса - это будет стандартный вывод, который вы получите без перенаправлений.

Если вы читаете и сохраняете содержимое из этих дескрипторов канала, вы можете выполнить перенаправление внутри кода Python.

Возможно, вы могли бы рассмотреть модуль подпроцесса - http://docs.python.org/library/subprocess.html - и вы можете указать, какую оболочку использовать с ним, которая затем может интерпретировать перенаправления.

...