从 ASP .NET Web 应用程序中作为新进程运行时,mysqldump 不起作用

StackOverflow https://stackoverflow.com/questions/872828

  •  22-08-2019
  •  | 
  •  

当从“运行”窗口运行时,它可以正常工作。

cmd.exe /K mysqldump --add-drop-database --add-drop-table --user=root --password=thepassword --databases theDatabase > C:\Backup\theBackup.sql

但是,当我尝试通过调用外部进程从 Web 应用程序执行相同的命令时,会失败。

这是代码:

ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", @"/K mysqldump --add-drop-database --add-drop-table --user=root --password=thepassword --databases theDatabase > C:\Backup\theBackup" + ".sql");

Process p = Process.Start(processInfo);

这就是我得到的...

替代文本http://img40.imageshack.us/img40/8121/mysqldumperror.gif

有趣的是,文件 - theBackup.sql - 已创建,但为空。

这不是环境PATH变量的问题;将包含mysqldump的MySql bin目录路径添加到环境PATH变量中。要检查这一点,如果我打开命令提示符,导航到上面屏幕截图中提到的路径并手动键入 mysqldump 命令,它会识别该命令...如下所示...

替代文本http://img40.imageshack.us/img40/6879/mysqldumppathproper.gif

该问题是 mysqldump 特定的,因为以下代码有效

ProcessStartInfo processInfo = new ProcessStartInfo("cmd.exe", "/K ping stackoverflow.com");

这是怎么回事?

有帮助吗?

解决方案

我的猜测是 $PATH 变量未定义为包含 ASP.NET 运行环境中 MySQL 的路径(无论是对于该用户,还是 ASP.NET 清理环境)。

有两件事要尝试:

  1. (可能有效)确保 mysql 目录已添加到 全球的 路径——不仅仅是用户特定的 PATH 变量。(笔记:这至少需要回收 IIS,也许需要重新启动才能生效)
  2. 使用 mysqldump 的完全限定路径(您需要执行一些操作来引用或转义路径中的任何空格)。

其他提示

有关的mysqldump一个例子

Private sw As IO.StreamWriter

Public Sub ExecuteBackup()
    Try

        Dim mysqlDump As New Process
        mysqlDump.StartInfo.FileName = "PahtToMysqlDump\mysqldump.exe"
        mysqlDump.StartInfo.Arguments = "--user=myuser --password=mypassword --routines --all-databases"
        mysqlDump.StartInfo.RedirectStandardOutput = True
        mysqlDump.StartInfo.CreateNoWindow = True
        mysqlDump.StartInfo.UseShellExecute = False

        Console.WriteLine("Arguments:")
        Console.WriteLine("mysqldump.exe " & mysqlDump.StartInfo.Arguments)

        sw = New IO.StreamWriter("backup.sql")

        AddHandler mysqlDump.OutputDataReceived, AddressOf mysqlDumpNewData

        mysqlDump.Start()
        mysqlDump.BeginOutputReadLine()
        mysqlDump.WaitForExit()

        sw.Close()

        Console.WriteLine("Backup completed")

    Catch ex As Exception   
        Console.WriteLine("BackupEngine.ExecuteBackup.", ex)        
    End Try
End Sub

Private Sub mysqlDumpNewData(sender As Object, e As DataReceivedEventArgs)

    Dim line = e.Data
    If line IsNot Nothing Then
        sw.WriteLine(line)
        If line.StartsWith("USE") Then
            Dim ln = line.Split("`")(1)
            Console.WriteLine("Database : " & ln.ToUpper)
        End If
        If line.StartsWith("CREATE TABLE") Then
            Dim ln = line.Split("`")(1)
            Console.WriteLine(" Table : " & ln.ToUpper)
        End If
    End If

End Sub
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top