Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.15;
Скачать: CL | DM;

Вниз

Лечение 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.009 c
15-1316688403
boriskb
2011-09-22 14:46
2012.01.15
Деньжат конечно маловато, но и работа не трудная


15-1317426033
Кто б сомневался
2011-10-01 03:40
2012.01.15
Замедленный скролл при включенном видео в Win 7


15-1316494673
xayam
2011-09-20 08:57
2012.01.15
АНТИВИРУСЫ НА ВОЙНЕ


15-1316457374
Leon-Z
2011-09-19 22:36
2012.01.15
Каким будет ПО через 10 лет ?


1-1279271153
gosha52
2010-07-16 13:05
2012.01.15
TButton, Windows Vista/7, интересное поведение