【问题标题】:mysqldump not working when run from within an ASP .NET web app as a new process从 ASP .NET Web 应用程序中作为新进程运行时,mysqldump 不起作用
【发布时间】:2009-05-16 17:14:50
【问题描述】:

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

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

这就是我得到的......

alt text http://img40.imageshack.us/img40/8121/mysqldumperror.gif

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

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

alt text http://img40.imageshack.us/img40/6879/mysqldumppathproper.gif

问题是 mysqldump 特有的,因为下面的代码可以工作

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

这里有什么问题?

【问题讨论】:

    标签: c# mysqldump


    【解决方案1】:

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

    尝试两件事:

    1. (可能有效)确保将 mysql 目录添加到 global 路径——不仅仅是用户特定的 PATH 变量。 (注意:这至少需要回收 IIS,可能需要重启才能生效)
    2. 使用 mysqldump 的完全限定路径(您需要对路径中的任何空格进行引用或转义)。

    【讨论】:

    • 您是否确定引用了路径或以其他方式转义了其中的任何空格? (只是将其添加到答案中)
    • 使用完全限定路径 - 带有转义空格 :-) 谢谢。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多