Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2012.01.15;
Скачать: [xml.tar.bz2];

Вниз

Лечение MS SQL. Вопрос знатокам.   Найти похожие ветки 

 
Фокс Йожин   (2011-10-01 16:59) [0]

Есть некая таблица MyTable. При выборке SELECT * FROM MyTable получаю ошибку:
SQL Server обнаружил логическую ошибку ввода-вывода, связанную с согласованностью: недопустимый параметр защиты. Она произошла при прочитать страницы (1:1412094) в базе данных с идентификатором 10 по смещению 0x000002b17fc000 файла "D:\Base \BC1\BC1.mdf". Дополнительные сведения см. в журнале ошибок SQL Server и журнале системных событий. Это серьезная ошибка, которая угрожает целостности базы данных и должна быть немедленно исправлена. Выполните полную проверку базы данных на согласованность (DBCC CHECKDB). Эта ошибка может быть вызвана многими причинами; дополнительные сведения см. в электронной документации по SQL Server.

DBCC CHECKTABLE (и CHECKDB) ... REPAIR_REBUILD (и  REPAIR_ALLOW_DATA_LOSS) не помогли.
Выдаётся сообщение:
Ошибка таблицы: идентификатор объекта 0, идентификатор индекса -1, идентификатор секции 0, идентификатор единицы размещения 1690302107615232 (тип Unknown), страница (38912:1). Тест (IS_OFF (BUF_IOERR, pBUF->bstat)) не прошел. Значения - 12584969 и -4.
Система не может самостоятельно исправить эту ошибку.
Сообщение 8939, уровень 16, состояние 98, строка 1
Ошибка таблицы: идентификатор объекта 0, идентификатор индекса -1, идентификатор секции 0, идентификатор единицы размещения 1690302107615232 (тип Unknown), страница (38912:1). Тест (IS_OFF (BUF_IOERR, pBUF->bstat)) не прошел. Значения - 12584969 и -4.
       Для исправления данной ошибки необходимо сначала исправить другие ошибки.
...

Чего бы еще предпринять? Имеющиеся бэкапы тоже содержат эту ошибку...


 
Ega23 ©   (2011-10-01 17:07) [1]


> Чего бы еще предпринять? Имеющиеся бэкапы тоже содержат
> эту ошибку...


Вычленить диапазон записей из данной таблицы, которые попадают под ошибку и их удалить?


 
sniknik ©   (2011-10-01 17:08) [2]

> SELECT * FROM MyTable
SELECT AnyField FROM MyTable
SELECT AnyButNonBiFirstField FROM MyTable
SELECT TOP 1 * FROM MyTable
SELECT * FROM MyTable WHERE KeyField = 11
дают ошибку?

могут быт противоречивые данные (покоцанные) и типа в ключе дублировались... тогда вычислить и удалить, или скопировать обходя в копию таблицы.


 
Фокс Йожин   (2011-10-01 17:19) [3]


> sniknik ©   (01.10.11 17:08) [2]

SELECT AnyField FROM MyTable - ошибка
SELECT AnyButNonBiFirstField FROM MyTable - ошибка
SELECT TOP 1 * FROM MyTable - нет ошибки
SELECT * FROM MyTable WHERE KeyField = 11 - нет ошибки


> Ega23 ©   (01.10.11 17:07) [1]
>
>

DELETE? Попробую, но ведь при выборке этого диапазона возникает ошибка...


 
Ega23 ©   (2011-10-01 17:37) [4]


> Попробую, но ведь при выборке этого диапазона возникает
> ошибка...


Выдели этот диапазон.
Например, таблица, ID c 1 по 1000. Битые записи в диапазоне 439-523.
Найди этот диапазон и удали. Либо перенеси в другую таблицу всё, что лежит вне рамок данного диапазона.


 
sniknik ©   (2011-10-01 17:54) [5]

> этого диапазона возникает ошибка...
> SELECT TOP 1 * FROM MyTable - нет ошибки
> SELECT * FROM MyTable WHERE KeyField = 11 - нет ошибки
есть все чтобы вычислить и удалить... операции > < известны? ну, вперед.

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


 
sniknik ©   (2011-10-01 17:59) [6]

+
операция удаления не обязана читать данные... ей достаточно поставить метку.  
а уж после этого DBCC CHECKDB сработает, т.к. не будет заморачиваться целостностью удаленного "мусора".


 
Фокс Йожин   (2011-10-01 18:31) [7]


> sniknik ©   (01.10.11 17:54) [5]


>
> есть все чтобы вычислить и удалить... операции > < известны?
>  ну, вперед.
>

Дык, ключ не понятно как сгенерён.
Делаю:
select top 9230
* from MyTable
order by ID
выбирает нормально, меняю количество на 9231 - ошибка.

беру ключ последней записи выборки, делаю:
select * from MyTable
where ID <= LastKey

получаю ошибку


 
sniknik ©   (2011-10-01 19:49) [8]

> получаю ошибку
естественно... ID <= LastKey это фактически ВСЕ записи, т.е. вообще без условия, а это еще в [0]  написано включает ошибочную запись.

> Дык, ключ не понятно как сгенерён.
это ты непонятно как сгенерён... в школе учился?

сколько всего записей? допустим 1000, + допустим ID автоинкремент и соответствует порядку (для примера сойдет), т.е. первая 1 последняя 1000.

берем половину - 500
select * from MyTable where ID <= 500 работает?
select * from MyTable where ID > 500 работает?

допустим ошибка на втором запросе т.е. теперь первая 501 последняя 1000.

берем половину - 750
select * from MyTable where ID > 500 AND <= 750 работает?
select * from MyTable where ID > 750 работает?

и т.д. рекурсия блин. метод половинного деления.


 
Фокс Йожин   (2011-10-01 21:21) [9]


> сколько всего записей? допустим 1000, + допустим ID автоинкремент
> и соответствует порядку (для примера

1. Первичный ключ - символьный
2. LastKey - это последний ключ в выборке первых неглючных 9230 записей, select top 9230 * from ... order by ID,
3. Половинное деление подходит, если глючный диапазон - один, а если  внутри него есть живые диапазоны, чередующиеся с глючными?


 
sniknik ©   (2011-10-01 22:16) [10]

> 1. Первичный ключ - символьный
и что? больше, меньше не работает? или половину рассчитать не можешь? ну так это не обязательно должна быть половина, дели по не предопределение количеству. всего то проблем больше итераций будет.

> 2. LastKey - это последний ключ в выборке первых неглючных 9230 записей, select top 9230 * from ... order by ID
и что?
с order by и без порядок может быть разный.

> 3. Половинное деление подходит, если глючный диапазон - один, а если  внутри него есть живые диапазоны, чередующиеся с глючными?

ну так сделай над собой усилие, и ищи в 2х-3-х диапазонах, в скольких понадобится, до записей...
вообще, тебе нужно восстановить или нет? может ну его нафиг, грохни базу и начни все сначала (символьный на искусственный ключ с автоинкрементом не забудь поменять).


 
sniknik ©   (2011-10-01 22:26) [11]

Можно еще попробовать удалить ключи/индексы... на время.


 
Фокс Йожин   (2011-10-01 22:44) [12]


> sniknik ©   (01.10.11 22:16) [10]


>  ну так это не обязательно должна быть половина, дели по
> не предопределение количеству. всего то проблем больше итераций
> будет.

Ничего не понял. Вот ключи из 16 символов: AAABBBCCCDD ... 1345FF,
EEBBCCCDD ... AA55C, и т.д. Как перебирать диапазоны?


> и что?
> с order by и без порядок может быть разный.

вычленил диапазон с помощью двух запросов select top N ... order by ID и select top M ... order by ID desc

Сохранил полученные ID во временную таблицу tmp_MyTable
Делаю delete form MyTable where ID not in (select ID from tmp_MyTable)
Т.е. удаляю все записи, кроме тех, что выбрались без ошибки.
Всё равно падает с ошибкой ввода-вывода.


> вообще, тебе нужно восстановить или нет? может ну его нафиг, грохни базу и начни все сначала (символьный
> на искусственный ключ с автоинкрементом не забудь поменять).
>
>

Нужно. База - 1С:УПП. Так что, ни о каких самодельных автоинкрементах не может быть и речи.


 
sniknik ©   (2011-10-01 22:58) [13]

> перебирать диапазоны?
1 < AA < AAA < EE
и т.д.

> Всё равно падает с ошибкой ввода-вывода.
бл... ну что ты делаешь?
> Делаю delete form MyTable where ID not in (select ID from tmp_MyTable)
> Т.е. удаляю все записи, кроме тех, что выбрались без ошибки.
т.е. условие на перебор и сравнение со ВСЕМИ записям, т.е. чтение тех от которых падает (чтобы сравнить)...

delete form MyTable where ID = "AAABBBCCCDD"


 
Фокс Йожин   (2011-10-01 23:15) [14]


> sniknik ©   (01.10.11 22:58) [13]

Простой тест:
1. делаю
select
*  from MyTable where ID = 0xAEB0000E0C3BD80911DC4BE92724F491

Выбирает 1 строчку

2. делаю
select
*  from MyTable where ID >= 0xAEB0000E0C3BD80911DC4BE92724F491
and ID <= 0xAEB0000E0C3BD80911DC4BE92724F491
падает с ошибкой ввода-вывода.

3. делаю
select
*  from  MyTable  where _IDRRef >= "1" and  _IDRRef <=  "2"

падает с ошибкой ввода-вывода.

Т.е., падает вообще всегда, когда задаётся диапазон.

Как же тогда перебирать половинным делением???


 
Фокс Йожин   (2011-10-01 23:18) [15]

select
*  from ID where ID between "1" and "1"

Тоже падает с ошибкой ввода-вывода


 
Фокс Йожин   (2011-10-01 23:19) [16]


> Фокс Йожин   (01.10.11 23:18) [15]
>
> select
> *  from ID where ID between "1" and "1"
>
> Тоже падает с ошибкой ввода-вывода

Пардон:
select
*  from MyTable where ID between "1" and "1"

Тоже падает с ошибкой ввода-вывода


 
sniknik ©   (2011-10-01 23:34) [17]

> Т.е., падает вообще всегда, когда задаётся диапазон.
с 1 операцией больше, или меньше не падает? этого достаточно чтобы выбрать.

> Как же тогда перебирать половинным делением???
тебе предлагали вариант, а не панацею... что делать и зачем делать (искать глючные и удалить), не ищи как не работает ищи как РАБОТАЕТ. у каждого глюка может быть по своему.

p.s. а вообще сдай базу в контору какую нибудь по восстановлению, а то чую делов натворишь, еще хуже станет.


 
Фокс Йожин   (2011-10-01 23:45) [18]


> sniknik ©   (01.10.11 23:34) [17]


> с 1 операцией больше, или меньше не падает? этого достаточно
> чтобы выбрать.

падает


> p.s. а вообще сдай базу в контору какую нибудь по восстановлению,
>  а то чую делов натворишь, еще хуже станет.

Они там, как правило, месяц держат. Да и не факт, что данные будут восстановлены.
Я, вот, хочу те данные,которые выбираются, сохранить в копию, а глючную таблицу дропнуть. Если после всего этого оборотно-сальдовая ведомость сойдётся, то можно сказать, баг пофиксен.


 
sniknik ©   (2011-10-01 23:50) [19]

> Дополнительные сведения см. в журнале ошибок SQL Server и журнале системных событий.
?


 
Фокс Йожин   (2011-10-01 23:59) [20]


> sniknik ©   (01.10.11 23:50) [19]

пусто


 
картман ©   (2011-10-02 03:03) [21]

попробуй курсором - а вдруг? или че-нть вроде:

declare @key varchar(скока-то там)

select top 1 @key = id from mytable order by id

while true
begin
 select top 1
   into new_table
  from mytable
 where id > @key
  order by id

 select top 1 @key = id from mytable where id>@id order by id

end;


 
Anatoly Podgoretsky ©   (2011-10-02 10:41) [22]

> Фокс Йожин  (01.10.2011 18:31:07)  [7]

reindex сделал?


 
Фокс Йожин   (2011-10-02 13:20) [23]


> картман ©   (02.10.11 03:03) [21]

пересоздал таблицу из копии, из тех строк, которые выбирались без падения.


> Anatoly Podgoretsky ©   (02.10.11 10:41) [22]


> reindex сделал?

Сделал. И реструктуризацию тоже. Теперь вот логическую проверку средствами 1С запустил. Жду результата.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2012.01.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.004 c
2-1317796120
Laguna
2011-10-05 10:28
2012.01.15
Обработка ошибок в открывающейся форме


15-1317041117
LDV
2011-09-26 16:45
2012.01.15
сформулировать текст сообщения


15-1317303611
БарЛог
2011-09-29 17:40
2012.01.15
Контроллеры домена для разных сайтов


15-1314770110
Омлет
2011-08-31 09:55
2012.01.15
RSS для DelphiMaster


2-1317792498
petvv
2011-10-05 09:28
2012.01.15
Array of Char to String (ANSIString)=:





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский