heap.tech
лаборатория велосипедов
×

Восстановление БД master

27 декабря 2015
Здравствуйте, коллеги. Моя статья относится к тем, кто по долгу службы и/или в связи с форс-мажором сталкивается с проблемой разрушения системной БД master. Согласно Microsoft – «База данных master содержит всю системную информацию СУБД SQL Server, в том числе общие для всего экземпляра метаданные, такие как сведения об учетных записях входа, конечных точках и связанных серверах, а также параметры конфигурации системы. … Кроме этого, в базе данных master регистрируются все остальные базы данных и хранится информация о расположении их файлов. Здесь же SQL Server хранит сведения об инициализации. Таким образом, если база данных master недоступна, запустить SQL Server невозможно.».
Статья не претендует на оригинальность. Допускаю, что был изобретен велосипед. В этом случае, можно считать, что статья – это переработка способов починки БД master, которых в интернете великое множество.

Волею судьбы, я столкнулся с этой ситуацией, будучи начинающим администратором баз данных. Как водится, в самый неподходящий момент, а именно, при отключении электричества «грохнулся» master. Существует несколько способов выхода из этого положения:
1. Полная переустановка SQL сервера с последующим присоединением пользовательских БД.
2. Восстановление master из бекапа. Естественно, если этот самый бекап существует в природе.

Оба способа имеют свои достоинства и недостатки. Первый (в то время я им и воспользовался) хорош тем, что алгоритм достаточно прост: удаление через Панель Управления Windows всех компонентов старого SQL сервера и установка нового и последующим присоединением (attach) пользовательских БД. Все было бы просто, если бы не одна маленькая деталь – отсутствовал дистрибутив SQL сервера. А база была на локальном сервере, который, мягко говоря был достаточно далеко. Несмотря на все это, пришлось закачивать дистрибутив на отвратительной скорости. В любом случае, удаление-установка-присоединение-восстановление Job-ов и т.д. займет явно не 30 минут.
Второй способ, как мне кажется, гораздо более интереснее. Ссылок по этому варианту достаточно много в интернете. Я предлагаю именно его, так как уже неоднократно им пользовался и который во всех моих случаях дал стопроцентный положительный результат. Я не претендую на его изобретение, возможно, кто-то им пользуется и помимо меня.
Смысл в следующем. Нужна «не битая» БД master и ваш бекап этой базы, причем, желательно, самый свежий. Необходимое условие – «не битая» БД master должна быть из той же версии SQL сервера. Конечно, можно взять master с какого-либо сервера, но это потребует его остановки, копирования и последующего запуска службы. Не самый удобный вариант. Есть другой способ получения целой БД master. Оказывается, при установки SQL сервера создается каталог шаблонов системных баз данных. Применительно к SQL 2014 скорее всего шаблоны системных БД находятся (при стандартной установке) в
C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\Templates\. Естественно, путь в вашем случае может быть иным – это зависит от версии SQL (2005, 2008 , 2012), от его разрядности, разрядности Windows и т.д., но шаблоны есть всегда. Копируем с заменой файлы БД master (master.mdf, mastlog.ldf) из каталога шаблонов в каталог, где расположены файлы вашей БД master. Очевидно, что служба MSSQLSERVER остановлена. Особенностью шаблонной БД master является отсутствие в ней ошибок, соответствие версии SQL (и это плюс), но и полное отсутствие в ней данных о базах и еще много о чем (это минус). Акцентирую, что в системную информацию входит расположение других системных БД: model, msdb, tempdb. Поэтому запустить службу MSSQLSERVER без ограничений сразу после замены файлов БД master (она «чистая») не удастся.
Предварительно необходимо определить, а лучше скопировать, например, в блокнот пути остальных системных БД (model, msdb, tempdb).
Запустить командную строку cmd под администратором (не закрывайте его до конца процедуры восстановления), далее (цитата Microsoft), «запустите экземпляр SQL Server в режиме восстановления «только master», запустив из командной строки одну из следующих команд.
В случае с экземпляром по умолчанию (MSSQLSERVER):
NET START MSSQLSERVER /f /T3608

В случае с именованным экземпляром: NET START MSSQL$instancename /f /T3608»

Примечание. В команде необходимо учитывать регистр символов (“f” – строчная, “T” – заглавная).

Запуск службы в этом режиме позволяет работать в командной строке SQL (sqlcmd). После успешного запуска службы в командной строке вводим sqlcmd.
Затем указываем расположение системных БД и их журналов, последовательно вводя в командной строке:
>ALTER DATABASE tempdb MODIFY FILE (name = 'tempdev' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\tempdb.mdf')
>GO

>ALTER DATABASE tempdb MODIFY FILE (name = 'templog' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\templog.ldf')
>GO


>ALTER DATABASE model MODIFY FILE (name = 'modeldev' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\model.mdf')
>GO

>ALTER DATABASE model MODIFY FILE (name = 'modellog' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\modellog.ldf')
>GO


>ALTER DATABASE msdb MODIFY FILE (name = 'MSDBData' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\MSDBData.mdf')
>GO

>ALTER DATABASE msdb MODIFY FILE (name = 'MSDBLog' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\MSDBLog.ldf')
>GO

Примечание. Расположение файлов системных баз в вашем случае может быть иным.
В случае успешного определения пути расположения системных БД выходим из sqlcmd, набрав в командной сроке quit. Далее необходимо остановить SQL сервере (либо из SQL Server Configuration Manager или командой net stop mssqlserver).
А теперь приступаем к самому главному – восстановление БД master из его последнего бекапа.
ВАЖНО: восстановление БД master из бекапа возможно только при монопольном доступе к SQL серверу.
В командной строке вводим net start mssqlserver /m. Это обозначает, что вы запускаете SQL сервер в монопольном режиме.
Примечание. В команде необходимо учитывать регистр символов (“m” – строчная)

Далее запускаем команду sqlcmd.
Затем восстанавливаем БД master из бекапа master.bak командой
RESTORE DATABASE MASTER FROM DISK='C:\Backup\master.bak' WITH REPLACE;
>GO

Примечание. 'C:\Backup\master.bak' – это путь к бекапу БД master.

После успешного завершения восстановления (о чем будет сообщено) служба MSSQLSERVER будет остановлена. Поэтому необходимо запустить ее, используя SQL Server Configuration Manager или командную строку net start mssqlserver.
К сожалению, такого рода форс-мажорные обстоятельства могут сопровождаться дополнительными неприятностями. Например, пользовательская база может попасть в разряд suspect (подозрительная), или какая-либо БД попадает в статус READ_ONLY. Но это отдельная тема.
В заключении, хотелось бы дать совет. После случившегося со мной, я решил создать шпаргалку в виде текстового файла, в котором содержаться все шаги по восстановлению БД master из бекапа. Причем создание этого файла я «поручил» SQL Server Agent. В одном из заданий, стартующих после шага создания бекапов системных и пользовательских БД запускается сохраненная процедура, которая формирует этот файл с учетом реальных путей системных БД и даты-времени создания последнего бекапа БД master. Текстовый файл обновляется каждый день. Получилось примерно следующее:


:Find and copy template db master (stop service MSSQLSERVER)
>cmd: as admin
>net start mssqlserver /f /T3608
>sqlcmd
:Path DB MASTER C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\master.mdf
:Path DB MASTER C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\mastlog.ldf
>ALTER DATABASE tempdb MODIFY FILE (name = 'tempdev' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\tempdb.mdf')
>GO
>ALTER DATABASE tempdb MODIFY FILE (name = 'templog' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\templog.ldf')
>GO
>ALTER DATABASE model MODIFY FILE (name = 'modeldev' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\model.mdf')
>GO
>ALTER DATABASE model MODIFY FILE (name = 'modellog' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\modellog.ldf')
>GO
>ALTER DATABASE msdb MODIFY FILE (name = 'MSDBData' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\MSDBData.mdf')
>GO
>ALTER DATABASE msdb MODIFY FILE (name = 'MSDBLog' , filename ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\MSDBLog.ldf')
>GO
>quit
:Restart service MSSQLSERVER
>net stop mssqlserver
>net start mssqlserver /m
>sqlcmd
>RESTORE DATABASE MASTER FROM DISK='C:\Backup\ master.bak' WITH REPLACE;
>GO
:Restart service MSSQLSERVER

Примечание. Знак «>» означает, что строку можно просто скопировать в командную строку; знак «:» - информация и/или действие. С учетом такой «автоматизации» вполне реально решить проблему до 30 мин.
 
7450
0

Оставлять комментарии могут только зарегистрированные пользователи

пока никто не оставлял комментариев