Итак, во-первых останавливаем службу SQL Server и копируем файлы базы данных (*.mdf и *.ldf) в другую папку, чтобы можно было восстановить их в случае неудачи.
Для всех версий SQL Server подойдет следующий вариант: делаем Detach database(отсоединить базу данных), удаляем журнал транзакций(файл с расширением ldf) и делаем Attach database(присоединить базу данных). В мастере выбираем наш mdf файл и жмем ОК.
Если mdf файл не поврежден, то он успешно присоединится и мы увидим нашу базу в диспетчере объектов целую и невредимую.
Радуемся успешному восстановлению. (Этот вариант сработает только если mdf файл не поврежден, поэтому срабатывает не всегда).
Если не получилось, то создаем новую базу данных с таким же именем, останавливаем сервер. Подменяем файл mdf файлом от нашей базы, стартуем службу SQL Server и открываем Query analyzer(SQL 2000) или Management studio(SQL 2005/2008) в зависимости от нашей версии сервера.
Пишем следующее:
1
2 3 4 5 |
USE master
GO sp_configure ‘allow updates’, 1 reconfigure WITH override GO |
Если у вас SQL 2000, то далее пишем:
1
2 |
UPDATE sysdatabases SET STATUS= 32768 WHERE name = ‘db_name’
GO |
Если SQL 2005 или 2008, то пишем:
1
2 |
ALTER DATABASE db_name SET EMERGENCY, SINGLE_USER
GO |
где вместо db_name пишем имя своей БД
Жмем F5. После этого наша БД должна быть видна в статусе EMERGENCY. Отлично, приступаем к восстановлению.
Все что написали стираем, чтобы не смущало, и пишем.
Для SQL 2000:
1
2 |
DBCC REBUILD_LOG(‘db_name’, ‘Полный путь к новому файлу ldf’)
GO |
Жмем F5, если все нормально, сервер скажет: Warning: The log for database ‘db_name’ has been rebuilt.
Стираем и пишем:
1
2 3 4 5 6 7 8 |
USE master
GO sp_dboption ‘db_name’, ‘single user’, ‘true’ GO USE db_name GO DBCC CHECKDB(‘db_name’, REPAIR_REBUILD) GO |
если DBCC не хочет выполняться, то вместо REPAIR_REBUILD нужно подставить REPAIR_ALLOW_DATA_LOSS
Жмем F5, ждем некоторое время. Сервер вернет кучу сообщений. Если там будут содержаться ошибки, то лучше еще раз выполнить DBCC CHECKDB с параметром REPAIR_REBUILD, пока все ошибки не будут устранены.
Для SQL 2005/2008 действия несколько иные:
1
2 |
DBCC CHECKDB(‘db_name’, REPAIR_ALLOW_DATA_LOSS)
GO |
Тут без вариантов. В SQL 2005 и выше нет инструкции REBUILD_LOG, вместо этого выполняется CHECKDB с параметром REPAIR_ALLOW_DATA_LOSS.
После того как сервер закончит выполнять запрос и вернет результат, меняем REPAIR_ALLOW_DATA_LOSS на REPAIR_REBUILD и выполняем запрос еще раз, это должно убрать оставшиеся ошибки в бд.
После всего этого наша база становится в нормальное состояние и уже доступна для работы с ней, но только в однопользовательском режиме, поэтому завершаем наш процесс возвращением бд в многопользовательский режим.
Пишем:
Для SQL 2000:
1
2 3 4 |
USE master
GO sp_dboption ‘db_name’, ‘single user’, ‘false’ GO |
Для SQL 2005/2008:
1
2 |
ALTER DATABASE db_name SET ONLINE, MULTI_USER
GO |
Все. База онлайн и готова к работе. Радуемся и не забываем делать бэкапы.