Почему дамп базы данных MySQL программно отличается от дампа через командную строку? - PullRequest
0 голосов
/ 03 марта 2012

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

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 ]

2 голосов
/ 03 марта 2012
  1. Нельзя перенаправить стандартный вывод, используя «>» в ​​аргументах, поскольку это является функцией командной строки.

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

1 голос
/ 03 марта 2012

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

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

0 голосов
/ 22 июля 2013

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

psi.Arguments = string.Format(@"-u{0} -p{1} -h{2} {3}", "someUser", "xxxxxx", "localhost", dbName, "--routines","--events");
...