Почему дамп базы данных MySQL программно отличается от дампа через командную строку?

Чтобы вывести базу данных из командной строки, все, что мне нужно сделать, это:

mysqldump -uroot --password=  myDb --routines> "C:\s.sql"

Так что все, что я бы попробовал программно, это то, что, как я полагаю, является прямой интерпретацией этого:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = dumpUtilityPath;
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;

psi.Arguments = "-uroot --password=  myDb --routines> \"C:\\s.sql\"";

Process process = Process.Start(psi);
process.WaitForExit();
process.Close();

Который не работает вообще. Вместо этого я должен пойти на это, что можно найти по всей сети, что тоже работает.

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = dumpUtilityPath;
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;

psi.Arguments = string.Format("-R -u{0} --password={1} -h{2} {3} --routines", "root", "", "localhost", "myDb");

Process process = Process.Start(psi);
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Close();

using (StreamWriter writer = new StreamWriter("C:\\s.sql"))
{
    writer.WriteLine(output);
    writer.Close();
}
  1. Почему мне нужно использовать потоковую запись, чтобы получить базу данных в файле sql, что я могу сделать в противном случае непосредственно из команд в командной строке?

  2. Какова роль -R во втором блоке?

3 ответа

Решение

То, что вы делаете в версии для командной строки, использует оболочку для передачи стандартного вывода в файл (> Команда, сопровождаемая именем файла, является сокращенным способом сказать "взять все стандартные выходные данные этой программы и записать их в этот файл"). Чтобы сделать то же самое из C#, вам нужно вручную передать стандартный вывод и записать его в файл.

-R во втором примере кажется дублирующим. Согласно этой странице, это так же, как --routines, Вы пробовали это без?

  1. Вы не можете перенаправить стандартный вывод, используя ">" в ​​аргументах, потому что это особенность командной строки.

  2. -R включает хранимые процедуры и функции в дамп. См. http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html для получения дополнительной информации.

Я думал, что включу то, как Аргументы могут выглядеть программно, в нашем случае мы также хотели записать события БД в файл.

psi.Arguments = string.Format(@"-u{0} -p{1} -h{2} {3}", "someUser", "xxxxxx", "localhost", dbName, "--routines","--events");
Другие вопросы по тегам