1

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

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");

这里有什么问题?

4

2 回答 2

3

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

有两件事要尝试:

  1. (可能有效)确保将 mysql 目录添加到全局路径——而不仅仅是用户特定的 PATH 变量。(注意:这至少需要回收 IIS,可能需要重新启动才能生效)
  2. 使用 mysqldump 的完全限定路径(您需要做一些事情来引用或转义路径中的任何空格)。
于 2009-05-16T17:25:44.500 回答
0

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
于 2013-09-07T21:47:09.970 回答