Когда дело доходит до управления базами данных в SQL Server, способность восстановить базу данных является важной. Будь то восстановление после катастрофы или просто откат к предыдущей точке во времени, надежный процесс восстановления является неотъемлемым. В этой статье мы рассмотрим некоторые варианты восстановления, доступные в SQL Server 2012, и как они могут сделать процесс восстановления более эффективным и гибким.
Генерация скрипта восстановления
В прошлом генерация скрипта восстановления на основе таблицы истории msdb была распространенным подходом. Однако с появлением SQL Server 2012 появились более мощные способы восстановления базы данных. Давайте рассмотрим тестовый скрипт, демонстрирующий эти новые варианты восстановления.
--Создание тестовой базы данных
CREATE DATABASE [Test] CONTAINMENT = NONE
ON PRIMARY ( NAME = N'Test', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB )
LOG ON ( NAME = N'Test_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [Test] SET RECOVERY FULL
GO
ALTER DATABASE [Test] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [Test] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
SET NOCOUNT ON
GO
USE [Test]
GO
--Создание таблицы
CREATE TABLE mytest (a int, b char(10))
GO
--Создание полного резервного копирования
PRINT convert(varchar(101),getdate(),113)
PRINT '--Создано полное резервное копирование 1'
BACKUP DATABASE [Test] TO DISK = 'C:\temp\backup\Test_full_1.bak'
GO
--Вставка пакета - 1
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '--Вставка пакета - 1'
INSERT INTO mytest VALUES(1, '1')
GO 5
--Создание дифференциального резервного копирования 2
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '----Создание дифференциального резервного копирования 2'
BACKUP DATABASE [Test] TO DISK = 'C:\temp\backup\Test_diff_2.bak' WITH DIFFERENTIAL
GO
--Вставка пакета - 2
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '--Вставка пакета - 2'
INSERT INTO mytest VALUES(2, '2')
GO 5
--Создание журнального резервного копирования 3
PRINT convert(varchar(101),getdate(),113)
PRINT '------Создание журнального резервного копирования 3'
BACKUP LOG [Test] TO DISK = N'C:\temp\backup\Test_log_3.trn'
GO
--Вставка пакета - 3
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '--Вставка пакета - 3'
INSERT INTO mytest VALUES(3, '3')
GO 5
--Создано полное резервное копирование 4
PRINT convert(varchar(101),getdate(),113)
PRINT '--Создано полное резервное копирование 4'
BACKUP DATABASE [Test] TO DISK = 'C:\temp\backup\Test_full_4.bak'
GO
--Вставка пакета - 4
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '--Вставка пакета - 4'
INSERT INTO mytest VALUES(4, '4')
GO 5
--Создание журнального резервного копирования 5
PRINT convert(varchar(101),getdate(),113)
PRINT '------Создание журнального резервного копирования 5'
BACKUP LOG [Test] TO DISK = N'C:\temp\backup\Test_log_5.trn'
GO
--Вставка пакета - 5
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '--Вставка пакета - 5'
INSERT INTO mytest VALUES(5, '5')
GO 5
--Создание дифференциального резервного копирования 6
PRINT convert(varchar(101),getdate(),113)
PRINT '----Создание дифференциального резервного копирования 6'
BACKUP DATABASE [Test] TO DISK = 'C:\temp\backup\Test_diff_6.bak' WITH DIFFERENTIAL
GO
--Вставка пакета - 6
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '--Вставка пакета - 6'
INSERT INTO mytest VALUES(6, '6')
GO 5
--Создание журнального резервного копирования 7
PRINT convert(varchar(101),getdate(),113)
PRINT '------Создание журнального резервного копирования 7'
BACKUP LOG [Test] TO DISK = N'C:\temp\backup\Test_log_7.trn'
GO
--Вставка пакета - 7
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '--Вставка пакета - 7'
INSERT INTO mytest VALUES(7, '7')
GO 5
--Создание журнального резервного копирования 8
PRINT convert(varchar(101),getdate(),113)
PRINT '------Создание журнального резервного копирования 8'
BACKUP LOG [Test] TO DISK = N'C:\temp\backup\Test_log_8.trn'
GO
--Вставка пакета - 8
WAITFOR DELAY '0:01:00'
PRINT convert(varchar(101),getdate(),113)
PRINT '--Вставка пакета - 8'
INSERT INTO mytest VALUES(8, '8')
GO 5
SET NOCOUNT OFF
GO
Использование интерфейса восстановления в SQL Server Management Studio
В SQL Server Management Studio (SSMS) есть новый интерфейс для восстановления баз данных. Чтобы получить к нему доступ, просто щелкните правой кнопкой мыши на нужной базе данных, выберите “Задачи”, затем “Восстановление” и, наконец, “База данных”. Это откроет окно восстановления с различными параметрами.
В верхней части окна вы заметите сообщение, указывающее, что по умолчанию будет выполнено резервное копирование журнала хвоста. Это полезно, если вы хотите восстановить базу данных до текущей точки во времени. В разделе “Параметры” вы можете указать путь к файлу резервного копирования журнала хвоста.
Вы можете выбрать источ