*Drive*- Здесь рулят padonki

*Drive* - Counter Strike Source
It is currently 19 Jul 2018, 11:43

All times are UTC + 3 hours [ DST ]




Post new topic Reply to topic  [ 1 post ] 
Author Message
PostPosted: 24 Jan 2018, 15:55 
Offline
padonki
User avatar

Joined: 14 Aug 2006, 20:43
Posts: 3647
Location: Солнцево
Has thanked: 9 times
Have thanks: 41 times
Рассмотрим несколько вариантов восстановления БД, в зависимости от того, насколько повреждены файлы БД зависит успешность того или иного метода. Все описанные способы были лично мной проверены на практике и все случаи восстановления, за исключением одного, были успешны. Используйте данное руководство на свой страх и риск, за совершенные вами действия ответственность несете, вы сами.
Итак, во-первых останавливаем службу SQL Server и копируем файлы базы данных (*.mdf и *.ldf) в другую папку, чтобы можно было восстановить их в случае неудачи.
Если у вас есть свежий актуальный бэкап, то дальше можете не читать, а просто восстановите БД из него, тем самым сэкономите драгоценное время, далее я приведу алгоритмы восстановления для разных версий SQL Server. Надеюсь вам это поможет, как в свое время помогло и мне.
Для всех версий SQL Server подойдет следующий вариант: делаем Detach database(отсоединить базу данных), удаляем журнал транзакций(файл с расширением ldf) и делаем Attach database(присоединить базу данных). В мастере выбираем наш mdf файл и жмем ОК.

Если mdf файл не поврежден, то он успешно присоединится и мы увидим нашу базу в диспетчере объектов целую и невредимую.
Радуемся успешному восстановлению. (Этот вариант сработает только если mdf файл не поврежден, поэтому срабатывает не всегда).

Присоединить один mdf файл без журнала транзакций, если у вас SQL 2005 и выше, можно командами

Code:
EXEC sp_attach_single_file_db @dbname='db_name', @physname='D:Dbdb_name.mdf'


или
Code:
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) в зависимости от нашей версии сервера.
Пишем следующее:

Code:
Use master
go
sp_configure 'allow updates', 1
reconfigure with override
go


Если у вас SQL 2000, то далее пишем:

Code:
update sysdatabases set status= 32768 where name = 'db_name'
GO


Если SQL 2005 или 2008, то пишем:
Code:
ALTER DATABASE db_name SET EMERGENCY, SINGLE_USER
GO


де вместо db_name пишем имя своей БД
Жмем F5. После этого наша БД должна быть видна в статусе EMERGENCY. Отлично, приступаем к восстановлению.
Все что написали стираем, чтобы не смущало, и пишем.

Для SQL 2000:
Code:
DBCC REBUILD_LOG('db_name', 'Полный путь к новому файлу ldf')
GO


Жмем F5, если все нормально, сервер скажет: Warning: The log for database ‘db_name’ has been rebuilt.

Стираем и пишем:
Code:
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, то можно попробовать следующее:

Code:
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 действия несколько иные:
Code:
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:

Code:
Use master
go
sp_dboption 'db_name', 'single user', 'false'
go


Для SQL 2005/2008:
Code:
alter database db_name set ONLINE, MULTI_USER
GO


Все. База онлайн и готова к работе. Радуемся и не забываем делать бэкапы.


З.Ы. МЕНЯ ЭТО СЕГОДНЯ РЕАЛЬНО СПАСЛО ! :) Хотя бэкапы делаю. Но во время бэкапа и произошло дерьмо....

источник

_________________
Моя характеристика с детского сада: Хорошо кушает, спит, гуляет! Прошло много лет, ничего не изменилось.
Image


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC + 3 hours [ DST ]


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  


Powered by -=PadonaK=- ®, Forum Drivesource.ru, Статситика игрового ресурса *Drive* HLstatsX, Система забаненых игроков Sourcebans

drivesource.ru ® 2006-2018