通过命令行复制MySQL数据到远程Azure服务器时因语法错误失败
通过命令行复制MySQL数据到远程Azure服务器时因语法错误失败
我完全懂你遇到的坑——命令提示符里跑起来顺风顺水的管道命令,放到C#的Process调用里就直接报错mysqldump: Couldn't find table: "|",这其实是因为.NET的Process默认不会通过系统shell(比如cmd.exe)来解析命令,管道符|被当成mysqldump的普通参数了!
问题根源
当你设置UseShellExecute = false时,.NET会直接启动mysqldump程序,把你写的一整串参数原封不动传给它。这时候mysqldump会把|当成要备份的表名,自然就找不到这个“表”而报错了。但在命令提示符里运行时,是cmd.exe帮你解析了管道符,把mysqldump的输出作为mysql的输入,这才是正确的管道逻辑。
两种解决办法
1. 开启Shell解析(最简单)
把复制数据库那段的UseShellExecute改成true,让.NET调用系统shell来执行整个命令,管道符就能正常工作了:
// Copy database. stopwatch.Restart(); process = new Process() { StartInfo = new ProcessStartInfo("mysqldump", @$"-u{sourceUser} -p{sourcePassword} {arg} | mysql -u{targetUser} -p{targetPassword} -h {targetHost} {arg}") { UseShellExecute = true, // 关键修改:开启shell解析 WorkingDirectory = mySqlPath } }; process.Start(); process.WaitForExit(); stopwatch.Stop(); logWriter.WriteLine($"\tCopying database in {stopwatch.ElapsedMilliseconds} ms");
2. 手动调用cmd.exe(更可靠,适合复杂场景)
直接启动cmd.exe,用/c参数来执行你的管道命令,这种方式能明确控制shell解析过程,避免路径空格、特殊字符等意外问题:
// Copy database. stopwatch.Restart(); // 用双引号包裹整个命令,避免空格或特殊字符导致解析错误 var fullCmd = $"/c \"mysqldump -u{sourceUser} -p{sourcePassword} {arg} | mysql -u{targetUser} -p{targetPassword} -h {targetHost} {arg}\""; process = new Process() { StartInfo = new ProcessStartInfo("cmd.exe", fullCmd) { UseShellExecute = false, RedirectStandardError = true, // 建议开启,方便捕获错误信息 WorkingDirectory = mySqlPath } }; process.Start(); // 读取错误输出,方便调试 var errorMsg = process.StandardError.ReadToEnd(); process.WaitForExit(); if (!string.IsNullOrEmpty(errorMsg)) { logWriter.WriteLine($"\tCopy error details: {errorMsg}"); } stopwatch.Stop(); logWriter.WriteLine($"\tCopying database in {stopwatch.ElapsedMilliseconds} ms");
额外注意事项
- 密码安全与特殊字符:直接在命令行写
-p{password}不仅不安全,还会因为密码里的特殊字符(比如&、!、空格)导致命令解析失败。建议改用--defaults-extra-file参数,把用户名密码写在配置文件里:
创建my_config.ini文件:
然后命令改成:[mysqldump] user=你的源用户名 password=你的源密码 [mysql] user=你的目标用户名 password=你的目标密码 host=你的Azure服务器地址mysqldump --defaults-extra-file=./my_config.ini {arg} | mysql --defaults-extra-file=./my_config.ini {arg} - 路径问题:如果mysql/mysqldump不在系统环境变量里,一定要写绝对路径,比如
"C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin\\mysqldump.exe",路径有空格时记得用双引号包裹。
内容来源于stack exchange
相关产品推荐
相关产品推荐

