SQL Server - Есть ли способ восстановить поврежденную базу данных без резервного копирования?

Я имитирую коррупцию базы данных для своей собственной практики. То, что я сделал, это редактировать файл .LDF и испортить его, а когда я запускаю SQL-сервер, база данных находится в режиме "Recovery Pending" , то есть она была повреждена.

Не восстанавливая резервную копию или не заменяя резервный файл .LDF , можно ли каким-либо образом восстановить мою базу данных?

Примечание. Я не заинтересован в использовании сторонних инструментов / программного обеспечения.

Поблагодарили бы за любое предложение.

Всего 2 ответа


Попробуйте использовать эти команды в основной базе данных. Он сбросит состояние базы данных, чтобы вы могли с ней работать. Это приведет к переходу в SINGLE USER MODE и ROLLBACK. После ремонта он позволит MULTIUSER AGAIN.

EXEC sp_resetstatus 'yourDBname'
ALTER DATABASE yourDBname SET EMERGENCY
DBCC checkdb('yourDBname')
ALTER DATABASE yourDBname SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ('yourDBname', REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE yourDBname SET MULTI_USER

Вы также можете вернуть базу данных в онлайновом режиме без файла .ldf (поскольку он поврежден или даже без файла .ldf вообще). Основываясь на вашем вопросе, я предполагаю, что у вас было закрытие БД, прежде чем вы повредили журнал (если нет другого пути, просто при необходимости отправьте запрос на обновление в комментарии). Чтобы проверить, что просто запустить:

SELECT [name], [state_desc], [is_cleanly_shutdown] FROM sys.databases;

Тогда, если [is_cleanly_shutdown] = 1 и у вас был только один файл журнала для вашей базы данных (в основном это так):

CREATE DATABASE [Your_DB_Name] ON
(FILENAME = N'D:full_file_pathdb.mdf')
FOR ATTACH; 

Если у вас несколько файлов журнала, выполните следующие действия:

CREATE DATABASE [DB_Name] ON
(FILENAME = N'D:full_file_pathdb.mdf')
FOR ATTACH_REBUILD_LOG;

В обоих сценариях вы создадите новый файл журнала (только один файл журнала), размер которого будет равен 0,5 МБ, поэтому вы должны изменить его для своих нужд:

ALTER DATABASE [Your_DB_Name] MODIFY FILE
(
 NAME = N'DB_Name_log'
,SIZE = 100 {KB | MB | GB | TB | UNLIMITED }
,FILEGROWTH = 20 {KB | MB | GB | TB | % })
);

Есть идеи?

10000