*Drive*- Здесь рулят padonki https://www.drivesource.ru/ |
|
Восстановление MS SQL базы данных из состояния SUSPECT https://www.drivesource.ru/viewtopic.php?f=22&t=1594 |
Страница 1 из 1 |
Автор: | Padonak [ 24 янв 2018, 15:55 ] |
Заголовок сообщения: | Восстановление MS SQL базы данных из состояния SUSPECT |
Рассмотрим несколько вариантов восстановления БД, в зависимости от того, насколько повреждены файлы БД зависит успешность того или иного метода. Все описанные способы были лично мной проверены на практике и все случаи восстановления, за исключением одного, были успешны. Используйте данное руководство на свой страх и риск, за совершенные вами действия ответственность несете, вы сами. Итак, во-первых останавливаем службу 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 Если не получилось, то создаем новую базу данных с таким же именем, останавливаем сервер. Подменяем файл mdf файлом от нашей базы, стартуем службу SQL Server и открываем Query analyzer(SQL 2000) или Management studio(SQL 2005/2008) в зависимости от нашей версии сервера. Пишем следующее: Код: Use master go sp_configure 'allow updates', 1 reconfigure with override go Если у вас SQL 2000, то далее пишем: Код: update sysdatabases set status= 32768 where name = 'db_name' GO Если SQL 2005 или 2008, то пишем: Код: ALTER DATABASE db_name SET EMERGENCY, SINGLE_USER GO де вместо db_name пишем имя своей БД Жмем F5. После этого наша БД должна быть видна в статусе EMERGENCY. Отлично, приступаем к восстановлению. Все что написали стираем, чтобы не смущало, и пишем. Для SQL 2000: Код: DBCC REBUILD_LOG('db_name', 'Полный путь к новому файлу ldf') GO Жмем F5, если все нормально, сервер скажет: Warning: The log for database ‘db_name’ has been rebuilt. Стираем и пишем: Код: 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, пока все ошибки не будут устранены. 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 Для SQL 2005/2008 действия несколько иные: Код: 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: Код: Use master go sp_dboption 'db_name', 'single user', 'false' go Для SQL 2005/2008: Код: alter database db_name set ONLINE, MULTI_USER GO Все. База онлайн и готова к работе. Радуемся и не забываем делать бэкапы. З.Ы. МЕНЯ ЭТО СЕГОДНЯ РЕАЛЬНО СПАСЛО ! Хотя бэкапы делаю. Но во время бэкапа и произошло дерьмо.... источник |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |