【问题标题】:Can't seem to dump a mysql database似乎无法转储 mysql 数据库
【发布时间】:2011-08-03 13:34:08
【问题描述】:

我似乎遇到了问题。我有一个视图,我可以允许员工用户下载该程序的 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 文件可以工作了(在 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")

【问题讨论】:

  • 我只有一个猜测,为什么它是一个评论,请确保用户 django 运行时具有写入该目录所需的权限。检查 mysqldump 和 gzip 的输出是否有错误。
  • 您是否尝试过手动运行该命令以确保其正常工作?
  • @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 然后查看发布的第一个答案。它应该解决它。是的,我知道 os.chdir() 应该与相对路径类似地执行此操作,但绝对路径通常是最佳的,并且您确实知道它的去向/应该在哪里。

标签: python mysql database django mysqldump


【解决方案1】:

在此处使用完整路径:

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

即你在哪里保存 sql。

【讨论】:

  • 也许也可以尝试使用 mysqldump 命令的完整路径。您是否能够调试以确定脚本的哪一部分失败了。
  • 也值得一试。看到文件夹里的sql文件了吗?我注意到没有 rm 命令,因此您希望看到两个文件都保留。如果它不存在,这表明转储失败了,如果不是事先发生的。
【解决方案2】:

试试这样的:

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" 将使您能够访问命令中的任何错误消息。

【讨论】:

    【解决方案3】:

    Popen 打开一个进程,但它不会在它周围创建一个 shell。因为我不期望中间外壳,所以我不期望那里的重定向会被解释。 Popen 确实将文件句柄返回到进程输入/输出的各种流 - 如果没有重定向,您将获得标准输出。

    如果您从这些管道句柄中读取并存储内容,则可以在 python 代码中进行重定向。

    也许你可以考虑子进程模块 - http://docs.python.org/library/subprocess.html - 你可以指定使用什么外壳,然后它可以解释重定向。

    【讨论】:

      【解决方案4】:

      网络服务器以不同于 root 的用户身份运行(它必须相同),所以我没有保存在该文件夹中的权限。我更改了我想保存的文件夹的所有权,该文件夹现在可以使用。

      chown -R "apache" c2duo_mms

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多