从 ASP .NET Web 应用程序中作为新进程运行时,mysqldump 不起作用
题
当从“运行”窗口运行时,它可以正常工作。
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 清理环境)。
有两件事要尝试:
- (可能有效)确保 mysql 目录已添加到 全球的 路径——不仅仅是用户特定的 PATH 变量。(笔记:这至少需要回收 IIS,也许需要重新启动才能生效)
- 使用 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
不隶属于 StackOverflow