Резервное копирование и восстановление файловой группы базы данных SQL Server

Я использую sql-сервер и имею огромную базу данных, разбитую по дате в нескольких группах файлов. файловые группы базы данных PRIMARY, FG2010, FG2011, FG2012, FG2013, and FG2014, что FG2010, FG2011, FG2012 и FG2013 являются readonly.

Теперь сценарий резервного копирования:

каждую пятницу вы получаете полную резервную копию в 2:00 утра

каждый день на неделе, кроме пятницы, получают дифференциальную резервную копию в 2:00 утра

Я хочу изменить этот сценарий на:

получить полную резервную копию базы данных (один раз)

получить полную резервную копию PRIMARY и FG2014 каждую пятницу в 2:00 утра

получить дифференциальную резервную копию PRIMARY и FG2014 каждый день, кроме пятницы в 2:00 утра

Вопросы 1: Можно ли использовать этот сценарий?

У меня тоже есть план восстановления. каждый день я копирую файл резервной копии на другой сервер автоматически по заданию, а затем восстанавливаю его, чтобы иметь план тестирования восстановления, а также использовать восстановленную базу данных для пользователей разработчиков и тестировщиков.

Я хочу иметь следующий сценарий для плана восстановления:

восстановить полную резервную копию базы данных.

восстановить последнюю полную резервную копию PRIMARY и FG2014.

восстановить последнюю дифференциальную резервную копию PRIMARY и FG2014.

Вопрос 2: Могу ли я использовать этот сценарий для плана восстановления?

Вопрос 3: Могу ли я иметь лучший сценарий для резервного копирования и восстановления?

Пожалуйста, ответьте на мой вопрос с помощью запроса TSQL.

Ответ 1

Q1. Да, ты можешь. Вам также необходимо будет выполнять регулярные резервные копии журнала транзакций.

Q2. Да, это также будет работать для стратегии восстановления, снова вам нужно будет делать резервные копии журнала транзакций.

Q3. Поскольку вы используете резервные копии для создания базы данных разработки, я бы придерживался этого. Существуют такие варианты, как отправка журналов, но я бы не реализовал их, чтобы база данных разработки обновлялась с производства.

Я написал несколько демо-скриптов, которые можно использовать для запуска сценария, предложенного в вашем локальном экземпляре.

Сценарии будут: -

  • Создайте тестовую базу данных с несколькими файловыми группами, некоторые из которых доступны только для чтения.
  • Создайте базу данных разработки из резервной копии тестовой базы данных.
  • Возьмите резервные копии файловой группы тестовой базы данных и восстановите базу данных разработки

Пожалуйста, просмотрите и просмотрите сценарии. Дайте мне знать, если у вас есть вопросы.

Прежде чем использовать скрипты, просто убедитесь, что на вашем компьютере есть следующие пути к файлу: -

C:\SQLServer\Data
C:\SQLServer\Logs
C:\SQLServer\Backups

Версия SQL Server, которую я использую, - это выпуск 2012 SP2 CU2 Developer Edition.

Сначала создайте тестовую базу данных: -

CREATE DATABASE [FGRestoreTEST]
 ON  PRIMARY 
( NAME = N'FGRestoreTEST', FILENAME = N'C:\SQLServer\Data\FGRestoreTEST.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2010] 
( NAME = N'FG2010', FILENAME = N'C:\SQLServer\Data\FG2010.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2011] 
( NAME = N'FG2011', FILENAME = N'C:\SQLServer\Data\FG2011.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2012] 
( NAME = N'FG2012', FILENAME = N'C:\SQLServer\Data\FG2012.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2013] 
( NAME = N'FG2013', FILENAME = N'C:\SQLServer\Data\FG2013.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), 
 FILEGROUP [FG2014] 
( NAME = N'FG2014', FILENAME = N'C:\SQLServer\Data\FG2014.ndf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'FGRestoreTEST_log', FILENAME = N'C:\SQLServer\Logs\FGRestoreTEST_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

Затем создайте таблицы в каждой из файловых групп: -

USE [FGRestoreTEST];
GO

CREATE TABLE [PRIMARY_TABLE]
(ID INT,
 NAME CHAR(4)) ON [PRIMARY];

CREATE TABLE [FG2010_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2010];

 CREATE TABLE [FG2011_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2011];

CREATE TABLE [FG2012_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2012];

CREATE TABLE [FG2013_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2013];

CREATE TABLE [FG2014_TABLE]
(ID INT,
 NAME CHAR(4)) ON [FG2014];
 GO

Вставьте данные (100 строк) в каждую из таблиц: -

INSERT INTO [PRIMARY_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2010_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2011_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2012_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2013_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2014_TABLE]
SELECT 1, 'TEST'
GO 100

Затем установите определенные файловые группы только для чтения: -

ALTER DATABASE [FGRestoreTEST]
MODIFY FILEGROUP [FG2010] READ_ONLY;

ALTER DATABASE [FGRestoreTEST]
MODIFY FILEGROUP [FG2011] READ_ONLY;

ALTER DATABASE [FGRestoreTEST]
MODIFY FILEGROUP [FG2012] READ_ONLY;

ALTER DATABASE [FGRestoreTEST]
MODIFY FILEGROUP [FG2013] READ_ONLY;
GO

Сделайте полную резервную копию: -

USE [master];
GO

BACKUP DATABASE [FGRestoreTEST]
TO DISK = N'C:\SQLServer\Backups\FGRestoreTEST.BAK';
GO

Затем создайте базу данных разработки из полной резервной копии (это будет использовано для восстановления резервных копий файловой группы, которые будут приняты далее): -

RESTORE DATABASE [FGRestoreTEST_Dev]
FROM DISK = N'C:\SQLServer\Backups\FGRestoreTEST.BAK' WITH
MOVE 'FGRestoreTEST' TO 'C:\SQLServer\Data\FGRestoreTEST_Dev.mdf',
MOVE 'FG2010' TO 'C:\SQLServer\Data\FG2010_Dev.ndf',
MOVE 'FG2011' TO 'C:\SQLServer\Data\FG2011_Dev.ndf',
MOVE 'FG2012' TO 'C:\SQLServer\Data\FG2012_Dev.ndf',
MOVE 'FG2013' TO 'C:\SQLServer\Data\FG2013_Dev.ndf',
MOVE 'FG2014' TO 'C:\SQLServer\Data\FG2014_Dev.ndf',
MOVE 'FGRestoreTEST_log' TO 'C:\SQLServer\Logs\FGRestoreTEST_Dev_log.ldf',
RECOVERY,STATS=5;
GO

Сделайте резервные копии каждой из файловых групп: -

--http://msdn.microsoft.com/en-us/library/ms189906.aspx
BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'PRIMARY'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_PRIMARY.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2010'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2010.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2011'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2011.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2012'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2012.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2013'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_G2013.bak';

BACKUP DATABASE [FGRestoreTEST]
   FILEGROUP = 'FG2014'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2014.bak';
GO

Теперь мы будем изменять данные в первичных и FG2014 файловых группах: -

USE [FGRestoreTEST];
GO

INSERT INTO [PRIMARY_TABLE]
SELECT 1, 'TEST'
GO 100

TRUNCATE TABLE [FG2014_TABLE];
GO

Возьмите дифференциальные резервные копии файловых групп: -

BACKUP DATABASE [FGRestoreTest]
   FILEGROUP = 'PRIMARY'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTest_PRIMARYDIFF.bak'
   WITH DIFFERENTIAL;

BACKUP DATABASE [FGRestoreTest]
   FILEGROUP = 'FG2014'
   TO DISK = 'C:\SQLServer\Backups\FGRestoreTest_FG2014DIFF.bak'
   WITH DIFFERENTIAL;
GO

Снова измените данные: -

USE [FGRestoreTEST];
GO

INSERT INTO [PRIMARY_TABLE]
SELECT 1, 'TEST'
GO 100

INSERT INTO [FG2014_TABLE]
SELECT 1, 'NEW'
GO 300

Резервное копирование журнала транзакций (вероятно, у вас будет более одного из них в реальной жизненной среде, но для демонстрационных целей я просто беру один): -

USE [master];
GO

BACKUP LOG [FGRestoreTEST]
TO DISK = 'C:\SQLServer\Backups\FGRestoreTest_LogBackup.trn';
GO

ОК, теперь мы можем восстановить базу данных разработки. Сначала мы берем резервную копию журнала Tail Log, восстанавливая базу данных. Примечание: - мы не будем использовать эту резервную копию!

BACKUP LOG [FGRestoreTEST_Dev]
TO DISK = 'C:\SQLServer\Backups\FGRestoreTest_TailLogBackup.trn'
WITH NORECOVERY;
GO

Теперь мы можем восстановить полные резервные копии файловых групп read-write: -

--http://msdn.microsoft.com/en-us/library/aa337540.aspx
--Restore primary filegroup
RESTORE DATABASE [FGRestoreTEST_Dev]
   FILEGROUP = 'PRIMARY'
   FROM DISK = 'C:\SQLServer\Backups\FGRestoreTEST_PRIMARY.bak'
   WITH NORECOVERY;
GO

--Restore FG2014 filegroup 
RESTORE DATABASE [FGRestoreTEST_Dev]
   FILEGROUP = 'FG2014'
   FROM DISK = 'C:\SQLServer\Backups\FGRestoreTEST_FG2014.bak'
   WITH NORECOVERY;
GO

Затем дифференциальные резервные копии: -

--Restore PRIMARY differential backup
RESTORE DATABASE [FGRestoreTEST_Dev]
   FILEGROUP = 'PRIMARY'
   FROM DISK = 'C:\SQLServer\Backups\FGRestoreTest_PRIMARYDIFF.bak'
   WITH NORECOVERY;
GO

--Restore FG2014 differential backup
RESTORE DATABASE [FGRestoreTEST_Dev]
   FILEGROUP = 'FG2014'
   FROM DISK = 'C:\SQLServer\Backups\FGRestoreTest_FG2014DIFF.bak'
   WITH NORECOVERY;
GO

Затем резервное копирование журнала транзакций: -

RESTORE LOG [FGRestoreTEST_Dev]
FROM DISK = 'C:\SQLServer\Backups\FGRestoreTest_LogBackup.trn'
WITH NORECOVERY;
GO

Наконец, база данных может быть восстановлена: -

RESTORE DATABASE [FGRestoreTest_DEV] WITH RECOVERY;
GO

И как окончательный тест, проверьте данные: -

USE [FGRestoreTEST_Dev];
GO

SELECT COUNT(*) AS [PRIMARY_TABLE]
FROM [PRIMARY_TABLE];

SELECT COUNT(*) AS [FG2010_TABLE]
FROM [FG2010_TABLE];

SELECT COUNT(*) AS [FG2011_TABLE]
FROM [FG2011_TABLE];

SELECT COUNT(*) AS [FG2012_TABLE]
FROM [FG2012_TABLE];

SELECT COUNT(*) AS [FG2013_TABLE]
FROM [FG2013_TABLE];

SELECT COUNT(*) AS [FG2014_TABLE]
FROM [FG2014_TABLE];

SELECT TOP (1) *
FROM [FG2014_TABLE];
GO

Итак, из сделанных изменений данных мы ожидаем увидеть 300 записей в файловых группах PRIMARY и FG2014, 100 в остальном и все значения в столбце имен в FG2014, установленном как "NEW".

Ответ 2

A1: Да, вы можете иметь этот сценарий, однако стратегия резервного копирования не обеспечивает непрерывный способ восстановления FG2010 до 2013 года, если есть необходимость, поскольку существует только однократная резервная копия базы данных FULL.

A2: Да, с некоторой настройкой. То, что вы хотите реализовать, называется поэтапным восстановлением, и основная часть требуемой инструкции для требуемого метода может быть найдена в онлайн-приложении "Книги": Поэтапное восстановление только Некоторые файловые группы.

Ключевое различие заключается в том, что вы будете восстанавливать ранее восстановленную полную резервную копию базы данных, а не живую базу данных, у которой возникла проблема с определенными файловыми группами.

Вы должны легко создать тестовый пример/доказательство концепции для своих нужд быстро, используя приведенную выше ссылку. Если вы застряли, добавьте вашу попытку/код на вопрос, и хорошие члены сообщества здесь предоставят рекомендации. С небольшим усилием от вас и в каком-то направлении от сообщества, я уверен, вы можете ответить на свой вопрос. Научите человека ловить рыбу и все это........