public void InsertNewDatabaseNodeToDatabasesXMLFileTest() { DatabasesXmlHandler dbHandler = new DatabasesXmlHandler(); DatabaseInfo dbInfo = new DatabaseInfo(); dbInfo.ID = Guid.NewGuid(); dbInfo.Host = "localhost"; dbInfo.User = "******"; dbInfo.Password = "******"; dbInfo.DatabaseName = "test_database"; dbInfo.StartTime = new TimeSpan(4, 30, 0); dbInfo.AddUseDatabase = false; dbInfo.IncludeRoutines = true; dbHandler.InsertDatabaseNode(dbInfo); XElement document = XElement.Load(ConfigurationHandler.DB_CONFIG_FILE); var databaseNode = document .Elements("Database") .FirstOrDefault(x => x.Attribute("ID").Value == dbInfo.ID.ToString()); string databaseName = databaseNode.Element("Name").Value; Assert.AreEqual("test_database", databaseName); //remove the database node we just created dbHandler.RemoveDatabaseNode(dbInfo.ID); }
public void RetrieveAllDatabaseNodesTest() { DatabasesXmlHandler dbHandler = new DatabasesXmlHandler(); DatabaseInfo dbInfo = new DatabaseInfo(); Guid tmpGuid = Guid.NewGuid(); dbInfo.ID = tmpGuid; dbInfo.Host = "localhost"; dbInfo.User = "******"; dbInfo.Password = "******"; dbInfo.DatabaseName = "TestDatabase"; dbInfo.StartTime = new TimeSpan(4, 30, 0); dbInfo.AddUseDatabase = false; dbInfo.IncludeRoutines = true; dbHandler.InsertDatabaseNode(dbInfo); dbInfo.ID = Guid.NewGuid(); dbInfo.DatabaseName = "NewDatabase"; dbHandler.InsertDatabaseNode(dbInfo); Assert.IsTrue(1 < dbHandler.GetAllDatabaseNodes().Count); dbHandler.RemoveDatabaseNode(dbInfo.ID); dbHandler.RemoveDatabaseNode(tmpGuid); }
public void UpdateSpecificDatabaseNodeTest() { DatabasesXmlHandler dbHandler = new DatabasesXmlHandler(); DatabaseInfo dbInfo = new DatabaseInfo(); dbInfo.ID = Guid.NewGuid(); dbInfo.Host = "localhost"; dbInfo.User = "******"; dbInfo.Password = "******"; dbInfo.DatabaseName = "TestDatabase"; dbInfo.StartTime = new TimeSpan(4, 30, 0); dbInfo.AddUseDatabase = false; dbInfo.IncludeRoutines = true; dbHandler.InsertDatabaseNode(dbInfo); //modify the dbInfo start time dbInfo.StartTime = new TimeSpan(22, 59, 0); dbHandler.UpdateDatabaseNode(dbInfo); dbInfo = dbHandler.GetDatabaseNode(dbInfo.ID) ; Assert.AreEqual("22:59:00", dbInfo.StartTime.ToString()); dbHandler.RemoveDatabaseNode(dbInfo.ID); }
/// <summary> /// Schedules configured backups, and a daily cleanup task. /// </summary> public void ScheduleJobs() { LogHandler logHandler = new LogHandler(); List <DatabaseInfo> dbNodes = new DatabasesXmlHandler().GetAllDatabaseNodes(); if (0 == dbNodes.Count) { logHandler.LogMessage(LogHandler.MessageType.WARNING, "MySQL Backup Scheduler - No database nodes found. No backups will be scheduled."); } else { try { scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); foreach (DatabaseInfo dbNode in dbNodes) { //Schedule backup job IJobDetail backupJobDetail = JobBuilder.Create <CreateBackupJob>() .WithIdentity(dbNode.ID.ToString() + "_Job", "Backup") .UsingJobData(CreateBackupJob.Properties.DatabaseId.ToString(), dbNode.ID.ToString()) .Build(); ITrigger backupJobTrigger = TriggerBuilder.Create() .WithIdentity(dbNode.ID.ToString() + "_Trigger", "Backup") .StartAt(DateBuilder.TodayAt(dbNode.StartTime.Hours, dbNode.StartTime.Minutes, 0)) .WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever()) .Build(); scheduler.ScheduleJob(backupJobDetail, backupJobTrigger); logHandler.LogMessage(LogHandler.MessageType.INFO, "Backup job scheduled for database: " + dbNode.DatabaseName + " @ " + dbNode.Host); } //Schedule cleanup job IJobDetail cleanupJobDetail = JobBuilder.Create <DeleteOldBackupsJob>() .WithIdentity("Delete_Old_Job", "Cleanup") .Build(); ITrigger cleanupTrigger = TriggerBuilder.Create() .WithIdentity("Delete_Old_Trigger", "Cleanup") .StartAt(DateBuilder.TodayAt(1, 0, 0)) .WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever()) .Build(); scheduler.ScheduleJob(cleanupJobDetail, cleanupTrigger); logHandler.LogMessage(LogHandler.MessageType.INFO, "Cleanup job scheduled."); } catch (Exception ex) { logHandler.LogMessage(LogHandler.MessageType.ERROR, "Error scheduling backup jobs: " + ex.ToString()); } } }
/// <summary> /// Restores the database. /// </summary> /// <param name="dumpFilePath">The dump file path.</param> /// <param name="dbInfo">The database information.</param> public void RestoreDatabase(string dumpFilePath, Guid databaseId) { Process process = null; DatabaseInfo dbInfo = new DatabasesXmlHandler().GetDatabaseNode(databaseId); ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "mysql"; psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; psi.StandardOutputEncoding = Encoding.UTF8; psi.Arguments = string.Format(@"-u {0} -p{1} -h {2} -P{3}", dbInfo.User, dbInfo.Password, dbInfo.HostNoPort, dbInfo.Port); psi.UseShellExecute = false; psi.CreateNoWindow = true; process = Process.Start(psi); using (var stdin = new System.IO.StreamWriter(process.StandardInput.BaseStream, Encoding.UTF8)) using (var reader = System.IO.File.OpenText(@dumpFilePath)) { string line; while ((line = reader.ReadLine()) != null) { stdin.WriteLine(line); } stdin.Close(); } string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); bool isServerDown = false; if (!ErrorHandler.HasErrorOccured(error, ref isServerDown)) { new LogHandler().LogMessage(LogHandler.MessageType.INFO, "The database " + dbInfo.DatabaseName + ", has been restored, from this backup dump file '" + dumpFilePath + "'"); } if (process != null) { process.WaitForExit(); } }
public void RetrieveSpecificDatabaseNodeTest() { DatabasesXmlHandler dbHandler = new DatabasesXmlHandler(); DatabaseInfo dbInfo = new DatabaseInfo(); dbInfo.ID = Guid.NewGuid(); dbInfo.Host = "localhost"; dbInfo.User = "******"; dbInfo.Password = "******"; dbInfo.DatabaseName = "TestDatabase"; dbInfo.StartTime = new TimeSpan(4, 30, 0); dbInfo.AddUseDatabase = false; dbInfo.IncludeRoutines = true; dbHandler.InsertDatabaseNode(dbInfo); DatabaseInfo dbInfo2 = dbHandler.GetDatabaseNode(dbInfo.ID); Assert.AreEqual("TestDatabase", dbInfo2.DatabaseName); dbHandler.RemoveDatabaseNode(dbInfo.ID); }
public void RemoveSpecificDatabaseNodeTest() { DatabasesXmlHandler dbHandler = new DatabasesXmlHandler(); DatabaseInfo dbInfo = new DatabaseInfo(); dbInfo.ID = Guid.NewGuid(); dbInfo.Host = "localhost"; dbInfo.User = "******"; dbInfo.Password = "******"; dbInfo.DatabaseName = "TestDatabase"; dbInfo.StartTime = new TimeSpan(4, 30, 0); dbInfo.AddUseDatabase = false; dbInfo.IncludeRoutines = true; dbHandler.InsertDatabaseNode(dbInfo); dbHandler.RemoveDatabaseNode(dbInfo.ID); XElement document = XElement.Load(ConfigurationHandler.DB_CONFIG_FILE); var databaseNode = document .Elements("Database") .FirstOrDefault(x => x.Attribute("ID").Value == dbInfo.ID.ToString()); Assert.IsNull(databaseNode); }
/// <summary> /// Processes MySQL dump for the given database. /// </summary> /// <param name="databaseName">Name of the database.</param> public bool ProcessMySqlDump(Guid databaseId) { Boolean success = false; DatabaseInfo dbInfo = new DatabasesXmlHandler().GetDatabaseNode(databaseId); if (dbInfo != null) { System.Threading.Thread.Sleep(1000); //Let Application Sleep for 1 second, preventing multiple backup executions of the same database. Process process = null; if (!isServerDown) { string dumpOptions = " "; if (dbInfo.AddUseDatabase) { dumpOptions += "--databases "; } ; dumpOptions += string.Format(@"""{0}"" -u{1} -p{2} -h{3} -P{4} --add-drop-database --add-drop-table --add-locks --comments --create-options --dump-date --lock-tables" , dbInfo.DatabaseName , dbInfo.User , dbInfo.Password , dbInfo.HostNoPort , dbInfo.Port); if (dbInfo.IncludeRoutines) { dumpOptions += " --routines"; } ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "mysqldump"; psi.RedirectStandardInput = false; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; psi.StandardOutputEncoding = Encoding.UTF8; psi.Arguments = dumpOptions; psi.UseShellExecute = false; psi.CreateNoWindow = true; try { process = Process.Start(psi); //string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); if (!ErrorHandler.HasErrorOccured(error, ref this.isServerDown)) { string backupLocation; if (CreateBackupLocation(dbInfo.HostNoPort, dbInfo.DatabaseName, out backupLocation)) { this.WriteBackupFile(backupLocation, dbInfo.DatabaseName, process.StandardOutput); success = true; new LogHandler().LogMessage(LogHandler.MessageType.INFO, "Backup created of the database " + dbInfo.DatabaseName); } } } catch (Exception ex) { if (ex.Message.ToLower().Contains("cannot find the file")) { new LogHandler().LogMessage(LogHandler.MessageType.ERROR, @"The system could not find the MySQLDump.exe file. Please add the MySQL \bin path to your system's PATH variable."); } else { new LogHandler().LogMessage(LogHandler.MessageType.ERROR, @"Unknown exception occurred during backup: " + ex.ToString()); } } } if (process != null) { process.WaitForExit(); } } return(success); }