Итак, во-первых останавливаем службу SQL Server и копируем файлы базы данных (*.mdf и *.ldf) в другую папку, чтобы можно было восстановить их в случае неудачи.
Если у вас есть свежий актуальный бэкап, то дальше можете не читать, а просто восстановите БД из него, тем самым сэкономите драгоценное время, далее я приведу алгоритмы восстановления для разных версий SQL Server. Надеюсь вам это поможет, как в свое время помогло и мне.
Для всех версий SQL Server подойдет следующий вариант: делаем Detach database(отсоединить базу данных), удаляем журнал транзакций(файл с расширением ldf) и делаем Attach database(присоединить базу данных). В мастере выбираем наш mdf файл и жмем ОК.
Если mdf файл не поврежден, то он успешно присоединится и мы увидим нашу базу в диспетчере объектов целую и невредимую.
Радуемся успешному восстановлению. (Этот вариант сработает только если mdf файл не поврежден, поэтому срабатывает не всегда).
Присоединить один mdf файл без журнала транзакций, если у вас SQL 2005 и выше, можно командами
Код: Выделить всё
EXEC sp_attach_single_file_db @dbname='db_name', @physname='D:Dbdb_name.mdf'
Код: Выделить всё
CREATE DATABASE db_name
ON (filename = 'd:dbdb_name.mdf')
FOR ATTACH_REBUILD_LOG
Пишем следующее:
Код: Выделить всё
Use master
go
sp_configure 'allow updates', 1
reconfigure with override
go
Код: Выделить всё
update sysdatabases set status= 32768 where name = 'db_name'
GO
Код: Выделить всё
ALTER DATABASE db_name SET EMERGENCY, SINGLE_USER
GO
Жмем F5. После этого наша БД должна быть видна в статусе EMERGENCY. Отлично, приступаем к восстановлению.
Все что написали стираем, чтобы не смущало, и пишем.
Для SQL 2000:
Код: Выделить всё
DBCC REBUILD_LOG('db_name', 'Полный путь к новому файлу ldf')
GO
Стираем и пишем:
Код: Выделить всё
Use master
go
sp_dboption 'db_name', 'single user', 'true'
go
USE db_name
GO
DBCC CHECKDB('db_name', REPAIR_REBUILD)
go
Жмем F5, ждем некоторое время. Сервер вернет кучу сообщений. Если там будут содержаться ошибки, то лучше еще раз выполнить DBCC CHECKDB с параметром REPAIR_REBUILD, пока все ошибки не будут устранены.
Upd: как подсказал Anim в комментах ниже, если и в этом случае запрос не хочет выполняться, БД не хочет переходить в Single User Mode, то можно попробовать следующее:
Код: Выделить всё
use db_name
alter database 'db_name' set SINGLE_USER with rollback immediate
go
USE db_name
GO
DBCC CHECKDB('db_name', REPAIR_REBUILD)
go
Код: Выделить всё
DBCC CHECKDB('db_name', REPAIR_ALLOW_DATA_LOSS)
GO
После того как сервер закончит выполнять запрос и вернет результат, меняем REPAIR_ALLOW_DATA_LOSS на REPAIR_REBUILD и выполняем запрос еще раз, это должно убрать оставшиеся ошибки в бд.
После всего этого наша база становится в нормальное состояние и уже доступна для работы с ней, но только в однопользовательском режиме, поэтому завершаем наш процесс возвращением бд в многопользовательский режим.
Пишем:
Для SQL 2000:
Код: Выделить всё
Use master
go
sp_dboption 'db_name', 'single user', 'false'
go
Код: Выделить всё
alter database db_name set ONLINE, MULTI_USER
GO
З.Ы. МЕНЯ ЭТО СЕГОДНЯ РЕАЛЬНО СПАСЛО !

источник