У нас есть БД SQL 2000. Сбой сервера из-за сбоя массива Raid. Теперь, когда мы запускаем DBCC CHECKDB, мы получаем ошибку, что на 9 страницах есть 27 ошибок согласованности.
Когда мы запускаем DBCC PAGE на этих страницах, мы получаем это:
Msg 8939, Level 16, State 106, Line 1
Table error: Object ID 1397580017, index ID 2, page (1:8404521). Test (m_freeCnt == freeCnt) failed. Values are 2 and 19.
Msg 8939, Level 16, State 108, Line 1
Table error: Object ID 1397580017, index ID 2, page (1:8404521). Test (emptySlotCnt == 0) failed. Values are 1 and 0.
Поскольку указанный индекс не является кластеризованным и создается уникальным ограничением, включающим 2 столбца, мы попытались удалить и воссоздать индекс. Это привело к следующей ошибке:
CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 2. Most significant primary key is '3280'.
The statement has been terminated.
Однако работает
Select var_id,result_on
from tests
group by var_id,result_on
having count(*)>1
возвращает 0 строк
Вот что мы планируем сделать:
- Восстановите аварийную копию БД перед сервером и запустите DBCC CHECKDB.
- Если это возвращает чистый, то восстановите снова без восстановления
- Применить все последующие резервные копии TLOG
- Остановите производственное приложение, сделайте резервную копию хвостового журнала и примените это тоже
- Бросьте prod DB и переименуйте только что восстановленную DB, чтобы сделать ее
- Запустить приложение prod
Может ли кто-нибудь пробить дыры в этом подходе? Может быть, предложить другой подход? Нам нужно минимальное время простоя.
SQL 2000 DB Размер 94 ГБ Таблица с поврежденными страницами содержит 460 миллионов + строк данных
Спасибо за помощь.
Радж
Ответы:
Ваше решение для восстановления - это учебник. Если у вас есть соответствующие резервные копии и вы можете создать резервную копию журнала транзакций для поврежденной базы данных, тогда ваша стратегия - это учебник, который нужно реализовать.
Однако, прежде чем продолжить, рассматривали ли вы возможность воссоздания только затронутой таблицы?
Иногда вы можете создать точную копию затронутой таблицы, выполнив
Затем просто удалите / замените поврежденную таблицу новой, не забывая добавить соответствующие ограничения и индексы.
источник
Я попытался бы сначала объединить данные в файл, а затем вернуть их обратно в новую таблицу. SELECT INTO не подходит (IMO) для такого количества записей ...
источник