使用C#对指定的MYSQL数据库进行备份以及常见问题
最近在开发过程中,需要做个MYSQL数据库的备份,大致总结了一下代码,以及常见的坑
string bakName = "database" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".sql";//备份后的数据库文件名var bakupFilePath ="D:\\MySqlData\\";//备份后的数据库文件保存目录 string databaseName = "test";//源数据库名称string userName = "root";//数据库服务器用户名string password = "admin123456";//数据库密码string host = "127.0.0.1";//源数据库所在服务器地址string port = "3306";//源数据库所在服务器端口//执行备份ProcessStartInfo processInfo = new ProcessStartInfo();processInfo.FileName = AppContext.BaseDirectory+"mysqldump.exe";//这里我把mysqldump.exe从MYSQL的bin目录下复制到了项目的生成目录中processInfo.Arguments = $"--host={host} --user={userName} --password={password} --port={port} --skip-opt {databaseName} --result-file={bakupFilePath + bakName}";//命令说明://--skip-opt必须注明,否则备份的文件中,每个表最多只能有一条插入语句processInfo.RedirectStandardOutput = true;processInfo.RedirectStandardError = true;processInfo.UseShellExecute = false;processInfo.CreateNoWindow = true;Process process = new Process();process.StartInfo = processInfo;try{process.Start();string output = process.StandardOutput.ReadToEnd();//运行结果,空字符串为正常结果errorMsg = process.StandardError.ReadToEnd();//异常信息process.WaitForExit();if (process.ExitCode != 0)//=0为成功,其他为失败{return false;}return true;catch (Exception ex){errorMsg = ex.Message;return false;}return false;
主要问题排查:
1、运行到“string output = process.StandardOutput.ReadToEnd();”这一行时,一直卡在这里
问题原因:确定是因为Arguments里面的语句有问题,修改为正确的就行,可参照示例中
2、errorMsg结果是“mysqldump couldn t find table:">"”
问题原因: 我之前用的语句是这样:
--host={host} --user={userName} --password={password} --port={port} {databaseName} > {bakupFilePath + bakName}
这种写法在命令行中是可以的,但在C#代码里面,">"在命令中属于特殊字符,会被认为是表名字符。
解决方案有两个,一个是把“>”换成“-r”,以替代>,另一个就是把“>”换成“--result-file=”,以避免出现特殊字符
3、生成的数据库文件中,每张表只有一条插入语句
解决方案:在命令中加入--skip-opt