Архив

Публикации с меткой ‘DBCC DBReindex’

История одного восстановления БД(MS SQL Server 2005). Часть 2

22 Октябрь 2009 Нет комментариев

Продолжаю тему восстановления  БД, начатую тут. Закончилось всё довольно таки успешно.

Итак…. Не помог мне

ALTER DATABASE ‘DatabaseName’SET SINGLE_USER
(‘DatabaseName’, REPAIR_REBUILD)
ALTER DATABASE ‘DatabaseName’ SET MULTI_USER

не помог и

DBCC CHECKDB(‘DatabaseName’, REPAIR_ALLOW_DATA_LOSS)

Так как удалось найти битую таблицу(в ней как раз наибольшее кол-во строк), принялся её реанимировать нестандартными способами. Попробовал сделать выборку данных- выкинуло в ошибку, но успело вернуть несколько миллионов записей. Попробовал сделать выборку, с ключом desc — таким образом вытащил ещё кусок данных с конца таблицы. Кстати, select стал выбирать больше записей после того как убил все индексы кроме Primary Key. Пошаманив ещё несколько часов и не получив желаемого результата, создал клон битой таблицы без данных и с помощью:

insert into tablename(fields) select top КОЛ-ВО_СТРОК1 *  from tableoriginal order by fieldnamePK asc

insert into tablename(fields) select top КОЛ-ВО_СТРОК2 *  from tableoriginal order by fieldnamePK desc

заполнил новую таблицу данными. Старую удалил, а эту переименовал так как нужно.

Должен сказать, что таким образом удалось восстановить почти все записи.

Для остальных БД выполнил DBCC CHECKDB() , откуда узнал какие из таблиц битые. Им помогла DBCC DBReidex(‘Tablename’) для битых таблиц.

На этом всё и закончилось.

Желаю вам надёжных хардов и меньше подобных проблем!

VN:F [1.9.13_1145]
Rating: 0.0/10 (0 votes cast)

История одного восстановления БД(MS SQL Server 2005)

15 Октябрь 2009 Нет комментариев

История началась с того, что умер винт в (0). Слава Богам, удалось создать виртуальный образ с помощью RAID Reconstructor от Runtime Software. С помощью приложения Captain Nemo(от того же Runtime Software) часов за 8-10(два винта по 300 ГБ) удалось построить структуру и файловой системы опираясь на виртуальный образ созданный RAID Reconstructor»ом. Ещё за несколько часов восстановились базы, общим весом около 10 ГБ. 70% работы, казалось бы, выполнено! Особо не радуясь, принялся восстанавливать сервер.

Взял новые винты. Установил ту же систему, тот же 2005 с тем же collation. Сделал Attach DataBase для всех восстановленных баз, кроме системных. Для того, чтобы избежать лишних проблем, базы нужно размещать в те же папки что и до того как система упала. Заменил базу master на свою восстановленную(о том как перемещать системные базы, в том числе master и MSDB, читал тут http://msdn.microsoft.com/ru-ru/library/ms345408.aspx; позже выложу у себя весь текст статьи).

Выполнил несколько селектов — кажется, всё ок.

Запускаю приложение, использующие эти базы… и на одной из форм получаю красивенький exception: «SQL Server detected a logical consistency-based i/o error: incorrect pageid».

Выполняю () — не спасло.

Пробую (‘DatabaseName’) - после ряда сообщений, команда прерывается с сообщением об ошибке:

Msg 8967, Level 16, State 216, Line 1
An internal error occurred in DBCC which prevented further processing. Please contact Product Support.

Выполнение остановилось как раз на самой большой таблице в базе.

Деваться некуда, запускаю

ALTER DATABASE ‘DatabaseName’SET SINGLE_USER
DBCC CHECKDB(‘DatabaseName’, REPAIR_REBUILD)
ALTER DATABASE ‘DatabaseName’ SET MULTI_USER

REPAIR_REBUILD-попробует восстановить БД без потери данных.

Жду завершения  выполнения команды.

Если не восстановит, буду пробовать

DBCC CHECKDB(‘DatabaseName’, REPAIR_ALLOW_DATA_LOSS)

Обязательно отпишусь чем всё закончилось. Ещё не выполнял DBCC CHECKDB(‘DatabaseName’) для остальных баз.

Продолжение следует….

VN:F [1.9.13_1145]
Rating: 10.0/10 (1 vote cast)

Изменения перестроения индексов в SQL Server.

Нужно было сегодня перестроить индексы в таблице. Обратился к google.com, чтобы вспомнить как правильно команда пишется. Синтаксис таков:


DBCC  DBREINDEX
(
table_name
[ , index_name [ , fillfactor ] ]
)
[ WITH NO_INFOMSGS ]

Но инетересно не это, интересна вот какая фраза:

Важно!
В будущей версии Microsoft эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. Используйте вместо этого инструкцию ALTER INDEX.

Теперь перестройку индексов нужно проводить следующим образом:


USE AdventureWorks;
GO
ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee
REBUILD;
GO
VN:F [1.9.13_1145]
Rating: 9.0/10 (1 vote cast)