使用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