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();
        }
Exemple #2
0
        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();
        }