Часто администраторы баз данных в процессе администрирования СУБД сталкиваются с необходимостью восстановления испорченных данных. И очень часто восстановление данных из резервной копии не является оптимальным решением, так как обычно требуется восстановить не всю базу данных, а данные только в одной или двух таблицах базы данных. В данной статье я расскажу о двух наиболее популярных способах восстановления данных в MS SQL Server и о том, как быстро и легко восстановить данные в отдельной таблице SQL Server из резервной копии. Подробнее читайте далее.
Способы восстановления данных в SQL Server
1. Восстановление данных из резервной копии в SQL Server
Одним из самых важных правил для любого системного администратора является необходимость регулярного резервного копирования данных программ. В MS SQL Server для резервного копирования есть штатная команда Задачи / Создать резервную копию. Остается только выбрать расположение, куда MS SQL Server создаст резевную копию, а дальше программа все сделает сама.
Для восстановления сохраненных данных также существует штатная команда Задачи / Восстановить / База данных. Достаточно просто указать имя файла резервной копии, а остальную часть процесса восстановления данных программа возьмет на себя.
Однако у данного отличного, на первый взгляд, способа резервного копирования и восстановления данных есть свои плюсы и минусы.
Во-первых, в случае большого объема базы данных резервное копирование может занять час и более, а размер резервной копии может быть не маленьким. Именно поэтому такие копии делают не чаще одного или двух раз в день.
Во-вторых, данные возможно восстановить только целиком, то есть можно восстановить полностью одну базу данных, но не отдельную таблицу в базе данных.
2. Восстановление данных в отдельной таблице базы данных в SQL Server
Способ № 1. Первый способ предполагает предварительное восстановление данных из имеющейся резервной копии в базу-клон исходной базы данных.
Для этого нужно создать новую базу данных (если имя исходной базы данных Base01, базу-клон можно назвать, например, Base02) и восстановить в нее данные из резервной копии. Далее уже можно написать скрипт для восстановления данных. Отличие скрипта от обычного написания будет в том, что при указании имени таблицы необходимо будет указать также и имя базы данных. Например,
Update Base01..Table01 set Base01..Table01.Date = Base02..Table01.Date from Base02..Table01 join Base01..Table01 on Base01..Table01.ID = Base02..Table01.ID where…
Способ №2. Допустим, что исходные неиспорченные данные есть на другом резервном (тестовом) сервере. Конечно, целесообразнее их взять оттуда, не прибегая к созданию базы-клона, в которую необходимо восстановить данные из резервной копии, так как это в случае большого объема базы данных (современные базы данных имеют размеры более терабайта) займет много времени. Сделать это можно опять-таки двумя способами.
Способ А. Для этого способа потребуется вновь создать базу-клон. Только вместо восстановления данных из резервной копии более быстрым решением будет использование операции экспорта с резервного сервера с неповрежденными данными.
Для экспорта в SQL Server существует команда Задачи / Экспортировать данные. При экспорте потребуется указать имя сервера и базы данных, из которых копируются данные, и имя сервера и базы данных, в которые копируются данные, а также указать перечень копируемых таблиц. Копирование отдельных таблиц займет меньше времени, чем восстановление базы данных из копии целиком.
А далее достаточно для восстановления данных в отдельной таблице достаточно выполнить все ту же команду:
Update Base01..Table01 set Base01..Table01.Date = Base02..Table01.Date from Base02..Table01 join Base01..Table01 on Base01..Table01.ID = Base02..Table01.ID where…
Способ Б. При применении этого способа не потребуется ни базы клона, ни восстановления из копии, ни экспорта данных отдельной таблицы. Восстановление данных будет идти напрямую из отдельной таблицы другого сервера.
Для этого способа потребуется предварительно создать линк между серверами.
Линк можно создать через интерфейс SQL Server (команда Создать / Связанный сервер в папке Объекты сервера) или с помощью скриптов ниже.
exec sp_addlinkedserver @server=’Имя_сервера’, @srvproduct=’SQL Server’
exec sp_addlinkedsrvlogin ‘Имя_сервера’, ‘false’, null, ‘sa’, ‘Пароль_для_sa’
После создания линка можно выбирать данные с другого сервера командой:
SELECT top 10 * FROM [Имя_сервера].Base01.dbo.Table01
Для восстановления данных используем уже знакомую, но немного видоизмененную команду:
Update Table01 set Table01.Date = A.Date from [Имя_сервера].Base01.dbo.Table01 A join Table01 on A.ID = Table01.ID where…
При использовании этого способа учитывайте, что к таблице командой вида [Имя_сервера].Base01.dbo.Table01 можно обратиться только один раз, а потом можно использовать только псевдоним в виде, например, букв A или B как в примере выше.
На этом все. Надеюсь статья была информативной и полезной для практического применения в администрировании баз данных на основе SQL Server.