Форум: "Прочее";
Текущий архив: 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
выбирает нормально, меняю количество на 9231 - ошибка.
* from MyTable
order by ID
беру ключ последней записи выборки, делаю: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