Довелося зіткнутися з проблемою, коли у клієнта виникали "специфічні" помилки наступного характеру:
The following error (s) have occurred: Оригінальне повідомлення про помилку: I / O error (bad page ID) detected during read at offset 0x00000010a5c000 in fileC: \ terrasoft \ Data \ terrasoftCRM 30x15 Rus.mdf
Помилка збереження запису. Оригінальне повідомлення про помилку: I / O error (bad page ID) detected during read at offset 0x00000010a58000 in fileC: \ terrasoft \ Data \ terrasoftCRM 30x15 Rus.mdf
Оригінальне повідомлення про помилку: Could not find the index entry for RID '16f1d2207bc9455f408a6e73882fe163ff010000' in index page (1: 498400), index ID 0, database 'TSCRM30'. «Call Stack»
Дана помилка виникає при збоях сервера бази даних. Для вирішення потрібно виконати скрипт, на базі даних за допомогою Query Analyzer або Management Studio:
ALTER DATABASE Названіе_бази SET single_user
DBCC CHECKDB ( 'Названіе_бази'. Repair_allow_data_loss)
ALTER DATABASE Названіе_бази SET multi_user
Є одне невелике зауваження
DBCC CHECKDB з параметром repair_allow_data_loss
може привести до втрати даних і, можливо, до порушення логічної цілісності системи
рекомендується
- використовувати резервні копії
- спочатку запускати
DBCC CHECKDB з опцією repair_rebuild і тільки - якщо даний варіант не допоможе (в самому крайньому випадку, якщо немає іншого виходу), то з опцією repair_allow_data_loss
Теж поділюся досвідом :)
Звичайно такі критичні помилки з'являються не просто так, а як правило це відбувається коли хтось змінює дані в базі даних а при цьому. вимикається світло або хтось кнопочку ВИКЛ натиснув на сервері (буває навіть таке, що замість сервера використовується ПК якогось співробітника :)). Все було б добре якби на сервері баз даних стояв UPS, а як правило на це не звертають поки грім не вдарить. dbcc checkdb не завжди може допомогти, хоча звичайно і мене рятував :) А ось якщо вже трапилася дана проблема, то я б рекомендував зробити наступне:
1. Спробувати варіанти з dbcc checkdb
2. Якщо Вам пощастило, то створити повну копію бази або з бекапу з інсталяції або sql скриптами і за допомогою утиліт Import / Export, SSIS "перелити" дані в нову базу і. поставити UPS на сервер, налаштувати автоматичний бекап з верифікацією і жити спокійно :)
3. Якщо все таки деякі таблиці не можна відновити те, у мене виходило витягнути дані з таких таблиць за допомогою select top. пакетами і "перелити" їх в чисту копію.
Може пощастить і Ви зможете витягнути побільше :)