static string outDataFile = "";
static string backupPath = "";
static int sqlBackupNum = 3;
#region 备份数据库到特定目录
/// <summary>
/// 备份数据库到特定目录
/// </summary>
/// <param name="binfolderpath">Bin文件夹目录,用于得到mysqldump.exe文件</param>
/// <param name="server">服务器</param>
/// <param name="user">用户名</param>
/// <param name="pass">密码</param>
/// <param name="db">要备份的数据库名</param>
/// <param name="backupfile">备份完生成的文件名称</param>
/// BackupDB(dataSourcePath,hostIp, "utf8",dataUser,dataPwd, dataBaseName, outputfile, backuppath, sqlbacknum, backupDirectory);
/// <returns></returns>
public static bool BackupDB(string binfolderpath, string server, string character, string user, string pass, string db, string backupfile, int sqlBackNumPara,string backupDirectory)
{
outDataFile = backupfile;
sqlBackupNum = sqlBackNumPara;
backupPath = backupDirectory;
string command = string.Format("mysqldump --host={0} --default-character-set={1} --lock-tables --routines --force --port=3306 --user={2} --password={3} --quick --hex-blob \"{4}\" > \"{5}\"", server, character.Trim().ToLower(), user, pass, db, backupfile);
StartCmd(binfolderpath + @"\", new string[] { command });
//备份文件夹
backupFiles(outDataFile.Replace(".sql", ".zip"));
if (File.Exists(backupfile))
{
return true;
}
else
{
return false;
}
}
static string CmdPath = @"C:\Windows\System32\cmd.exe";
/// <summary>
/// 执行Cmd命令
/// </summary>
/// <param name="workingDirectory">要启动的进程的目录</param>
/// <param name="command">要执行的命令</param>
public static void StartCmd(string workingDirectory, string[] commands)
{
Process process = new Process();
process.StartInfo.FileName = CmdPath;
process.StartInfo.WorkingDirectory = workingDirectory;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.OutputDataReceived += Process_OutputDataReceived;
process.Start();
process.BeginOutputReadLine();
process.StandardInput.WriteLine(commands[0]);
process.StandardInput.WriteLine("exit");
process.StandardInput.WriteLine("exit");
process.Close();
}
private static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e != null && e.Data != null)
{
Console.WriteLine("out:" + e.Data.ToString());
if (e.Data.ToString().Contains("exit"))
{
Console.WriteLine("backupPath: " + backupPath);
DeleteFile(backupPath, sqlBackupNum, "*.zip");
DeleteFile(backupPath, sqlBackupNum, "*.sql");
BackupMysql.backupAble = true;
}
}
}
#endregion
#region 备份 文件夹backupFiles
private static void backupFiles(string outputfile)
{
string Source =/* Environment.CurrentDirectory +*/"..\\Files";
compressDirectory(Source, outputfile);
}
private static void compressDirectory(string DirectoryPath, string OutputFilename, int CompressionLevel = 9)
{
try
{
ICSharpCode.SharpZipLib.Zip.FastZip z = new ICSharpCode.SharpZipLib.Zip.FastZip();
z.CreateEmptyDirectories = true;
z.CreateZip(OutputFilename, DirectoryPath, true, "");
if (File.Exists(OutputFilename))
LogHelper.WriteLog(LogHelper.LOGINFO, "backupFiles success: " + OutputFilename);
else
LogHelper.WriteLog(LogHelper.LOGINFO, "backupFiles fail" + OutputFilename);
}
catch (System.Exception ex)
{
LogHelper.WriteLog("compressDirectory ", ex);
}
}
#endregion
#region 备份完成后删除多余文件
//remove the oldest backup files
//pattern: *.zip | *.sql
private static void DeleteFile(string path, int keepnum, string pattern)
{
DateTime lasttime = DateTime.MaxValue;
DirectoryInfo Dir = new DirectoryInfo(path);
var files = Dir.GetFiles(pattern);
if (files.Length <= keepnum)
{
Console.WriteLine("return ");
return;
}
FileInfo temp = null;
foreach (var item in files)
{
if (item.LastWriteTime < lasttime)
{
lasttime = item.LastWriteTime;
temp = item;
}
}
Console.WriteLine("temp==null? " + temp != null);
if (temp != null)
{
Console.WriteLine("temp.FullName:" + temp.FullName);
File.Delete(temp.FullName);
}
}
#endregion
需要引用的DLL
ICSharpCode.SharpZipLib.dll