пятница, 23 октября 2015 г.

Инструкция по восстановлению системных БД на сервере SQL Server






После неприятных событий ... (выход из строя SSD диска, а затем и контроллера дисков на одном из серверов БД) у меня родилась мысль, что нам нужна чёткая инструкция по восстановлению работоспособности системных БД (а значит и всего сервера БД).
Теперь у нас есть такая инструкция!
Отличительные особенности этой инструкции:
1) все операции были проверены на тестовой виртуальной машине с установленным SQL Server 2008;
2) к каждому разделу прикреплены полезные ссылке по теме на официальный ресурс msdn.
===================================================================================
Восстановление работоспособности сервера БД (MS SQL Server 2008) в случае сбоя системных баз (master, model, tempdb, msdb)

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

Сбой и восстановление базы данных TempDB

TempDB – это системная база для временных таблиц. При запуске службы сервера БД, база данных TempDB создаётся заново. В случае выхода из строя накопителя, на котором размещаются файлы базы TempDB, служба не будет запущена, так как этот накопитель более недоступен и создать базу TempDB SQL Server не сможет. Чтобы это исправить, можно установить новый накопитель и назначить для него в системе ту же букву, что была у потерянного накопителя (при этом полный путь к файлам базы TempDB должен быть восстановлен: нужно создать соответствующие каталоги).
В случае, если путь к файлам базы TempDB восстановить не представляется возможным, нужно указать серверу БД другой путь (существующий) для этой базы. Чтобы это сделать необходимо:

1) Запустить службу сервера БД в минимальной конфигурации из командной строки:
Sqlservr.exe -m -c -f -T3608 -T4022

Нужно указывать полный путь к файлу sqlservr.exe (или запустить CMD.EXE из каталога, где лежит этот файл):
"C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe"  -m -c -f -T3608 -T4022

Описание параметры запуска:
-m: запускает SQL Server в однопользовательском режиме, Контрольная точка не срабатывает;
-с: ускоряет запуск из Командной строки. Запускается в отдельном окне как приложение, а не как служба;
-f: запускает SQL Server в минимальной конфигурации;
-T: включает определённый флаг трассировки. 3608: запрещает автоматически запускать и восстанавливать все БД, кроме master (используется для перемещения системных БД).
4022: обход автоматически запускаемых процедур.

Дополнительный материал:
    Основные флаги трассировки:
http://msdn.microsoft.com/ru-ru/library/ms188396.aspx
    Полезные флаги трассировки:
        http://www.sql.ru/articles/mssql/02080603DocumentedAndUndocumentedTraceFlagsForSQLServer.shtml
    Параметры запуска службы SQL Server:
        http://msdn.microsoft.com/ru-ru/library/ms190737.aspx
    Как запустить экземпляр SQL Server:
        http://msdn.microsoft.com/ru-ru/library/ms180965.aspx

2) Подключиться к запущенному серверу БД с помощью программы sqlcmd.exe:
   
    2.1) Переход в каталог с утилитами SQL Server:
        cd "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\"
    2.2) Запуск sqlcmd с параметрами подключение к серверу под sa
        sqlcmd -S Server -U sa -P 111

Описание параметров sqlcmd:
    -S: имя сервера БД к которому происходит подключение;
    -U: Логин (имя входа) под которым происходит подключение к серверу;
    -P: пароль.

Дополнительный материал:
    Программа sqlcmd:
        http://msdn.microsoft.com/ru-ru/library/ms162773.aspx
    Использование программы sqlcmd:
        http://msdn.microsoft.com/ru-ru/library/ms180944.aspx

3) Изменить пути к файлам БД TempDB с помощью T-SQL (указать новые существующие пути):


USE master;
GO

ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = ‘С:\TempDB\tempdb.mdf’) ;
GO
Ответ сервера на успешный запрос:
Файл "tempdb" был изменен в системном каталоге. Данный новый путь будет использ
ован при следующем запуске этой базы данных.

ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = ‘C:\TempDB\templog.ldf’) ;
GO

Ответ сервера на успешный запрос:
Файл "templog" был изменен в системном каталоге. Данный новый путь будет использ
ован при следующем запуске этой базы данных.

Для проверки изменений можно выполнить следующий запрос:
SELECT name, physical_name AS CurrentLocation, state_desc FROM sys.master_files WHERE database_id = DB_ID(N'tempdb');
GO

Дополнительный материал:
        Перемещение системных баз:
            http://msdn.microsoft.com/ru-ru/library/ms345408.aspx

4) Закрыть sqlcmd и командное окно сервера SQL Server через нажатие клавиш Ctrl+C;

5) Запустить сервер SQL Server в нормальном режиме (через запуск службы).


Сбой и восстановление баз данных msdb и model

msdb – это системная база, где хранится вся информация по заданиям, расписаниям, история резервных копий для всех БД и т.д. Нужна для работы службы SQL Server Agent.
model – это системная база, используется, как шаблон для всех создаваемых пользовательских БД.
 В случае сбоя этих системной базы, а также в случае перестроения системной БД master необходимо выполнить восстановления этих баз из резервных копий. Поэтому необходимо постоянно создавать резервные копии этих баз (особенно базы msdb), рекомендуется создавать полные копии после каждого изменения.

Для восстановления системных баз msdb и model необходимо выполнить скрипт T-SQL (через панель объектов в Management Studio не получится), его можно выполнить либо в Management Studio, либо через утилиту sqlcmd.exe.

Скрипт для восстановления БД msdb (аналогичный скрипт будет работать и для БД model):

RESTORE DATABASE [msdb] FROM  DISK = N'D:\Backup\SYS\msdb.rez' WITH  FILE = 1,
MOVE N'MSDBData' TO N'C:\MSDBData.mdf',
MOVE N'MSDBLog' TO N'C:\MSDBLog.ldf',
NOUNLOAD,  REPLACE
GO

Дополнительный материал:
        Вопросы восстановления БД msdb и model:
            http://msdn.microsoft.com/ru-ru/library/ms190749.aspx
        Вопросы резервного копирования и восстановления системных баз:
            http://msdn.microsoft.com/ru-ru/library/ms190190.aspx


Сбой и восстановление базы данных master

master – это главная системная база SQL Server, в ней хранится вся конфигурация сервера и конфигурация подключенных БД. При сбое этой базы сервер SQL Server не может быть запущен (даже в минимальной конфигурации).
При попытке запустить Сервер БД в журнале событий приложения появятся ошибка:
Во время запуска при открытии файла "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\master.mdf" для получения данных конфигурации произошла ошибка 2(Не удается найти указанный файл.). Возможно, ошибка вызвана неверным параметром запуска. Проверьте параметры запуска и исправьте или удалите их при необходимости.

Для восстановления работоспособности БД master (и всего сервера БД) нужно выполнить:

1.    Перестроение системных БД
Для выполнения этой операции нужен дистрибутив SQL Server 2008. Нужно запустить инсталлятор setup.exe со специальными параметрами:

Setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=ИмяЭкземпляра /SQLSYSADMINACCOUNTS=accounts  /SAPWD= НовыйПарольsa ]
Параметры:
    /QUIET – программа будет работать без видимого интерфейса;
    /ACTION=REBUILDDATABASE – программа заново создаст системные базы данных;
    /INSTANCENAME – имя экземпляра SQL Server, по умолчанию MSSQLSERVER
   /SQLSYSADMINACCOUNTS - учетные записи Windows (или группы безопасности), которые будут администраторами (права sysadmin) на этом экземпляре. Например: "BUILTIN\Administrators".
    /SAPWD – новый пароль для системного пользователя sa.

Выполнять эту команду следует из командной строки(cmd.exe), чтобы отслеживать процесс восстановления (если будут ошибки, то они появятся в виде сообщений в этом же окне). В случае успешного выполнения этой операции в командной строке не будет сообщений.

Дополнительный материал:
    Перестроение системных БД:
        http://msdn.microsoft.com/ru-ru/library/dd207003.aspx

2.    Восстановление системной БД master из резервной копии

Для восстановления БД master необходимо запустить сервер SQL Server в однопользовательском режиме (сначала нужно остановить службу MSSQLSERVER):

Sqlservr.exe -m –c
Нужно указывать полный путь к файлу sqlservr.exe (или запустить CMD.EXE из каталога, где лежит этот файл):
"C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe"  -m –c

Затем нужно подключиться к серверу под sa (можно из Management Studio) и выполнить инструкция T-SQL:

RESTORE DATABASE [master] FROM  DISK = N'D:\ Backup\SYS\master.rez' WITH  FILE = 1 WITH REPLACE
GO

3.    После восстановления БД master необходимо восстановить системные БД msdb и model (см. выше).

4.    Восстановить пользовательские БД, при необходимости. Если же файлы данных и файлы журналов транзакций для пользовательских БД остались целыми, то при успешном восстановлении бэкапа базы master (и при условии, что бэкап свежий), все эти базы появятся на сервере (т.к. вся нужная информация содержится в базе master). В крайнем случае, придётся самостоятельно подключить все базы через команду ATTACH.

20 комментариев:

  1. Aga. Спасибо большое. Я только не понял что такое N в выражениях типа MOVE N'MSDBData' TO N'C:\MSDBData.mdf' и зачем эта N нужна.
    Подскажите плиз.

    ОтветитьУдалить
    Ответы
    1. Serge, N определяет кодовую страницу (Code Page).
      Если указать N перед строкой, то кодовая страница будет определена как Unicode.
      Если НЕ указать N, то будет использована кодовая страница по умолчанию для текущей БД и тогда определенные символы не будут распознаны.

      В данном случае можно и без N , т.к. Unicode-символов в примере нет.

      А вообще, когда используешь скриптование любых операций Management Studio везде проставляет этот N перед строками, чтобы избежать проблем из-за Unicode-символов.

      Удалить
  2. Я в шоке! msdb.bak/model.bak на SQL server-е НЕТ. Т.е. нат резервных копий системных баз. Есть только копия резервная копия рабочей бызы "database.bak" Можно ли как-то из этого восстановить msdb? Проблема в том, что "моя" ошибка - Data base "msdb" can not be open. Marked SUSPECTED by recovery (MS SQL Server Error 926)
    Если есть какой-то опыт решения, плиз посоветуйте......

    ОтветитьУдалить
    Ответы
    1. Serge, вот поэтому бэкапить нужно все базы (в т.ч. и базу model).
      Для начала нужно понять, что случилось с базой. Посмотрите логи SQL Server - отфильтруйте все сообщения, которые содержат: "error" , "fail", "msdb".
      Можно попробовать подключить файлы этой БД, как новую пользовательскую базу и затем восстановить её с помощью такого набора команд:

      EXEC sp_resetstatus [dbname];
      ALTER DATABASE [dbname] SET EMERGENCY;
      DBCC checkdb([dbname]);
      ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
      DBCC CheckDB ([dbname], REPAIR_ALLOW_DATA_LOSS);
      ALTER DATABASE [dbname] SET MULTI_USER;

      При этом возможна потеря данных при выполнении команды CheckDB.

      А затем отключить эту новую базу, остановить сервер SQL и подменить файлы битой базы msdb файлами только что отключенной БД.

      Удалить
    2. Aga, Спасибо большое за совет/подсказку. Логи посмотрю. (Я правильно понимаю, что они где-то здесь - 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ERRORLOG ' ? ). И еще один момент плиз: на сервере база(ы) бухгалтеров С1. Почему они не кричат караул? Фактически Пользуются типа tmp базой?.
      Вот часть сегодняшнено лога (бала проблема с подлюкчением 1С к серверу):
      2016-09-15 01.96 spid9s Clearing tempdb database.
      2016-09-15 02.00 spid9s Starting up database 'tempdb'.
      2016-09-15 02.09 spid11s A new instance of the full-text filter daemon host process has been successfully started.
      2016-09-15 02.11 spid9s Starting up database 'msdb'.
      2016-09-15 02.11 spid12s Starting up database 'ZZZ1c'.
      2016-09-15 02.11 spid11s Starting up database 'DZEN1c'.
      2016-09-15 02.20 Server A self-generated certificate was successfully loaded for encryption.
      Получается, что когда SQL сервер работает, то 1С считает, что все хорошо? Для меня это пока загадка. Сорри за кучу букв.

      Удалить
    3. Serge, да это и есть логи SQL Server. Их можно посмотреть в MStudio в разделе Management>SQL Server Logs.
      Пользователи могут и не заметить, что у вас упала база msdb, непосредственно пользователи работают в своей базе 1С + в базе tempdb. Посмотрите SQL Server Agent - скорее всего он не работает (вся его конфигурация сохранена в msdb). А также не будет работать DatabaseMail и другие функции (например Service Broker).
      Судя по этим сообщениям из лога только что был запущен SQL Server и все базы поднялись.
      1С-это отдельная тема, но в данном случае - да именно так: 1С считает что всё хорошо (ведь сама база 1С жива, и tempdb доступна, а больше для 1С ничего не нужно).

      Удалить
    4. Есть еще правда директория MSSQL\DATA, в которой храняться эти версии за екущую дату.... в общем ?????

      Удалить
    5. P.P.S. Инструкция
      SELECT Name, database_id, create_date
      FROM sys.databases
      GO
      Позволяет всеже увидеть, что системные базы есть и есть рабочие 1с базы (при попытке развернуть, посмотреть и зайти в перечеь database на сервере, server management studio ругается и не раскрывает дерево существующих баз.)

      Удалить
    6. Serge, в директории DATA хранятся ваши рабочие служебные БД (которые в данный момент используются SQL Server).
      В Templates - здесь есть файлы служебных баз. Они здесь появились во время установки SQL Server. Менять отсюда - значит потерять все ваши данные. И скорее всего тут Collation будет другой, чем сейчас - а это может привести к ошибкам при выполнении запросов!Тогда сделайте лучше так: забэкапьте базу master и все ваши пользовательские БД, затем сделайте всё, как описано в инструкции в разделе "Сбой и восстановление базы данных master". Но я бы попробовал сначала вариант с восстановлением базы msdb (как я описал выше)

      Удалить
    7. Dobrozol, спасибо большое за Ваши советы и рекомендации. Я попробую так как вы предлагаете т.е. Посмотреть еще раз логи, и "сначала вариант с восстановлением базы msdb". Я пока еще не разобрался где, кто в какой директории лежит и + у меня там 2 базы как вы видели...Но думаю, что в ближайшее время попробую. Боюсь правда, что еще до этой попытки опять возникнут вопросы ;) сорри.

      Удалить
    8. P.S. + мне еще нужно осмыслить ваше сообщение выше: "Можно попробовать подключить файлы этой БД, как новую пользовательскую базу и затем восстановить.....". Не понял как это сделать. Но попробую сегодня вечером потренироваться дома "на кошках".....

      Удалить
    9. Serge, "Можно попробовать подключить файлы этой БД, как новую пользовательскую базу и затем восстановить....."
      1) остановите SQL Server;
      2) скопируйте файлы базы msdb (MSDBData.mdf и MSDBLog.ldf) в отдельный каталог;
      3) запустите SQL Server;
      4) подключите новую пользовательскую базу msdb_test (команда attach), указав пути к скопированным файлам;
      5) далее на этой базе выполните:
      EXEC sp_resetstatus [dbname];
      ALTER DATABASE [dbname] SET EMERGENCY;
      DBCC checkdb([dbname]);
      ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
      DBCC CheckDB ([dbname], REPAIR_ALLOW_DATA_LOSS);
      ALTER DATABASE [dbname] SET MULTI_USER;
      6) если после этого новая база msdb_test успешно поднимется... Тогда можно снова остановить SQL Server и подменить файлы базы msdb файлами восстановленной базы msdb_test.

      Удалить
    10. Aga, Dobrozol, как по мне - отличная идея. Думаю, что ее надо опробовать (всеравно что-то надо делать, это ж не может тянуться вечно). Спасибо большое. На следующей недельке попробую это реализовать на рабочих базах. (К стати о базах ;) : В Management Studio дерево Management не ракрывается (он просто ругается и ничего не показывает, так что логи из самого студио я посмотреть не могу..... Только логи в ....MSSQL\Log\ERRORLOG )

      Удалить
    11. P.S. Я правильно понимаю, что в пункте 2 выше ("скопируйте файлы базы msdb (MSDBData.mdf и MSDBLog.ldf) в отдельный каталог) берем эти файлы из директории ...MSSQL\DATA, т.е. текущие версии ?

      Удалить
  3. Ув. Dobrozol,
    У меня родилась еще одна крамольная мысля:
    1)Создаем резервную копию баз (ы) с помощью 1С сервераж
    2)Создаем еще один instance нас SQL Server (с этим нет проблем. Разумеется через SQL Installation centre);
    3)Надеюсь, что в новом инстансе с системными базами все будет ОК;
    4)Подключаем резервную копию из 1С (пока только не понял как правильно это сделать);
    5)Очевидно нужны будут какие-то донастройки.
    6)Настравиваем правильно/почти правильно агент на резервирование ВСЕХ баз
    7)Отключаемся (после проверки) от старой версии в предыдущем инстансе.

    Пожалуйста, по возможности, прокомментируйте данную идею..

    ОтветитьУдалить
    Ответы
    1. Serge, я вижу два способа восстановления. Оба их я уже описал. первый - попробовать восстановить базу msdb как отдельную пользовательскую базу и на ней запустить checkdb.
      второй способ (если первый не пройдёт) - "забэкапьте базу master и все ваши пользовательские БД, затем сделайте всё, как описано в инструкции в разделе "Сбой и восстановление базы данных master".
      Ваш вариант мне неясен. Экспериментируйте, пробуйте.. только сначала сделайте резервные копии для всех БД.

      Удалить
    2. ОК dobrozol спасибо большое. Я так и сделаю (во сяком случаем попробую), как Вы написали. (Мое же предложение скорее касается самого 1С. Т.е сделалать выгрузку базы из 1С. Сохранить ее еще раз где-то. Создать новый инстанс/instance на SQL Sevrver и к нему уже подключить (через 1с) эту сохраненную базу. Если все будет ок, то и грубо говоря "забыть", что есть предыдущий инстанс с поломанными системными базами. Т.е. это варинат не ремонта, скорее "ухода на новый сервер" )

      Удалить
    3. Dobrozol, сорри, но при попытке подключить - Attach MSDBData.mdf и MSDBLog.ldf файлы (после окстановки и копирования самиъ файлов в бругую директрию из ....DATA) ПОЛУЧАЮ - Cannot attach a database with the same name as an existing database. Наверное можно сделать что-то вроде "attach as", но этой опции я в упор не вижу...х.з.

      Удалить
    4. Serge, посмотрите документацию: https://msdn.microsoft.com/ru-ru/library/ms179877(v=sql.110).aspx
      там в конце есть пример подключения. В качестве имени базы нужно указать msdb_test

      Удалить