public void ProgressiveRestore() { var restore = new Restore(Source, Test) { FileRelocator = RestoreFileRelocator }; int seconds; decimal?lastLsn = null; // Restore the database and subsequent log files do { var timer = new Stopwatch(); timer.Start(); Source.LogBackup(); lastLsn = restore.AgDbRestore(lastLsn); timer.Stop(); seconds = timer.Elapsed.Seconds; } while(seconds > 5); // Do things here to disconnect users: Set single user mode, signal the service etc. Source.RestrictedUserMode(); // Hopefully a quick backup and restore. Source.LogBackup(); restore.Finalize = true; restore.AgDbRestore(lastLsn); // The database is migrated Source.MultiUserMode(); Test.Delete(); }
private static void Main(string[] args) { var builder = new ConfigurationBuilder() .AddCommandLine(args); var arguments = builder.Build().Get <MoveArgs>(); var from = new AgDatabase(arguments.From); var to = new AgDatabase(arguments.To); // TODO: This should be baked into the restore class. We have a property for it. if (arguments.Overwrite) { to.Delete(); } Console.WriteLine("Beginning restore..."); var restore = new Restore(from, to) { CopyLogins = arguments.CopyLogins, FileRelocator = fileName => RestoreFileRelocator(from.Name, to.Name, fileName), Finalize = arguments.Finalize, Overwrite = arguments.Overwrite }; from.LogBackup(); restore.AgDbRestore(); Console.WriteLine("Restore completed."); Console.WriteLine("Deleting source."); from.Delete(); Console.WriteLine("Source deleted"); }
public void RestoreAndCleanup() { Assert.False(Test.Exists()); var restore = new Restore(Source, Test) { Finalize = true, CopyLogins = true, FileRelocator = RestoreFileRelocator }; restore.AgDbRestore(); Assert.True(Test.Exists()); Test.Delete(); Assert.False(Test.Exists()); }
public void DetectsInitializing() { // Restore databases across AG instances Assert.False(Test.Exists()); var restore = new Restore(Source, Test) { Finalize = false, FileRelocator = RestoreFileRelocator }; restore.AgDbRestore(); // Restore with recovery primary Test.FinalizePrimary(); // Write sufficient data to the primary var connectionStringBuilder = new SqlConnectionStringBuilder(_testRestoreFixture._config.To.ConnectionString); connectionStringBuilder.InitialCatalog = Test.Name; using (var connection = new SqlConnection(connectionStringBuilder.ToString())) { connection.Open(); var createTableSql = "CREATE TABLE TestSync (Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, script VARCHAR(MAX) NULL)"; using (var createTable = new SqlCommand(createTableSql, connection)) { createTable.ExecuteNonQuery(); } var fillTableSql = "INSERT INTO TestSync (script) (SELECT TOP 100000 sm.[definition] FROM sys.all_sql_modules AS sm CROSS JOIN sys.all_sql_modules AS asm)"; using (var fillTable = new SqlCommand(fillTableSql, connection)) { fillTable.ExecuteNonQuery(); } } Test.JoinAg(); Assert.True(Test.IsInitializing()); Test.Delete(); }