Доброго
времени суток, коллеги.
В данной
статье будет рассмотрены методы резервного копирования и восстановления баз
данных MS
SQL
2012. Сразу хочу отметить, что статья не будет затрагивать стратегию резервного
копирования и восстановления, ибо она различна для каждой организации и
формируется индивидуально, согласно требованиям бизнеса.
Статья
будет состоять из следующих пунктов:
1. Резервное копирование MS SQL 2012
1.1.Полное резервное копирование базы данных (Full Backup).
1.2. Разностное резервное копирование (Differential backup)
1.3. Резервное копирование журнала транзакций (Transaction Log Backup)
1.4. Резервное копирование файлов и файловых групп (Backup Filegroups, Backup Files)
1.5. Резервное копирование системных баз данных.
2. Восстановление MS SQL 2012
2.1. Восстановление базы из полной резервной копии (Restore Full Database)
2.2. Восстановление базы данных из разностной резервной копии (Restore Differential
Backup)
2.3. Восстановление журнала транзакций (Restore Log Transaction)
2.4. Восстановление работы базы данных с поврежденным логом транзакций.
2.5. Восстановление базы данных до определённого момента
2.6. Восстановление файлов и файловых групп
(Restore Files, Restore Filegroups)
2.7. Восстановление системных баз данных.
2.7.1. Восстановление системных баз, в случае доступности
службы SQL.
2.7.2. Восстановление системных баз, в случае недоступности службы SQL .
1. Резервное копирование баз данных MS SQL 2012.
Договоримся, что все прочие параметры (например, compression, reliability и т.п.) будем использовать по умолчанию.
Также договоримся, что будем использовать полную модель восстановления (Recovery model – Full). Резервные копии будут храниться на сетевой папке «\\vniz-tst-bkp01.test.local\Backup_SQL\»
База будет состоять из двух файловых групп «Secondary и Primary» по два файла в каждой: Test_Recovery1
и Test_Recovery2, Test_Recovery_s1 и Test_Recovery_s2 соответственно.
Создадим две таблицы «Table_primary» и «Table_secondary» для каждой файловой группы и заполним их
произвольными данными:
USE
Test_Recovery
CREATE TABLE Table_primary (
number INTEGER,
test TEXT,
nickname TEXT,
name TEXT,
ter INTEGER,
)
on
'PRIMARY'
INSERT
INTO Table_primary (number,test,nickname,name,ter)
VALUES
(1000,'Test1', 'Munserat', 'Alex',42),
(1001,'Test2','Yulkau', 'Yulkau',40),
(1002,'Test3','Djecka','Eugene',13),
(1003,'Test4','Fritzfak','Eugene',45),
(1004,'Test5','Monax','Egor',11);
--COMMIT;
CREATE TABLE Table_secondary (
number INTEGER,
test TEXT,
nickname TEXT,
name TEXT,
ter INTEGER,
)
on
'SECONDARY'
INSERT
INTO Table_secondary (number,test,nickname,name,ter)
VALUES
(1100, 'SEC1', 'Moscow', 'Table',14),
(1101, 'SEC2', 'Saransk', 'Only',88),
(1102, 'SEC3', 'Torbeevo', 'You',20),
(1103, 'SEC4', 'Atyashevo', 'Dear',04),
(1104, 'SEC5', 'Chamzinka', 'Colleagues',45);
--COMMIT;
1.1. Полное резервное копирование базы данных (Full Backup).
Полная резервная копия содержит файлы данных и часть журнала
транзакций и представляет собой базу данных на момент создания резервной копии
и служит основным источником данных при восстановлении. В момент полного резервного копирования сервером MS SQL выполняются
следующие действия:
- Резервное копирование всех данных в базе.
- Резервное копирование всех изменений, который возникают во время выполнения резервного копирования
- Резервное копирование всех транзакций, не зафиксированных в журнале транзакций.
Приступим к полному резервному копированию используя «SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Backup»
Откроется окно «Back Up Database – Test_Recovery».
В разделе «Destination» удаляем путь резервного копирования кнопкой «Remove» и добавляем новое место «\\vniz-tst-bkp01.test.local\Backup_SQL\Full_Test_Recovery.bak»
кнопкой «Add»
В пункте «Backup type» выбираем «Full». Нажимаем «Ок».
Резервное копирование успешно выполнится.
Рассмотрим полное резервное копирование используя Transact-SQL
(T-SQL)
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»:
В появившемся окне вводим:
USE Test_Recovery
GO
BACKUP
DATABASE Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Full_Test_Recovery.bak'
GO
Резервное копирование успешно выполнится.
1.2. Разностное резервное копирование (Differential backup)
Разностное резервное копирование содержит все изменения базы данных с
момента полного резервного копирования.
Данную копию невозможно восстановить на базу без ее полной резервной копии.
С каждым запуском разностного резервного копирования, размер резервной копии
будет расти, ибо количество транзакций с момента полного резервного копирования
будет увеличиваться во времени.
В момент полного резервного копирования сервером MS SQL выполняются
следующие действия:
- Создание резервных копий баз данных, которые изменились с момента полного резервного копирования базы
- Создание резервных копий всех операций, происходивших во время разностного резервного копирования, а также всех транзакций не зафиксированных в журнале транзакций.
USE
Test_Recovery
CREATE TABLE Table_Diff (
number INTEGER,
test TEXT,
nickname TEXT,
name TEXT,
ter INTEGER,
)
INSERT
INTO Table_Diff (number,test,nickname,name,ter)
VALUES
(2100, 'Diff1', 'Lok', 'Table',47),
(2101, 'Diff2', 'Tok', 'Only',78),
(2102, 'Diff3', 'Kot', 'You',24),
(2103, 'Diff4', 'Kol', 'Dear',22),
(2104, 'Diff5', 'Don', 'Colleagues',46);
--COMMIT;
Приступим к разностному резервному копированию
используя «SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Backup»
Откроется окно «Back Up Database – Test_Recovery».
В разделе «Destination» удаляем путь резервного копирования кнопкой «Remove» и добавляем новое место «\\vniz-tst-bkp01.test.local\Backup_SQL\Diff1_Test_Recovery.bak» кнопкой «Add»
В пункте «Backup type» выбираем «Differential». Нажимаем «Ок».
Резервное копирование успешно выполнится.
Рассмотрим разностное резервное копирование используя Transact-SQL
(T-SQL).
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»:
В появившемся окне вводим:
USE Test_Recovery
GO
BACKUP
DATABASE Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Diff1_Test_Recovery.bak'
WITH DIFFERENTIAL;
GO
Резервное копирование успешно выполнится.
Проверим утверждение о росте разностной резервной
копии при увеличении транзакций без использования полного резервного
копирования.
Создадим еще одну таблицу:
CREATE
TABLE Table_Table_Diff2 (
Table_Table_Diff2ID
INTEGER NOT NULL IDENTITY(1, 1),
Test VARCHAR(MAX) NULL,
name VARCHAR(255) NULL,
email VARCHAR(255) NULL,
name2 VARCHAR(255) NULL,
name3 VARCHAR(255) NULL,
name4 VARCHAR(255) NULL,
name5 VARCHAR(255) NULL,
name6 VARCHAR(255) NULL,
name7 VARCHAR(255) NULL,
name8 VARCHAR(255) NULL,
name9 VARCHAR(255) NULL,
name10 VARCHAR(255) NULL,
PRIMARY KEY (Table_Table_Diff2ID)
);
GO
Заполним ее случайными данными, я
воспользовался генератором случайных данных для таблиц MS SQL тут.
Делаем разностное резервное копирование:
USE Test_Recovery
GO
BACKUP
DATABASE Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Diff2_Test_Recovery.bak'
WITH DIFFERENTIAL;
GO
Видим, что файл резервной копии увеличился.
Теперь делаем полное резервное копирование, после
чего - разностное:
USE
Test_Recovery
GO
BACKUP
DATABASE Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Full2_Test_Recovery.bak'
GO
USE
Test_Recovery
GO
BACKUP
DATABASE Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Diff3_Test_Recovery.bak'
WITH DIFFERENTIAL;
GO
Видим, что размер разностной резервной копии уменьшился:
Из этого примера видно, что не следует
злоупотреблять разностным резервным копированием, без полного резервного
копирования. Ибо в какой-то момент времени разностная резервная копия станет
больше полной резервной копии базы и все преимущество разностного резервного
копирования, такие как быстрое восстановление и меньшее место на диске,
пропадут.
1.3. Резервное копирование журнала транзакций (Transaction Log Backup)
Резервные копии журнала транзакций содержат все изменения базы данных, при
первичном резервном копировании лога транзакций, либо изменения с последней
успешной резервной копии журнала транзакций.
Резервное копирование лога транзакций не следует выполнять, если хотя бы
раз не выполнялось полное резервное копирование, ибо данную резервную копию
лога при отсутствии полной резервной копии невозможно будет восстановить.
В момент полного резервного копирования сервером MS SQL выполняются
следующие действия:
- Создается резервная копия журнала транзакций от прошедшего последнего успешно выполненного резервного копирования лога до конца текущего.
- Очищаются части журнала транзакций до начала активной части и отбрасываются сведения в неактивной части.
Приступим к резервному копированию лога транзакций используя
«SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Backup»
Откроется окно «Back Up Database – Test_Recovery».
В разделе «Destination» удаляем путь резервного копирования кнопкой «Remove» и добавляем новое место «\\vniz-tst-bkp01.test.local\Backup_SQL\Log_Test_Recovery.bak» кнопкой «Add»
В пункте «Backup type» выбираем «Transaction Log». Нажимаем «Ок».
Резервное копирование успешно выполнится.
Рассмотрим резервное копирование лога транзакций
используя Transact-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»:
USE
Test_Recovery
GO
BACKUP
LOG Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Log_Test_Recovery.bak'
GO
Создадим таблицу и сделаем еще одну копию журнала
транзакций:
CREATE
TABLE Table_Log2 (
number INTEGER,
test TEXT,
nickname TEXT,
name TEXT,
ter INTEGER,
)
INSERT
INTO Table_Log2 (number,test,nickname,name,ter)
VALUES
(1488, 'Log1', 'Lok2', 'Table',55),
(1489, 'Log2', 'Tok2', 'Only',56),
(1490, 'Log3', 'Kot2', 'You',57),
(1491, 'Log4', 'Kol2', 'Dear',58),
(1492, 'Log5', 'Don2', 'Colleagues',59);
--COMMIT;
USE
Test_Recovery
GO
BACKUP
LOG Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Log2_Test_Recovery.bak'
GO
Создадим еще одну таблицу и повторно сделаем резервное
копирование журнала транзакций:
CREATE
TABLE Table_Log3 (
number INTEGER,
test TEXT,
nickname TEXT,
name TEXT,
ter INTEGER,
)
INSERT
INTO Table_Log3 (number,test,nickname,name,ter)
VALUES
(1388, 'Log10', 'Lok20', 'Table',355),
(1389, 'Log20', 'Tok20', 'Only',356),
(1390, 'Log30', 'Kot20', 'You',357),
(1391, 'Log40', 'Kol20', 'Dear',358),
(1392, 'Log50', 'Don20', 'Colleagues',359);
--COMMIT;
USE
Test_Recovery
GO
BACKUP
LOG Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Log3_Test_Recovery.bak'
GO
В итоге получаем три файла резервной копии журнала
транзакции: Log_Test_Recovery.bak, Log2_Test_Recovery.bak, Log3_Test_Recovery.bak. Они нам пригодятся в будущем.
Описывая резервное копирование лога транкзаций нельзя
не упомянуть о резервных копиях заключительного фрагмента журнала (Tail-Log
Backups)
В резервную копию заключительного фрагмента
журнала попадают все записи, резервная копия которых еще не была создана
(заключительный фрагмент журнала), что позволяет предотвратить потерю работы и
сохранить неповрежденную цепочку журналов. Для восстановления базы данных
SQL Server на последний момент времени необходимо предварительно выполнить
резервное копирование заключительного фрагмента журнала ее
транзакций. Заключительный фрагмент журнала становится последней
рассматриваемой частью резервной копии в плане восстановления базы данных.
Более подробнее описано тут.
1.4. Резервное копирование файлов и файловых групп (Backup Filegroups, Backup Files)
Файловые группы
представляют собой именованные коллекции файлов и используются для упрощения
размещения данных и выполнения задач администрирования, например резервного
копирования и восстановления. Более подробнее про файловые группы можно
прочитать тут.
Т.к. Файлы журналов
не могут входить в состав файловых групп. Управление пространством журнала
отделено от управления пространством данных, то возможно лишь полное и
разностное резервное копирование файлов и файловых групп. Здесь будет рассмотрено
полное резервное копирование файловых групп и файлов в файловой группе.
Разностное резервное копирование файлов и файловых групп аналогично разностному
резервному копированию базы данных.
Приступим к резервному копированию файловой группы «PRIMARY» используя «SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Backup»
Откроется окно «Back Up Database – Test_Recovery».
В разделе «Backup component» выбираем «Files and Filegroup». В появившемся окне выбираем
файловую группу «PRIMARY»
файловую группу «PRIMARY»
В разделе «Destination» удаляем путь резервного копирования кнопкой
«Remove» и добавляем новое место «\\vniz-tst-bkp01.test.local\Backup_SQL\Prim_Test_Recovery.bak» кнопкой «Add». Нажимаем «Ок»
Резервное копирование успешно выполнится.
Приступим к резервному копированию файла «Test_Recovery_s2» в файловой группе «SECONDARY» используя «SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Backup»
Откроется окно «Back Up Database – Test_Recovery».
В разделе «Backup component» выбираем «Files and Filegroups». В появившемся окне выбираем нужный нам файл «Test_Recovery_s2»
В разделе «Destination» удаляем путь резервного копирования кнопкой «Remove» и добавляем новое место «\\vniz-tst-bkp01.test.local\Backup_SQL\Sec_s2_Test_Recovery.bak» кнопкой «Add». Нажимаем «Ок»
Приступим к резервному копированию файла и файловой группы, используя T-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»:
USE
Test_Recovery
GO
BACKUP
DATABASE Test_Recovery
FILEGROUP = 'PRIMARY'
TO DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Prim_Test_Recovery.bak'
GO
Для файла:
USE
Test_Recovery
GO
BACKUP
DATABASE Test_Recovery
FILE
= 'Test_Recovery_s2'
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Sec_s2_Test_Recovery.bak';
GO
1.5. Резервное копирование системных баз данных. (Backup System Databases)
Выполнять резервное копирование системных баз (master,
msdb, model) MS SQL следует постоянно, особенно перед и после каждого их
изменения.
Резервное копирование базы master. В этой системной базе содержатся все
сведения обо всех базах данных в MS SQL. Следует проводить процедуру резервного
копирования данной базы всякий раз, когда создаются, удаляются и изменяются
пользовательские базы данных.
Резервное копирование базы msdb. В этой базе содержатся сведения о
заданиях и операторах, которые использует агент сервера MS SQL. Следует проводить процедуру резервного копирования при добавлении задания
агенту сервера MS SQL.
Резервное копирование базы model. Данная база используется в качестве шаблона для всех баз
данных, созданных для экземпляра SQL Server. Следует проводить процедуру
резервного копирования, при изменении настройки самой базы model.
Резервное копирование базы Resource. Resource - доступная только для чтения база данных, которая
содержит все системные объекты, включенные в SQL Server. База данных Resource находится
в файле mssqlsystemresource.mdf, в котором содержится только код. Поэтому
SQL Server не может создать резервную копию базы данных Resource. Исходя
из того, что файл mssqlsystemresource.mdf является простым двоичным файлом
(EXE), а не файлом базы данных, для создания его резервной копии можно
выполнить простое резервное копирование файла или диска.
Резервное копирование базы Tempdb производить не следует, ибо она
уничтожается и создается при каждом рестарте экземпляра MS SQL.
Для данных баз данных рекомендуется полное резервное
копирование, методы описаны выше.
BACKUP
DATABASE master
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Master_1.bak'
GO
BACKUP
DATABASE model
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Model_1.bak'
GO
BACKUP
DATABASE msdb
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Msdb_1.bak'
GO
Сделаем еще один раз полное резервное копирование базы
данных:
USE
Test_Recovery
GO
BACKUP
DATABASE Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Full3_Test_Recovery.bak'
GO
USE Test_Recovery
GO
На рисунке ниже изображена схема резервного
копирования на моменты времени t0-t13.
Таблица1. Соответствие таблиц базы данных на
определённый момент времени:
Временной
интервал
|
Имя резервной копии
|
Таблицы в базе
данных
|
t0
|
-
|
-
|
t1
|
Full_Test_Recovery
|
Table_primary,
Table_secondary
|
t2
|
Diff_Test_Recovery
|
Table_primary,
Table_secondary
Table_Diff
|
t3
|
Diff2_Test_Recovery
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
|
t4
|
Full2_Test_Recovery
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
|
t5
|
Diff3_Test_Recovery
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
|
t6
|
Log_Test_Recovery
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
|
t7
|
Log2_Test_Recovery
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
Table_Log2
|
t8
|
Log3_Test_Recovery
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
Table_Log2
Table_Log3
|
t9
|
Prim_Test_Recovery.bak
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
Table_Log2
Table_Log3
|
t10
|
Sec_s2_Test_Recovery.bak
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
Table_Log2
Table_Log3
|
t11
|
Full3_Test_Recovery.bak
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
Table_Log2
Table_Log3
|
t12
|
-
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
Table_Log2
Table_Log3
Table_Tail1
|
t13
|
TailLog1_Test_Recovery.bak
|
Table_primary,
Table_secondary
Table_Diff
Table_Diff2
Table_Table_Diff2
Table_Log2
Table_Log3
|
2. Восстановление баз данных MS SQL 2012.
Восстановление базы из резервной копии — это
процесс копирования данных из резервной копии и применения журналов транзакций
для наката до целевой точки восстановления.
- На стадии копирования данных производится копирование всех страниц данных, журнала и индекса с резервного носителя в файлы базы данных.
- На стадии повтора журнальные транзакции применяются к данным, скопированным из резервной копии, чтобы произвести их накат до точки восстановления. В этой точке базы данных обычно имеются незафиксированные транзакции, и потому база находится в непригодном для работы состоянии. В этом случае следует производить в процесс восстановления базы данных стадию отмена.
- Стадия отката, производит откат незафиксированных транзакций и делает базу данных доступной для пользователей. После завершения стадии отката восстановление последующих резервных копий становится невозможным. Затем в процессе восстановления база данных переводится в активный режим.
Также следует упомянуть параметры RECOVERY и NORECOVERY, которые будут использоваться ниже:
Выполнение инструкции RESTORE после стадии повтора
либо завершается, либо переходит к стадии отката в зависимости от того, указано
ли в ней предложение WITH NORECOVERY.
- Режим WITH RECOVERY включает и стадию повтора, и стадию отката и восстанавливает базу данных. Более поздние резервные копии восстановить невозможно. Это значение по умолчанию.Если набор данных наката не был восстановлен в достаточной степени, чтобы обеспечить согласованность с базой данных, стадия отката выполнена быть не может. Компонент Database Engine выдает ошибку и прекращает восстановление.Если весь набор данных наката согласован с базой данных, то выполняется восстановление, после чего базу данных можно перевести в режим в сети.
- Предложение WITH NORECOVERY позволяет пропустить стадию отката, чтобы сохранить незафиксированные транзакции. Пропуск стадии отката позволяет восстановить другие резервные копии, чтобы выполнить накат базы данных на более поздний момент времени. Иногда инструкция RESTORE WITH NORECOVERY выполняет накат данных до момента, пока они не будут согласованы с базой данных. В таких случаях компонент Database Engine выдает информационное сообщение, указывающее, что набор данных наката теперь можно восстановить при помощи параметра RECOVERY.Другими словами, параметр NORECOVERY нужно использовать, когда для восстановления базы используются несколько восстанавливаемых резервных копий, за исключением последней восстанавливаемой резервной копии. После применения параметра NORECOVERY, база данных переходит в состояние восстановления.
2.1. Восстановление базы из полной резервной копии (Restore Full Database).
Восстановим базу «Test_Recovery» в состояние «t4».
Приступим к
восстановление базы данных из полной резервной копии «Full2_Test_Recovery.bak» используя «SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Restore», потом «Database».
В появившемся окне «Restore Database» в разделе «Sourse» выбираем «Device». Далее «Add», прописываем путь «\\vniz-tst-bkp01.test.local\Backup_SQL\ Full2_Test_Recovery.bak», нажимаем «Ok». В разделе «Destination» выбираем Database
«Test Recovery»
Нажимаем «Ok»
База успешно восстановится.
Рассмотрим восстановление базы данных используя Transact-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню
выбираем «New Query»:
В появившемся окне вводим:
USE master
GO
RESTORE
DATABASE Test_Recovery
FROM
DISK='\\vniz-tst-bkp01.test.local\Backup_SQL\Full2_Test_Recovery.bak'
WITH REPLACE
База успешно восстановится.
В этом примере мы использовали параметр «REPLACE»:
Восстановление обычно не допускает случайной перезаписи базы данных другой
базой данных. Если указанная в инструкции RESTORE база данных уже существует на
текущем сервере, а идентификатор GUID семейства для заданной базы данных
отличается от идентификатора GUID семейства для базы данных, записанного в
резервном наборе данных, то ее восстановление не будет выполнено.
Параметр REPLACE отменяет несколько важных проверок, обычно выполняемых
операцией восстановления. Отменяются следующие проверки.
- Проверка на восстановление поверх существующей базы данных резервной копии, созданной для другой базы данных. При использовании параметра REPLACE при восстановлении можно записать данные поверх существующей базы данных независимо от того, какие базы данных содержатся в резервном наборе данных, даже если указанное имя данных отличается от записанного в резервном наборе. Это может привести к случайной перезаписи поверх базы данных другой базы данных.
- Проверка на восстановление базы данных, использующей модель полного восстановления или модель восстановления с неполным протоколированием, для которой не была создана резервная копия заключительного фрагмента журнала, и не был применен параметр STOPAT. При использовании параметра REPLACE возможна потеря зафиксированных данных, поскольку последние записанные в журнал данные еще не были скопированы в резервную копию.
- Перезапись существующих файлов.
Подробнее тут.
Проверим таблицы в базе данных на момент времени «t4»
Use
Test_Recovery
GO
SELECT
* FROM sysobjects WHERE type = 'U'
Видим, что база данных содержит таблицы
«Table_primary, Table_secondary, Table_Diff, Table_Table_Diff2», что
соответствует Таблице1.
2.2. Восстановление базы данных из разностной резервной копии (Restore Differential Backup)
Восстановим базу в состояние «t3». Для этого сначала
следует восстановить базу данных из полной резервной копии, а потом накатить на
базу разностную резервную копию.
Приступим к восстановление базы данных используя «SQL Server
Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в
появившемся меню выбираем «Tasks», далее «Restore», потом «Database».
В появившемся окне «Restore Database» в разделе «Sourse» выбираем «Device». Далее «Add», прописываем путь «\\vniz-tst-bkp01.test.local\Backup_SQL\». Выбираем два файла Full_Test_Recovery.bak» и «Diff2_Test_Recovery.bak», нажимаем «Ok».
База успешно восстановится.
Рассмотрим восстановление базы данных используя Transact-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»:
В появившемся окне вводим:
USE master
RESTORE
DATABASE Test_Recovery
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Full_Test_Recovery.bak'
WITH FILE = 1, NORECOVERY, REPLACE
RESTORE
DATABASE Test_Recovery
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Diff2_Test_Recovery.bak'
WITH FILE = 4, RECOVERY
GO
База успешно восстановится.
Так как в данном файле резервной копии, в нашем
случае, содержатся несколько разностных резервных копий баз, то его позиция
указывается параметром FILE в предложении WITH.
Узнать величину FILE можно следующим оператором HEADERONLY:
RESTORE
HEADERONLY
FROM
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Diff2_Test_Recovery.bak'
WITH
NOUNLOAD;
GO
RESTORE
HEADERONLY
FROM
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Full_Test_Recovery.bak'
WITH NOUNLOAD;
GO
Проверим таблицы в базе данных на момент времени «t3»
Use
Test_Recovery
GO
SELECT
* FROM sysobjects WHERE type = 'U'
Видим, что база данных содержит таблицы
«Table_primary, Table_secondary, Table_Diff, Table_Table_Diff2», что
соответствует Таблице1.
2.3. Восстановление журнала транзакций (Restore Log Lransaction)
Восстановим базу в состояние «t8». Для этого сначала
следует восстановить базу данных из полной резервной копии
Full2_Test_Recovery.bak, а потом накатить на базу последовательно все резервные
копии журнала транзакций - Log_Test_Recovery, Log2_Test_Recovery.bak,
Log3_Test_Recovery.bak.
Приступим к восстановление базы данных используя «SQL Server
Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в
появившемся меню выбираем «Tasks», далее «Restore», потом «Database».
В появившемся окне «Restore Database» в разделе «Sourse»
выбираем «Device». Далее «Add», прописываем путь «\\vniz-tst-bkp01.test.local\Backup_SQL\».
Выбираем четыре файла Full_Test_Recovery.bak» и «Log_Test_Recovery,
Log2_Test_Recovery, Log3_Test_Recovery», нажимаем «Ok».
В разделе «Destination» выбираем Database «Test
Recovery». Нажимаем «Ok»
База успешно восстановится.
Рассмотрим восстановление базы данных используя Transact-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в
появившемся меню выбираем «New Query»:
Для успешного восстановления лога транзакций,
необходимо знать сколько файлов входят в резервную копию на каждом шаге. В появившемся окне вводим:
USE
master
RESTORE
DATABASE Test_Recovery
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Full2_Test_Recovery.bak'
WITH FILE = 3, NORECOVERY, REPLACE
RESTORE
LOG Test_Recovery
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Log_Test_Recovery.bak'
WITH FILE = 3, NORECOVERY
RESTORE
LOG Test_Recovery
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Log2_Test_Recovery.bak'
WITH FILE = 2, NORECOVERY
RESTORE
LOG Test_Recovery
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Log3_Test_Recovery.bak'
WITH FILE = 3, RECOVERY
GO
База успешно восстановится.
Проверим таблицы в базе на момент времени «t8»
Use
Test_Recovery
GO
SELECT
* FROM sysobjects WHERE type = 'U'
Видим, что база данных содержит таблицы
«Table_primary, Table_secondary, Table_Diff, Table_Diff2, Table_Log2,
Table_Log3», что соответствует Таблице1.
2.4. Восстановление работы базы данных с поврежденным логом транзакций.
База данных находится в состоянии «t8». Сымитируем
проблему, при которой вышел из строя дисковый массив с журналом транзакций.
Для этого остановим экземпляр SQL сервера. Щелкаем
правой кнопкой по сервису SQL «vniz-tst-sql01» и нажимаем «Stop».
Далее, заходим в каталог с базой данных и удаляем файл
«Test_Recovery_log». Включаем службу и видим, что база перешла в состояние
«SUSPECT», подробнее про состояние баз данных можно прочитать тут:
SELECT
DATABASEPROPERTYEX('Test_Recovery', 'Status');
Приступим к восстановлению базы в рабочее состояние.
Запускаем сервис MS SQL Server. Выполняем
скрипт, который позволит нам редактировать системные таблицы, более подробно можно прочитать тут.
Выполняем запрос:
USE
master
GO
sp_configure 'allow updates', 1
RECONFIGURE
WITH OVERRIDE
GO
Переводим базу в однопользовательский режим и в
состояние EMERGENCY:
ALTER
DATABASE Test_Recovery
SET EMERGENCY, SINGLE_USER
GO
SELECT
DATABASEPROPERTYEX('Test_Recovery', 'Status');
Выполняем восстановление данных, подробнее тут:
DBCC
CHECKDB('Test_Recovery', REPAIR_ALLOW_DATA_LOSS)
GO
После того как сервер закончит выполнять запрос и
вернет результат, меняем REPAIR_ALLOW_DATA_LOSS на REPAIR_REBUILD и
выполняем запрос еще раз, чтобы убрать оставшиеся ошибки в базе данных.
DBCC
CHECKDB('Test_Recovery', REPAIR_REBUILD)
GO
База перешла в состояние «ONLINE» и уже доступна для
работы, но только в однопользовательском режиме, возвращаем базу в
многопользовательский режим:
ALTER
DATABASE Test_Recovery
SET ONLINE, MULTI_USER
GO
База готова к работе.
Возвращаем значения в исходное состояние:
USE
master
GO
sp_configure 'allow updates', 0
GO
2.5. Восстановление базы данных до определённого момента
Договоримся, что база будет находиться в точке «t11».
Создадим таблицу «Table_Tail1» 25.12.2012 в 15:57:
CREATE
TABLE Table_Tail1 (
number INTEGER,
test TEXT,
nickname TEXT,
name TEXT,
ter INTEGER,
)
INSERT
INTO Table_Tail1 (number,test,nickname,name,ter)
VALUES
(1358, 'Tail10', 'Lok20', 'Table',355),
(1359, 'Tail20', 'Tok20', 'Only',356),
(1350, 'Tail30', 'Kot20', 'You',357),
(1351, 'Tail40', 'Kol20', 'Dear',358),
(1352, 'Tail50', 'Don20', 'Colleagues',359);
--COMMIT;
База перешла в состояние точки «t12».
Удалим таблицу 25.12.2012 в 16:03:
Use
Test_Recovery
GO
DROP TABLE Table_Tail1
Проверяем:
Use
Test_Recovery
GO
SELECT * FROM sysobjects WHERE type = 'U'
Теперь база находится в точке «t13». Как видно из рисунка, в процессе
создания и удаления таблицы мы ни разу не создавали резервную копию данных.
Допустим нам нужно вернуться в момент времени «t12» - момент создания базы данных «Table_Tail1».
Для этого сначала сделаем резервную копию
заключительного фрагмента журнала транзакций, после чего восстановим базу
данных из существующей резервной копии на момент «t12».
Приступим к созданию резервной копии заключительного
фрагмента журнала транзакций (Tail-Log Backups) используя «SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Backup»
Откроется окно «Back Up Database – Test_Recovery».
В разделе «Destination»
удаляем путь резервного копирования кнопкой «Remove» и добавляем новое место « \\vniz-tst-bkp01.test.local\Backup_SQL\TailLog1_Test_Recovery.bak» кнопкой «Add»
В пункте «Backup type» выбираем «Transaction Log». Нажимаем «Ок».
Резервное копирование успешно выполнится.
Рассмотрим резервное копирование лога транзакций
используя Transact-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»,
USE
Test_Recovery
GO
BACKUP
LOG Test_Recovery
TO
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\TailLog1_Test_Recovery.bak'
GO
Восстановим базу на момент «t12» используя «SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Restore», потом «Database».
В появившемся окне «Restore Database» в разделе «Sourse» выбираем «Device». Далее
«Add», прописываем путь «\\vniz-tst-bkp01.test.local\Backup_SQL\».
Выбираем два файла Full3_Test_Recovery.bak» и «TailLog1_Test_Recovery.bak»,
нажимаем «Ok».
В разделе «Destination» выбираем Database «Test Recovery». Нажимаем на кнопку «Timeline»
В появившемся окне «Backup Timeline: Test_Recovery» выбираем «Specific date and
time», в соответствующих полях вводим «25.12.2012 15:58:12», нажимаем «Ок».
Нажимаем «Ок»
База данных успешно восстановится.
Проверяем:
Use
Test_Recovery
GO
SELECT * FROM sysobjects WHERE type = 'U'
Видим, что база «Table_Tail1» успешно восстановилась.
Восстановим базу на момент «t12» используя Transact-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»:
В появившемся окне вводим:
USE master
RESTORE
DATABASE Test_Recovery
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Full3_Test_Recovery.bak'
WITH FILE = 1, NORECOVERY, REPLACE
RESTORE
LOG Test_Recovery
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\TailLog1_Test_Recovery.bak'
WITH FILE = 1, STOPAT = '2013-12-25T15:58:12'
GO
База успешно восстановится
2.6. Восстановление файлов и файловых групп (Restore Files, Restore Filegroups)
На данный момент мы находимся в точке «t12».
Удалим таблицу «Test_Recovery», которая
находится в PRIMARY файловой группе.
Use
Test_Recovery
GO
DROP
TABLE Table_primary
Проверяем:
Use
Test_Recovery
GO
SELECT * FROM sysobjects WHERE type = 'U'
Восстановим файловую группу «PRIMARY» на момент «t9» используя «SQL Server Management Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Restore», потом «Files and FileGroups».
В появившемся окне «Restore Files and FileGroups» в разделе «Sourse for Restore» выбираем «From Device». Далее «Add», Выбираем «\\vniz-tst-bkp01.test.local\Backup_SQL\Prim_Test_Recovery.bak»,
нажимаем «Ok».
База успешно восстановится.
Проверяем:
Use Test_Recovery
GO
SELECT * FROM sysobjects WHERE type = 'U'
Восстановим файловую группу «PRIMARY» на момент «t9», используя T-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»:
В появившемся окне вводим:
USE master;
GO
RESTORE
DATABASE Test_Recovery
FILEGROUP = 'PRIMARY'
FROM
DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Prim_Test_Recovery.bak'
WITH PARTIAL, RECOVERY, REPLACE
База успешно восстановится. Так как мы восстанавливали
только часть базы – файловую группу, то мы использовали параметр «PARTIAL».
Восстановление файла.
Сымитируем повреждение файла «Test_Recovery_s2.ndf». Для этого выключим сервис MS SQL и удалим файл Test_Recovery_s2.ndf. Включаем сервис MS SQL.
Проверяем состояние файла:
select
name,state_desc from sys.master_files
WHERE name = 'Test_Recovery_s2'
Восстановим файл «Test_Recovery_s2.ndf» на момент «t10» используя «SQL Server Management
Studio». Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «Tasks», далее «Restore», потом «Files and FileGroups».
В появившемся окне «Restore Files and FileGroups» в разделе «Sourse for Restore» выбираем «From Device». Далее «Add», выбираем «\\vniz-tst-bkp01.test.local\Backup_SQL\Sec_s2_Test_Recovery.bak»,
нажимаем «Ok».
База успешно восстановится.
Проверяем:
select
name,state_desc from sys.master_files
WHERE name = 'Test_Recovery_s2'
Восстановим файл «Test_Recovery_s2.ndf» на момент «t10» используя используя T-SQL.
Щелкаем правой кнопкой мыши по базе «Test_Recovery», в появившемся меню выбираем «New Query»:
В появившемся окне вводим:
RESTORE
DATABASE Test_Recovery
FILE
= 'Test_Recovery_s2'
FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\Sec_s2_Test_Recovery.bak'
WITH NORECOVERY, REPLACE
GO
База успешно восстановится.
2.7. Восстановление системных баз данных.
Прежде чем приступить к восстановлению системных баз
данных, следует принять во внимание, что системные базы данных могут быть
восстановлены только из резервных копий, созданных той версией SQL Server, которая
запущена на данном экземпляре сервера. Например, чтобы восстановить
системную базу данных на экземпляре сервера, работающего под SQL Server 2012 с
пакетом обновления 1 (SP1), необходимо использовать резервную копию базы
данных, созданную после обновления экземпляра сервера до SQL Server 2012 с
пакетом обновления 1 (SP1).
2.7.1. Восстановление системных баз из резервной копии, в случае доступности службы SQL
Если экземпляр SQL сервера доступен, то системные базы
восстанавливаются согласно приведенной таблице:
Системная база данных
|
Способ восстановления
|
Master
|
Запускаем экземпляр сервера в
однопользовательском режиме. Восстановление базы осуществляется так же, как
полное восстановление пользовательской базы данных. После восстановления
следует перезапустить экземпляр SQL сервера.
|
msdb
|
Восстановление базы осуществляется так
же, как полное восстановление пользовательской базы данных.
|
model
|
Восстановление базы осуществляется так
же, как полное восстановление пользовательской базы данных.
|
Resource
|
Восстановление базы осуществляется так
же, как восстановление обычного файла, копированием и заменой.
|
Отдельно рассмотрим восстановление главной системной базы «master».
Запускаем экземпляр сервера в однопользовательском
режиме: выключим и включим экземпляр сервера с параметром запуска /m, для этого вводим в «CMD»:
net stop
MSSQLSERVER
net start MSSQLSERVER /m
Подключаемся к серверу и запустим процесс
восстановления базы из резервной копии.
sqlcmd
RESTORE DATABASE
master FROM DISK = '\\vniz-tst-bkp01.test.local\Backup_SQL\master_1.bak' WITH
REPLACE;
GO
База успешно восстановится, а экземпляр SQL примет состояние «вне сети».
Стартуем сервер в многопользовательском режиме:
net start MSSQLSERVER
2.7.2. Восстановление системных баз из резервной копии, когда служба SQL недоступна.
Если база данных «master» сильно повреждена и не удается запустить
экземпляр SQL сервера, то следует создать новую версию базы данных «master», запустив программу установки SQL сервера, а потом восстановить прежнюю
базу из резервной копии.
Сымитируем повреждение базы данных «master». Выключаем сервер SQL, удаляем базу данных «master».
Попытаемся включить экземпляр сервера SQL, по очевидным причинам экземпляр не запустится.
Вставляем установочный диск в CD-ROM и запускаем в командной строке установку SQL сервера со следующими параметрами, подробнее про
параметры можно узнать тут.
D:\Setup.exe /ACTION=REBUILDDATABASE
/QUIET /SAPWD=Pass#6Ord /INSTANCENAME=MSSQLSERVER
/SQLSYSADMINACCOUNTS=test\larin
Системные базы данных успешно пересоздадутся.
Экземпляр сервера SQL успешно запустится.
Далее можно восстановить системные базы данных из
резервной копии.
В данной статье, я попытался максимально охватить все
методы резервного копирования баз данных и их восстановления.
На этом предлагаю закончить.
Вопросы, замечания и предложения пишите в комментариях
или на почту.
Удачного тестирования!