2009-05-16 5 views
1

Dies funktioniert, wenn es im "Ausführen" -Fenster ausgeführt wird.mysqldump funktioniert nicht, wenn es in einer ASP .NET-Webanwendung als neuer Prozess ausgeführt wird

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

Derselbe Befehl, wenn ich versuche, von meiner Webanwendung durch Aufruf eines externen Prozesses auszuführen, schlägt jedoch fehl.

Hier ist der Code:

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

Dies ist, was ich ...

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

Interessanterweise ist die Datei - theBackup.sql - wird erstellt, ist aber leer.

Es ist kein Problem mit der Umgebungsvariablen PATH; Der MySql-Bin-Verzeichnispfad, der mysqldump enthält, wird der Umgebungsvariablen PATH hinzugefügt. Um dies zu überprüfen, ob ich die Eingabeaufforderung zu öffnen, navigieren Sie oben auf den Pfad in dem Screenshot erwähnt und geben Sie mysqldump Befehl manuell, es erkennt den Befehl ... wie folgt ...

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

Das Problem ist mysqldump spezifisch, da das folgende Stück Code funktioniert

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

Was ist hier falsch?

Antwort

3

Meine Annahme wäre, dass die $ PATH-Variable nicht definiert ist, um den Pfad zu MySQL in der Umgebung, in der ASP.NET ausgeführt wird, einzuschließen (entweder für den betreffenden Benutzer oder ASP.NET reinigt die Umgebung).

Zwei Dinge versuchen:

  1. (funktionieren kann) Stellen Sie sicher, dass das mysql-Verzeichnis in den globalen Pfad hinzugefügt wird - nicht nur das benutzerspezifischen PATH-Variable. (Hinweis: Dazu muss mindestens IIS recycelt werden, möglicherweise muss ein Neustart durchgeführt werden.)
  2. Verwenden Sie den vollqualifizierten Pfad zu mysqldump (Sie müssen etwas tun, um Leerzeichen im Pfad anzugeben oder auszugeben).
+0

weder gearbeitet :-( – Sameet

+0

Haben Sie sicherstellen, dass Sie den Pfad notiert oder entkam sonst keine Leerzeichen drin? (Nur hinzugefügt, dass auf die Antwort) –

+0

mit der gearbeitet Vollqualifizierter Pfad - mit ausweichenden Leerzeichen :-) Danke. – Sameet

0

Ein exemple für 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 
Verwandte Themen