16.12.15 — 06:18
Здравствуйте!
База УПП 1.3.70.1, релиз платформы 8.3.6.2421. База РИБ (Центральная), в Периферийной все работает нормально.
База на SQL 2012, Сервер 1С 64-х разрядный.
так вот вылетает ошибка при проведении Требовании-накладной или Возврат переданных товаров и вылетает программа:
Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server. Внимание! Произошла неустранимая ошибка 824. Запомните ошибку и время, когда она произошла, и обратитесь к системному администратору.
HRESULT=80004005, SQLSrvr=HY000, state = 1, severity=18, native=21, line=1
Такую ошибку нигде не нашла, что означает, перечитала много форумов прежде, чем здесь написать.
Опишу подробно:
1) Рестарт сервера 1С и SQL ничего не дает, или дает временно.
2) далее по поводу cf-к и т.д. в том, что памяти не хватает — это тоже не по теме, т.к. сервер 64-х разрядный.
3) далее сделала следующие манипуляции, которые мне посоветовали:
— сделала бэкап с клиент-серверной рабочей базы;
— загрузила бэкап в другую клиент-серверную базу-копию;
— из этой копии выгрузила dt-ник;
— далее загрузила этот dt-ник в файловую базу;
— протестировала 1CD (нет ошибок), сделала тестирование из конфигуратора — Тестирование и исправление (проверка логической и ссылочной целостности)
— затем из файловой базы выгрузила dt-ник и загрузила его в рабочую клиент-серверную базу.
Делала до этого тоже самое помогло, но не надолго, только отличие было в том, что dt-ку выгружала и загружала снова в копию клиент-серверного варианта.
Сейчас сделала через файловую, как описала выше, жду результата, что будет.
А тем временем попробовала на копии клиент-серверного варианта запустить проверку в SQL с помощью следующего запроса:
ALTER DATABASE UPP
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB (‘UPP’, REPAIR_REBUILD) WITH NO_INFOMSGS
GO
Проверка выдала следующее:
ообщение 8928, уровень 16, состояние 1, строка 1
Идентификатор объекта 279945065, идентификатор индекса 3, идентификатор секции 72058135223271424, идентификатор единицы распределения 72058134132817920 (тип In-row data). Не удалось обработать страницу (1:2541984). Подробные сведения см. в других сообщениях об ошибках.
Уровень исправлений для данной инструкции DBCC вызвал обход данного исправления.
Сообщение 8939, уровень 16, состояние 98, строка 1
Ошибка в таблице. Идентификатор объекта 279945065, идентификатор индекса 3, идентификатор секции 72058135223271424, идентификатор единицы распределения 72058134132817920 (тип In-row data) страница (1:2541984). Проверка (IS_OFF (BUF_IOERR, pBUF->bstat)) не пройдена. Значения равны 2057 и -4.
Для исправления данной ошибки необходимо сначала исправить другие ошибки.
Сообщение 8976, уровень 16, состояние 1, строка 1
Ошибка в таблице. Идентификатор объекта 279945065, идентификатор индекса 3, идентификатор секции 72058135223271424, идентификатор единицы распределения 72058134132817920 (тип In-row data). Страница (1:2541984) не обнаружена при просмотре, хотя на нее ссылаются родительская страница (1:2539467) и предыдущая страница (1:2541983). Проверьте наличие предыдущих ошибок.
Для исправления данной ошибки необходимо сначала исправить другие ошибки.
Сообщение 8978, уровень 16, состояние 1, строка 1
Ошибка в таблице. Идентификатор объекта 279945065, идентификатор индекса 3, идентификатор секции 72058135223271424, идентификатор единицы распределения 72058134132817920 (тип In-row data). На страницу (1:2702132) отсутствует ссылка с предыдущей страницы (1:2541984). Возможна ошибка связывания цепочек.
Для исправления данной ошибки необходимо сначала исправить другие ошибки.
CHECKDB обнаружил 0 ошибок размещения и 4 ошибок согласованности в таблице «_AccumRg23823» (идентификатор объекта 279945065).
CHECKDB обнаружил 0 ошибок размещения и 4 ошибок согласованности в базе данных «UPP».
repair_allow_data_loss — это минимальный уровень исправления для ошибок, найденных DBCC CHECKDB (UPP, repair_rebuild).
таблица «_AccumRg23823» — это регистр накопления «НДС по партиям запасов»
И как и что исправить не знаю? Подскажите, пожалуйста!
1 — 16.12.15 — 06:22
Причина найдена, а вот как исправить это средствами SQL — не знаю. Впервые сталкиваюсь с прямыми запросами SQL. Подскажите, пожалуйста, что нужно сделать с индексами таблицы регистра накопления «НДС по партиям запасов» — «_AccumRg23823»
2 — 16.12.15 — 06:28
(1) Сделайте бекап. Удалите все индексы данного регистра. Пересохраните конфигурацию. Сделайте реиндексацию.
3 — 16.12.15 — 06:30
«repair_allow_data_loss — это минимальный уровень исправления для ошибок, найденных DBCC CHECKDB (UPP, repair_rebuild)»
Запуститу на копии DBCC CHECKDB (‘UPP’, REPAIR_ALLOW_DATA_LOSS) для начала…
4 — 16.12.15 — 06:35
(2) данные не потеряются, если удалить индексы?
Открыла ветку с индексами — там их 6 уникальных некластеризованных и 1 кластеризованный. Их просто удалить???
5 — 16.12.15 — 06:39
(3) да, хотела попробовать так сделать на копии. а данные не потеряются, если запустить такую проверку?
6 — 16.12.15 — 06:48
(4) Потеряются только если кластерезованный индекс удалите напрямую :))
7 — 16.12.15 — 06:50
(6) так а как удалить правильно в SQL? Если можно, то пошагово, пожалуйста
8 — 16.12.15 — 06:51
(7) http://catalog.mista.ru/public/192648/
Только кластеризованный не трогайте
9 — 16.12.15 — 07:04
(8) я читала такую ссылку. в конце ссылки приводится две картинки.
Нахожу таблицу «_AccumRg23823», раскрываю ее, нахожу «Индексы» — далее нажимаю «Создать скрипт для индекса» — Используя CREATE — Новое окно редактора запроса
При этом открывается окно запроса с текстом запроса:
USE [UPP]
GO
/****** Object: Index [_Accum23823_ByDims23843_RTRN] Script Date: 16.12.2015 10:05:44 ******/
CREATE UNIQUE NONCLUSTERED INDEX [_Accum23823_ByDims23843_RTRN] ON [dbo].[_AccumRg23823]
(
[_Fld23825RRef] ASC,
[_Period] ASC,
[_RecorderTRef] ASC,
[_RecorderRRef] ASC,
[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Дальше что я должна сделать?
10 — 16.12.15 — 07:08
(9) Дальше удаляйте, а потом пересоздавайте по скрипту.
А можно было просто пересохранить конфу. Она сама индексы пересоздаст
11 — 16.12.15 — 07:13
(10) нужно запускать запрос в (9) «Выполнить» или нет?
(10) что значит пересохранить конфу? можно подробнее?
12 — 16.12.15 — 07:23
Че паритесь ? Просто truncate table _AccumRg23823 и дальше пересчет итогов этого регистра
13 — 16.12.15 — 07:25
А блин, це же табличка с движениями.. Ну, тогда не выйдет с очисткой е1ё.
14 — 16.12.15 — 07:35
Сделала, как по ссылке Создала скрипты для индексов, просто вышло много окон с текстами запросов для 6 некластеризованных индексов и все. затем удалила эти 6 индексов. А как теперь их создать?
Затем пишут:
«Затем выполним поочередно скрипты по созданию индексов в открытых окнах, попутно закрывая их (чтобы ничего не забыть).»
Что это значит? Как сделать?
15 — 16.12.15 — 07:52
(14) Выполнить запрос написанный в скрипте
16 — 16.12.15 — 08:02
(15) Т.е. по описанию в ссылке я должна сначала создать скрипты по 6 индексам, сохранить себе их данные, затем индексы удалить и создать их снова, скопировав запросы созданных скриптов, и нажать по каждому индексу выполнить. А при создании нового индекса выбирать те поля, которые указаны в скрипте? Так?
17 — 16.12.15 — 08:36
Сделала, запускаю повторно запрос проверки, выдает следующее:
Неуточненные транзакции проходят откат. Предварительно выполнение отката: 0%.
Неуточненные транзакции проходят откат. Предварительно выполнение отката: 100%.
Это хорошо или нет?
18 — 16.12.15 — 08:47
(17) Проверьте что коннект стоит к нужной базе.
19 — 16.12.15 — 09:02
(18) как это сделать?
все делала на копии. при загрузке базы провела документ, на котором вылетала база — провелся!
20 — 16.12.15 — 09:20
(19) Там в отдельном поле видно название БД с которой вы работаете
21 — 16.12.15 — 09:32
(20) Спасибо большое за помощь!
А еще вопрос: какая может быть причина, что полетели индексы регистра накопления? Что могло послужить причиной?
22 — 16.12.15 — 10:47
А можно было по сути запустить реиндексацию таблиц информационной базы (по сути это и есть манипуляции с dt-ником)?
И можно еще спросить здесь же: эта проблема возникла в Центральной базе, а в Периферийной базе вообще можно запускать реиндексацию таблиц информационной базы? И вообще какое еще тестирование можно проводить в Периферийной базе?
23 — 16.12.15 — 11:24
(22) Канешна можно. Индексы строго говоря не зависят от базы. Кроме кластерного индекса, тн Прайм Кей. Кластерный индекс это сортировка самой таблицы, столбец который сортируется и есть кластерный индекс.
Но в каждой БД, даже если 2 БД одинаковые с точки зрения 1С, сортировка внутри таблиц может быть разной.
24 — 16.12.15 — 11:31
(23) а в Периферийной какое тестирование можно запускать в режиме Конфигуратора?
25 — 16.12.15 — 11:42
(24) Зачем периферийную трогать?
Kleo
26 — 16.12.15 — 13:06
(25) Я имею ввиду на будущее потом, вообще ее нужно тестировать? И если да, то какие проверки можно задавать?
Kleo
16.12.15 — 06:18
Здравствуйте!
База УПП 1.3.70.1, релиз платформы 8.3.6.2421. База РИБ (Центральная), в Периферийной все работает нормально.
База на SQL 2012, Сервер 1С 64-х разрядный.
так вот вылетает ошибка при проведении Требовании-накладной или Возврат переданных товаров и вылетает программа:
Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server. Внимание! Произошла неустранимая ошибка 824. Запомните ошибку и время, когда она произошла, и обратитесь к системному администратору.
HRESULT=80004005, SQLSrvr=HY000, state = 1, severity=18, native=21, line=1
Такую ошибку нигде не нашла, что означает, перечитала много форумов прежде, чем здесь написать.
Опишу подробно:
1) Рестарт сервера 1С и SQL ничего не дает, или дает временно.
2) далее по поводу cf-к и т.д. в том, что памяти не хватает — это тоже не по теме, т.к. сервер 64-х разрядный.
3) далее сделала следующие манипуляции, которые мне посоветовали:
— сделала бэкап с клиент-серверной рабочей базы;
— загрузила бэкап в другую клиент-серверную базу-копию;
— из этой копии выгрузила dt-ник;
— далее загрузила этот dt-ник в файловую базу;
— протестировала 1CD (нет ошибок), сделала тестирование из конфигуратора — Тестирование и исправление (проверка логической и ссылочной целостности)
— затем из файловой базы выгрузила dt-ник и загрузила его в рабочую клиент-серверную базу.
Делала до этого тоже самое помогло, но не надолго, только отличие было в том, что dt-ку выгружала и загружала снова в копию клиент-серверного варианта.
Сейчас сделала через файловую, как описала выше, жду результата, что будет.
А тем временем попробовала на копии клиент-серверного варианта запустить проверку в SQL с помощью следующего запроса:
ALTER DATABASE UPP
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB (‘UPP’, REPAIR_REBUILD) WITH NO_INFOMSGS
GO
Проверка выдала следующее:
ообщение 8928, уровень 16, состояние 1, строка 1
Идентификатор объекта 279945065, идентификатор индекса 3, идентификатор секции 72058135223271424, идентификатор единицы распределения 72058134132817920 (тип In-row data). Не удалось обработать страницу (1:2541984). Подробные сведения см. в других сообщениях об ошибках.
Уровень исправлений для данной инструкции DBCC вызвал обход данного исправления.
Сообщение 8939, уровень 16, состояние 98, строка 1
Ошибка в таблице. Идентификатор объекта 279945065, идентификатор индекса 3, идентификатор секции 72058135223271424, идентификатор единицы распределения 72058134132817920 (тип In-row data) страница (1:2541984). Проверка (IS_OFF (BUF_IOERR, pBUF->bstat)) не пройдена. Значения равны 2057 и -4.
Для исправления данной ошибки необходимо сначала исправить другие ошибки.
Сообщение 8976, уровень 16, состояние 1, строка 1
Ошибка в таблице. Идентификатор объекта 279945065, идентификатор индекса 3, идентификатор секции 72058135223271424, идентификатор единицы распределения 72058134132817920 (тип In-row data). Страница (1:2541984) не обнаружена при просмотре, хотя на нее ссылаются родительская страница (1:2539467) и предыдущая страница (1:2541983). Проверьте наличие предыдущих ошибок.
Для исправления данной ошибки необходимо сначала исправить другие ошибки.
Сообщение 8978, уровень 16, состояние 1, строка 1
Ошибка в таблице. Идентификатор объекта 279945065, идентификатор индекса 3, идентификатор секции 72058135223271424, идентификатор единицы распределения 72058134132817920 (тип In-row data). На страницу (1:2702132) отсутствует ссылка с предыдущей страницы (1:2541984). Возможна ошибка связывания цепочек.
Для исправления данной ошибки необходимо сначала исправить другие ошибки.
CHECKDB обнаружил 0 ошибок размещения и 4 ошибок согласованности в таблице «_AccumRg23823» (идентификатор объекта 279945065).
CHECKDB обнаружил 0 ошибок размещения и 4 ошибок согласованности в базе данных «UPP».
repair_allow_data_loss — это минимальный уровень исправления для ошибок, найденных DBCC CHECKDB (UPP, repair_rebuild).
таблица «_AccumRg23823» — это регистр накопления «НДС по партиям запасов»
И как и что исправить не знаю? Подскажите, пожалуйста!
Kleo
1 — 16.12.15 — 06:22
Причина найдена, а вот как исправить это средствами SQL — не знаю. Впервые сталкиваюсь с прямыми запросами SQL. Подскажите, пожалуйста, что нужно сделать с индексами таблицы регистра накопления «НДС по партиям запасов» — «_AccumRg23823»
los_hooliganos
2 — 16.12.15 — 06:28
(1) Сделайте бекап. Удалите все индексы данного регистра. Пересохраните конфигурацию. Сделайте реиндексацию.
zva
3 — 16.12.15 — 06:30
«repair_allow_data_loss — это минимальный уровень исправления для ошибок, найденных DBCC CHECKDB (UPP, repair_rebuild)»
Запуститу на копии DBCC CHECKDB (‘UPP’, REPAIR_ALLOW_DATA_LOSS) для начала…
Kleo
4 — 16.12.15 — 06:35
(2) данные не потеряются, если удалить индексы?
Открыла ветку с индексами — там их 6 уникальных некластеризованных и 1 кластеризованный. Их просто удалить???
Kleo
5 — 16.12.15 — 06:39
(3) да, хотела попробовать так сделать на копии. а данные не потеряются, если запустить такую проверку?
los_hooliganos
6 — 16.12.15 — 06:48
(4) Потеряются только если кластерезованный индекс удалите напрямую :))
Kleo
7 — 16.12.15 — 06:50
(6) так а как удалить правильно в SQL? Если можно, то пошагово, пожалуйста
zva
8 — 16.12.15 — 06:51
(7) http://catalog.mista.ru/public/192648/
Только кластеризованный не трогайте
Kleo
9 — 16.12.15 — 07:04
(8) я читала такую ссылку. в конце ссылки приводится две картинки.
Нахожу таблицу «_AccumRg23823», раскрываю ее, нахожу «Индексы» — далее нажимаю «Создать скрипт для индекса» — Используя CREATE — Новое окно редактора запроса
При этом открывается окно запроса с текстом запроса:
/****** Object: Index [_Accum23823_ByDims23843_RTRN] Script Date: 16.12.2015 10:05:44 ******/
CREATE UNIQUE NONCLUSTERED INDEX [_Accum23823_ByDims23843_RTRN] ON [dbo].[_AccumRg23823]
(
[_Fld23825RRef] ASC,
[_Period] ASC,
[_RecorderTRef] ASC,
[_RecorderRRef] ASC,
[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Дальше что я должна сделать?
los_hooliganos
10 — 16.12.15 — 07:08
(9) Дальше удаляйте, а потом пересоздавайте по скрипту.
А можно было просто пересохранить конфу. Она сама индексы пересоздаст
Kleo
11 — 16.12.15 — 07:13
(10) нужно запускать запрос в (9) «Выполнить» или нет?
(10) что значит пересохранить конфу? можно подробнее?
Ёпрст
12 — 16.12.15 — 07:23
Че паритесь ? Просто truncate table _AccumRg23823 и дальше пересчет итогов этого регистра
Ёпрст
13 — 16.12.15 — 07:25
А блин, це же табличка с движениями.. Ну, тогда не выйдет с очисткой е1ё.
Kleo
14 — 16.12.15 — 07:35
Сделала, как по ссылке Создала скрипты для индексов, просто вышло много окон с текстами запросов для 6 некластеризованных индексов и все. затем удалила эти 6 индексов. А как теперь их создать?
Затем пишут:
«Затем выполним поочередно скрипты по созданию индексов в открытых окнах, попутно закрывая их (чтобы ничего не забыть).»
Что это значит? Как сделать?
los_hooliganos
15 — 16.12.15 — 07:52
(14) Выполнить запрос написанный в скрипте
Kleo
16 — 16.12.15 — 08:02
(15) Т.е. по описанию в ссылке я должна сначала создать скрипты по 6 индексам, сохранить себе их данные, затем индексы удалить и создать их снова, скопировав запросы созданных скриптов, и нажать по каждому индексу выполнить. А при создании нового индекса выбирать те поля, которые указаны в скрипте? Так?
Kleo
17 — 16.12.15 — 08:36
Сделала, запускаю повторно запрос проверки, выдает следующее:
Неуточненные транзакции проходят откат. Предварительно выполнение отката: 0%.
Неуточненные транзакции проходят откат. Предварительно выполнение отката: 100%.
Это хорошо или нет?
los_hooliganos
18 — 16.12.15 — 08:47
(17) Проверьте что коннект стоит к нужной базе.
Kleo
19 — 16.12.15 — 09:02
(18) как это сделать?
все делала на копии. при загрузке базы провела документ, на котором вылетала база — провелся!
los_hooliganos
20 — 16.12.15 — 09:20
(19) Там в отдельном поле видно название БД с которой вы работаете
Kleo
21 — 16.12.15 — 09:32
(20) Спасибо большое за помощь!
А еще вопрос: какая может быть причина, что полетели индексы регистра накопления? Что могло послужить причиной?
Kleo
22 — 16.12.15 — 10:47
А можно было по сути запустить реиндексацию таблиц информационной базы (по сути это и есть манипуляции с dt-ником)?
И можно еще спросить здесь же: эта проблема возникла в Центральной базе, а в Периферийной базе вообще можно запускать реиндексацию таблиц информационной базы? И вообще какое еще тестирование можно проводить в Периферийной базе?
los_hooliganos
23 — 16.12.15 — 11:24
(22) Канешна можно. Индексы строго говоря не зависят от базы. Кроме кластерного индекса, тн Прайм Кей. Кластерный индекс это сортировка самой таблицы, столбец который сортируется и есть кластерный индекс.
Но в каждой БД, даже если 2 БД одинаковые с точки зрения 1С, сортировка внутри таблиц может быть разной.
Kleo
24 — 16.12.15 — 11:31
(23) а в Периферийной какое тестирование можно запускать в режиме Конфигуратора?
Necessitudo
25 — 16.12.15 — 11:42
(24) Зачем периферийную трогать?
Kleo
26 — 16.12.15 — 13:06
(25) Я имею ввиду на будущее потом, вообще ее нужно тестировать? И если да, то какие проверки можно задавать?
58 / 63 / 11 Регистрация: 13.11.2014 Сообщений: 939 |
|
1 |
|
09.03.2017, 14:26. Показов 3390. Ответов 7
День добрый. 1С 8.2, клиент-сервер. При перепроведении документов вылетает ошибка Произошла неустранимая ошибка 824 Запомните ошибку и время когда она произошла, и обратитесь к сис. админу Выгружаю dt, загружаю в файловом варианте, перепровожу документы, ошибки нет. Вопрос — если теперь этот dt загрузить в клиент-сервер, то какая вероятность что проблема уйдёт? Хочу протестировать сначала на бекапах, и вопрос к форумчанам: кто-то сталкивался с подобной ошибкой? И как вы её решили?
__________________ 0 |
GreenkA |
09.03.2017, 14:30 |
Не по теме: Briolin, вы вместе с maverick работаете что ли?) 0 |
Briolin |
09.03.2017, 14:31 [ТС] |
Не по теме: GreenkA, нет, я не знаю кто это) 0 |
3051 / 1998 / 524 Регистрация: 25.06.2009 Сообщений: 6,964 |
|
09.03.2017, 14:34 |
4 |
0 |
58 / 63 / 11 Регистрация: 13.11.2014 Сообщений: 939 |
|
09.03.2017, 14:49 [ТС] |
5 |
GreenkA, хм, но у него при входе в базу такая ошибка, а нашем случае при проведении документов 0 |
Модератор 3697 / 2897 / 569 Регистрация: 10.03.2011 Сообщений: 11,401 Записей в блоге: 1 |
|
09.03.2017, 18:22 |
6 |
Briolin, возможно обычная нехватка памяти…. Добавлено через 13 секунд Добавлено через 38 секунд 0 |
58 / 63 / 11 Регистрация: 13.11.2014 Сообщений: 939 |
|
10.03.2017, 13:28 [ТС] |
7 |
Dethmontt, выполнил запрос DBCC CHECKDB (‘SQL’); И там много информации примерно такой: и в конце CHECKDB обнаружил 0 ошибок размещения и 8 ошибок согласованности в базе данных «SQL». Не ужели нужно выполнять repair_allow_data_loss ??????? 0 |
Модератор 3697 / 2897 / 569 Регистрация: 10.03.2011 Сообщений: 11,401 Записей в блоге: 1 |
|
10.03.2017, 18:20 |
8 |
Briolin, только на копии… Добавлено через 2 минуты Добавлено через 27 секунд 0 |
Серер intel S5520UR + Intel (R) RAID Controller RS2BL080 + MS Win Server 2008 R2 Enterprise + Microsoft SQL Server 2008 R2
восемь дисков объеденены в 2 массива RAID-10 (на первом система и ПО, на втором базы)
MS SQL крутит базы для 1С
Вечером возникла ошибка 824, 1С сообщила, что нет доступа к базе, в итоге база «накрылась» и восстановить полностью не удалось (восстановили из backup за прошлый день).
У программистов 1С возникли подозрения, что ошибка связана с дисками, что это ошибка диска, но проверка на бэд-блоки показала, что все в порядке, в системном журнале нет ни намека на ошику в ОС, драйвере, железе, только ошибки SQL. Администратора баз у нас
как такогого нет, я же только железом занимаюсь, и сетью, в SQL не лезу и сильно не разбираюсь.
Хотелось бы понять , как то докапаться до сути ошибки, что бы этого не допустить в будущем. Если ошибка в железе, то нужно с этим чтото сделать, если ошибка возникла в результате сбоя MS SQL или 1С, то это тоже нужно как-то решать.
Сама ошибка такая:
SQL Server обнаружил логическую ошибку ввода-вывода, связанную с согласованностью: неверный идентификатор страницы (ожидаемый 1:4545818; фактический 0:511882718). Она произошла при прочитать страницы (1:4545818) в базе данных с идентификатором 13 по смещению
0x000008aba34000 файла «D:Базы 8.2pt_upp_newpt_upp_new.mdf». Дополнительные сведения см. в журнале ошибок SQL Server и журнале системных событий. Это серьезная ошибка, которая угрожает целостности базы данных и должна быть немедленно исправлена. Выполните
полную проверку базы данных на согласованность (DBCC CHECKDB). Эта ошибка может быть вызвана многими причинами; дополнительные сведения см. в электронной документации по SQL Server.
- Изменено
19 октября 2012 г. 4:18
- Перемещено
Abolmasov Dmitry
19 октября 2012 г. 9:39
(От:Работа с данными)
- Remove From My Forums
-
Question
-
My data is reported this error, I have to fix the error because you only need help.
Error on My Computer
SQL Server detected a logical consistency-based I/O error: torn page (expected signature: 0xaaaaaaaa; actual signature: 0x5555aaaa). It occurred during a read of page (1:210768) in database ID 7 at offset 0x00000066ea0000 in file ‘G:DatabaseMyData.mdf’.
Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This
error can be caused by many factors; for more information, see SQL Server Books Online.
During redoing of a logged operation in database ‘MyData’, an error occurred at log record ID (30182:834:13). Typically, the specific failure is previously logged as an error in the Windows Event Log service. Restore the database from a full backup, or repair
the database.
Could not open new database ‘MyData’. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 824)
Answers
-
DBCC CHECKDB(yourproblematicdb)
Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se
- Marked as answer by
Wednesday, July 10, 2019 4:03 AM
- Marked as answer by
- Remove From My Forums
-
Question
-
My data is reported this error, I have to fix the error because you only need help.
Error on My Computer
SQL Server detected a logical consistency-based I/O error: torn page (expected signature: 0xaaaaaaaa; actual signature: 0x5555aaaa). It occurred during a read of page (1:210768) in database ID 7 at offset 0x00000066ea0000 in file ‘G:DatabaseMyData.mdf’.
Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This
error can be caused by many factors; for more information, see SQL Server Books Online.
During redoing of a logged operation in database ‘MyData’, an error occurred at log record ID (30182:834:13). Typically, the specific failure is previously logged as an error in the Windows Event Log service. Restore the database from a full backup, or repair
the database.
Could not open new database ‘MyData’. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 824)
Answers
-
DBCC CHECKDB(yourproblematicdb)
Erland Sommarskog, SQL Server MVP, esquel@sommarskog.se
- Marked as answer by
Wednesday, July 10, 2019 4:03 AM
- Marked as answer by
- Remove From My Forums
-
Question
-
User-1018757212 posted
hi to all
In my project In development machine it works but after publish it gives error
like
error as — Fatal error 824 occurred at Aug 22 2008
1:13AMif any idea give me please
ponkathik
Answers
-
User-1203469223 posted
The 824 error indicates that a logical consistency error was detected during a read. A logical consistency error is a clear indication of actual damage and frequently indicates data corruption caused by a faulty I/O subsystem component.
So this means that the database on your Server machine, the one to where you published your code is damaged…
- Marked as answer by
Thursday, October 7, 2021 12:00 AM
- Marked as answer by
-
User-1018757212 posted
hi tompy_nation
thank you for reply
pls give any idea to recover these datas..
ppk
- Marked as answer by
Anonymous
Thursday, October 7, 2021 12:00 AM
- Marked as answer by
- Remove From My Forums
-
Question
-
User-1018757212 posted
hi to all
In my project In development machine it works but after publish it gives error
like
error as — Fatal error 824 occurred at Aug 22 2008
1:13AMif any idea give me please
ponkathik
Answers
-
User-1203469223 posted
The 824 error indicates that a logical consistency error was detected during a read. A logical consistency error is a clear indication of actual damage and frequently indicates data corruption caused by a faulty I/O subsystem component.
So this means that the database on your Server machine, the one to where you published your code is damaged…
- Marked as answer by
Thursday, October 7, 2021 12:00 AM
- Marked as answer by
-
User-1018757212 posted
hi tompy_nation
thank you for reply
pls give any idea to recover these datas..
ppk
- Marked as answer by
Anonymous
Thursday, October 7, 2021 12:00 AM
- Marked as answer by
Загрузка…
Это выдержка из восьмой главы книги Rodney Landrum: «SQL Server Tacklebox», в которой описывается, как DBA может устранить последствия повреждения данных. Будут продемонстрированы инструменты и сценарии, необходимые для своевременного поиска и устранения повреждений данных и предотвращения их попадания в резервные копии.
Чудовище Data Corruption может быть тихим и незаметным убийцей пользовательских данных. Оно может нанести удар сразу или ждать неделями, прежде чем проявится сущим кошмаром. Нет, я не говорю о разработчиках, речь пойдёт о повреждении базы данных.
Если Вы достаточно долго работаете администратором баз данных, то уже наверняка сталкивались с этим монстром по крайней мере в одной из его многочисленных форм. Часто такие повреждения происходят после сбоя электропитания, когда сервер вместо того, чтобы корректно завершить работу, просто умирает в процессе изменения данных. В результате этой, или какой‑либо другой неисправности оборудования, данные или индексы получают повреждения прямо на диске и SQL Server больше не может их использовать, пока целостность не будет восстановлена.
К счастью, есть несколько шагов, которые вы можете предпринять для защиты данных и, что не менее важно, своего места работы, в случае, если такое повреждение произойдёт. Само собой разумеется что прежде всего нужно позаботиться о хорошей стратегии резервного копирования, отсутствие которой равносильно игре в русскую рулетку в одиночку. Однако, тут будет продемонстрировано несколько других методов, основанных на разных командах DBCC. Кроме того, мы рассмотрим сценарий, который обеспечит обнаружение повреждений и сообщит о них по мере выявления, прежде чем они распространятся по вашей инфраструктуре. На основе этого можно рассчитывать что администратор базы данных сможет также ограничить ущерб, который причиняет ещё более свирепый «The Monster at the End of This Book».
PS: Если вам не повезло, и вы никогда не видели «The Monster at the End of This Book» (Jon Stone, иллюстратор Michael Smollin. «Golden Books») с очаровательным монстром Гровером с улицы Сезам в главной роли, то, во‑первых, я вам сочувствую, а во‑вторых, приношу свои извинения, потому что предыдущие ссылки мало что для вас значат. Я могу только порекомендовать вам немедленно ознакомиться с ним вместе с «The Zombie Survival Guide» (автор Max Brooks, Three Rivers Press) и добавить оба в обязательный список изучения для всех новых администраторов баз данных.
Причины Data Corruption
Есть много причин, из‑за которых база данных может повредиться. Чаще всего это происходит после сбоя оборудования. Обычно сбой происходит в дисковой подсистеме, которая отвечает за запись данных на диск. SQL Server ожидает что записываемые на диск данные останутся неизменными после передачи их интерфейсам операционной системы, а затем драйверу контроллера диска и непосредственно самому диску. Например, такого рода повреждение данных может быть вызвано отключением питания в середине транзакции.
Однако не только сбои дисковой подсистемы приводят к повреждению данных. Если вы обновите базу данных с SQL Server 2000 до SQL Server 2005 или выше, а затем проверите её с помощью скрипта, находящего повреждения, представленного в конце этой статьи, вы с удивлением обнаружите сообщения, которые можно истолковать как ошибки в файле базы данных. Однако, к счастью, это просто предупреждения об использовании пространства в фале, которое образовалось из‑за разницы версий базы, и решение проблемы будет в выполнении команды DBCC
UPDATEUSAGE
.
Какой бы ни была причина Data Corruption, администратор базы данных не должен долгое время находиться в неведении о целостности данных в базе. К сожалению, Чудовище Data Corruption часто умеет спрятаться и не высовывает свою страшную голову, пока сервер не обратится к поврежденными данными. К этому времени повреждение может попасть в файлы резервных копий, и, когда вы прибегнете к последнему из средств — восстановлению базы данных, восстановиться может уже имеющая повреждения база. Важность использования надежной стратегии регулярного резервного копирования невозможно переоценить. Кроме того, нужен скрипт или инструмент, который будет регулярно проверять базу данных и сообщать о любых проблемах и повреждениях, пока не стало слишком поздно. Именно такой сценарий будет представлен в этой статье.
Последствия Data Corruption
Как уже говорилось в этой статье, в большинстве случаев повреждения данных связаны с отказом оборудования. Это может быть контроллер жесткого диска или блок питания. Для выявления проблем, которые могут возникнуть из‑за подобных отказов, SQL Server использует функцию вычисления контрольной суммы страницы. Значение контрольной суммы вычисляется во время записи страниц на диск и проверяется при последующем чтении с диска. По существу, если значение контрольной суммы прочитанной страницы не соответствует тому, которое было рассчитано при записи, то SQL Server считает, что данные были изменены вне процесса ядра сервера баз данных. До SQL Server 2005, в качестве опции, можно было включить для базы данных обнаружение разорванных страниц (Torn Page Detection), которое выполняло аналогичные проверки.
Если SQL Server обнаружит повреждение, его реакция на проблему будет зависеть от масштаба ущерба. Если повреждение таково, что база данных недоступна для чтения, SQL Server не сможет инициализировать и загрузить эту базу. Почти во всех таких случаях потребуется полное восстановление базы данных из копии.
Если ущерб ограничен (затронуты только одна или две страницы данных), тогда SQL Server сможет открывать и читать базу данных. Это позволит использовать в качестве инструмента команду DBCC, для оценки и/или устранения ущерба. Имейте также в виду, что в рамках общей процедуры резервного копирования и восстановления у вас есть возможность выполнить восстановление на уровне страниц, если потребуется восстановить только одну или несколько страниц данных. Дополнительные сведения о восстановлении страниц из резервных копий базы данных можно найти по ссылке: Restore Pages (SQL Server)
Прежде чем двигаться дальше, стоит отметить, что несмотря на рекомендации оставлять режим проверки для всех экземпляров баз данных включенным (обнаружение разорванных страниц или контрольную сумму), это привносит накладные расходы, и возможно такую проверку отключить. Идея состоит в том, что, если вы доверяете своей дисковой подсистеме и системе электропитания, можно не включать проверку, если производительность является самой серьезной проблемой. Большинство дисковых подсистем сегодня имеют специальную батарейку, чтобы обеспечить успешное завершение операции записи.
Для SQL 2000 можно было использовать sp_dboption
, которая позволяет включить или отключить обнаружение разорванных страниц. Для более поздних версий вы можете использовать команду ALTER DATABASE
, чтобы включить torn page detection
или checksum
(невозможно включать оба режима одновременно), или можно указать none
для отключения проверок.
Защита от Data Corruption
Помимо частого резервного копирования и проверки баз данных (что позволяет откатиться до того момента, когда баз ещё не была повреждена) хорошо подготовленный администратор базы данных будет иметь в своем распоряжении некоторые инструменты, которые позволяют определить место повреждения и восстановить любые поврежденные данные.
Однако, прежде чем ринуться с подобием мачете в заводь с чудовищами, я должен сообщить вам, что я ни в коем случае не являюсь экспертом в области повреждений баз данных. Я всего лишь обычный администратор базы данных, который с надеется что никогда не столкнется с повреждениями, но хочу быть настолько подготовленным, насколько это возможно, если это произойдет.
Таким образом, я собираюсь сосредоточиться на практических аспектах использования инструментов и скриптов, которые администратор базы данных может использовать для борьбы с Data Corruption, в основном оперируя семейством команд DBCC.
Я не буду слишком глубоко погружаться в недра механизма хранения SQL Server, где можно встретить всевозможные эзотерические термины, относящиеся к тому, как SQL Server физически распределяет или отображает данные в файле (GAM/ SGAM страницы, страницы PFS, цепочки IAM и многое другое). В качестве ссылки на подобный уровень детализации я не могу сделать ничего лучше, чем указать вам на работы Пола Рэндала, в его блоке в категории Corruption: https://www.sqlskills.com/blogs/paul/category/Corruption/
Он многое сделал для разработки команд DBCC, и является признанным экспертом в области повреждений данных и, безусловно, у него больше всего «кислорода в баллоне» для необходимого погружения.
DBCC CHECKDB
DBCC
CHECKDB
— это основная команда, которую администратор базы данных должен использовать для проверки и исправления ошибок согласованности в базах данных SQL Server. DBCC существует уже много лет и представлено в большинстве версий SQL Server. Можно встретить два варианта расшифровки этой аббревиатуры: Database Consistency Checks либо Database Console Commands, последняя из них более точна, поскольку DBCC включает команды, которые выходят за рамки простой проверки согласованности базы данных.
Однако для нас сейчас интересны только согласованность и целостность баз данных. DBCC CHECKDB
на самом деле объединяет другие команды DBCC: DBCC CHECKCATALOG, DBCC CHECKALLOC
и DBCC CHECKTABLE
. Запуск DBCC CHECKDB
включает в себя выполнение и этих команды, поэтому отпадает необходимость запускать их потом отдельно.
Чтобы продемонстрировать, как использовать эти инструменты для поиска и устранения повреждений данных, мне сначала нужно будет создать базу, а затем совершить «злодеяние» по повреждению в ней данных. Если мы начнем с нуля, это облегчит поиск и последующее повреждение страниц данных и/или индексов, поэтому давайте создадим совершенно новую, «незапятнанную» базу с метким названием «NEO». Как видно на рис. 1, в этой новой базе данных не создано ни одного объекта.
Чтобы убедиться, что файлы NEO
ещё не повреждены, мы можем запустить команду DBCC CHECKDB
, результат которой показан на рисунке 2.
Как и ожидалось, сообщений об ошибках согласованности или распределения не было, но все это очень скоро изменится… Я упомянул, что в конце этой книги появится монстр, и это не милый старый Гровер из «Улицы Сезам».
Пожалуйста, не идите на следующую страницу!
DBCC PAGE
Ага, вы все еще читаете, я вижу! Что ж, прежде чем мы выпустим монстра, я хочу показать вам еще одну очень важную команду DBCC, о которой вы, возможно, не знаете, а именно DBCC PAGE
(sys.dm_db_page_info). Она «официально» не документирована, поскольку Microsoft её не поддерживает, но на самом деле я нашел кучу информации об этой команде из хорошо известных и уважаемых источников, таких как Пол Рэндал (Paul Randal), так что я больше не считаю ее недокументированной.
Синтаксис прост:
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
Однако выводимый командой результат может быть весьма пугающим для непосвященного администратора баз данных. Итак, прежде чем мы представим монстра, который портит базы данных, я хочу просмотреть с помощью DBCC PAGE
на базу данных NEO
. Команда выглядит следующим образом:
DBCC PAGE (NEO,1,1,3)
Первая цифра после имени базы «1» — это номер файла, вторая цифра «1» — это номер страницы, а последняя цифра «3» — это параметр подробности выводимой информации, принимает значения от 0 до 3. Значение «3» указывает, что мы хотим видеть не только заголовок страницы, но и детали. Не очень впечатляющий результат показаны на рисунке 3.
Причина того, что результаты оказались не очень информативными, заключается в том, что мы забыли включить важный флаг трассировки (3604
). Если вы работаете с SQL Server и не знакомы с флагами трассировки, свяжитесь со мной, и мы поговорим об этом за кружкой пива. На самом деле, я не против, и буду рад новому товарищу и возможности проявить педантичность.
Однако сейчас я просто отмечу, что для просмотра вывода команды DBCC PAGE
нам нужно запустить команду DBCC TRACEON
. Конкретно:
DBCC TRACEON (3604)
На рис. 4 показаны результаты повторного выполнения DBCC PAGE
с включенным флагом трассировки.
В нижней части листинга видно, что страницы 1:172 – 1:383 не распределены и все страницы имеют коэффициент заполнения 0%. Напомним, что эта база данных без таблиц или каких-либо других объектов, а потому и без вставленных куда-нибудь данных.
Итак, давайте теперь создадим простую таблицу и вставим в нее некоторый объём данных. Скрипт для этого показан в листинге 1. Он создает в базе данных NEO
таблицу с именем ONE
и вставляет в нее 1000 записей (на самом деле 999). Простые вещи, но важным моментом в контексте этого примера является то, что эта загрузка данных приведет к выделению дополнительных страниц в базе данных и заполнению их данными, и мы сможем полюбоваться на эти новые страницы.
USE [NEO]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ONE]')
AND type in (N'U'))
DROP TABLE [dbo].[ONE]
GO
CREATE TABLE [dbo].[ONE](
[NEOID] [int] NULL,
[NEOTEXT] [nchar](50) NULL
) ON [PRIMARY]
GO
BEGIN Tran T_Time
DECLARE @SQL_Alphabet varchar(26)
SET @SQL_Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
DECLARE @rnd_seed int
@rnd_seed = 26
DECLARE @counter int = 1
WHILE @counter < 1000
BEGIN
Insert Into ONE
Values (
@counter,
(select SUBSTRING (@SQl_alphabet,
Cast(RAND() * @rnd_seed as int) + 1,
CAST(RAND() * @rnd_seed as int) + 1)
)
)
SET @counter = @counter + 1
END
Commit Tran T_Time
Листинг 1. Создание и заполнение таблицы ONE.
На рис. 5 показан образец данных, которые были вставлены.
На рисунке 4 видно, что для пустой базы данных страницы 1:172 — 1:383 ещё не были распределены. Повторный запуск DBCC PAGE
должен был показать, что для размещения данных были выделены дополнительные страницы, и они имеют разный процент заполнения. На рис. 6 показан новый результат.
Теперь мы видим, что страницы 1:184 – 1:189 распределены и заполнены на 100 процентов. Выбрав одну из новых страниц (1:184), содержащую только что загруженные данные, можно снова запустить DBCC PAGE
для этой конкретной страницы и получить полную «корзину» информации, как показано на рис. 7.
На рисунке видно, например, что в результате возвращаются фактические значения для NEOID
и NEOTEXT
, 553 и UVWXYZ соответственно. Также там представлен шестнадцатеричный дамп, указывающий на конкретное место в файле данных, где хранится запись с NEOID
= 533: 10006c00 29020000...
Если вы не эксперт в понимании шестнадцатеричных чисел, не бойтесь; я тоже такой. Однако, используя данную информацию, можно найти эту запись и изменить ее вне процесса SQL Server, что нанесет базе серьезный ущерб. Однако для этого «вредительства» мне понадобится мой верный шестнадцатеричный редактор, о котором я вскоре расскажу.
Повреждение страниц с данными
Мы знаем, что таблица ONE
в базе данных NEO
представляет собой кучу, поэтому любое внешнее повреждение будет непосредственно для страниц данных, а не в каком-либо из возможных некластерных индексов.
Случай с повреждением страниц индекса на самом деле не так драматичен, поскольку данные в индексе являются «дубликатами» данных с листового уровня, и поэтому восстановить ущерб относительно легко. Мы рассмотрим этот не смертельный вариант повреждений после того, как рассмотрим «вероломное вмешательство» и, надеюсь, успешное восстановление после повреждения данных в нашей являющейся кучей таблице.
Подлог шестнадцатеричного числа в данных
В мире существует множество редакторов в шестнадцатеричном формате, многие из них бесплатны или имеют бесплатный пробный период. Для этой статьи я загрузил пробную версию «Hex Editor Neo» разработанный HHD Software.
Шестнадцатеричный редактор позволяет администратору просто открывать и просматривать содержимое любого файла, в нашем случае файла данных базы. Хотя это интересное занятие, я бы рекомендовал его только для целей тестирования или обучения, так как это очень опасный инструмент в неопытных руках.
Здесь мы будем использовать шестнадцатеричный редактор для «обнуления» записи в файле данных базы, причём только на одной странице. Это приведет к повреждению, похожему на те, что возникают при аппаратных проблемах, из-за которой на диск записывается несогласованная информация, и при этом база данных не становится нечитаемой для SQL Server.
И хотя я не говорил об этом до сих пор…
Не делайте дальше ничего без предварительного резервного копирования базы данных!
Данные, которые я ухайдакаю (так говорят южане) путём обнуления, находятся на странице данных, показанной на рисунке 7, а именно на 1:184. Чтобы повредить данные на этой странице, сначала нужно остановить службу SQL Server, чтобы корневой файл данных не использовался. У меня это:
C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDataNEO.mdf
Затем я просто открываю «Hex Editor Neo» и нахожу местоположение нужной записи с помощью NEOID=553
и NEOTEXT ="UVWXYZ"
, которую мы ранее увидели с помощью DBCC PAGE
.
Большинство шестнадцатеричных редакторов, включая «Hex Editor Neo», имеют возможность поиска значений в файле. Вспомним результаты вывода команды DBCC PAGE
с информацией, которая размещена на странице 1:184, мы просто возьмём значение 10006c00 29020000
и задав его для поиска найдём запись где NEOID равно 553. Как вы можете увидеть на рисунке 8, запись в шестнадцатеричном редакторе выглядит почти идентично выводу команды DBCC PAGE
.
Далее я собираюсь внести в данные одно небольшое изменение, обнулив букву «U», подменив 55 на 00. Вот и все. На рис. 9 показан результат подмены.
Затем я сохраню файл и закрою шестнадцатеричный редактор. Вы тоже должны так сделать, иначе файл данных останется используемым, и будет невозможно инициализировать базу данных после запуска SQL Server. Теперь, наконец, настало время выпустить монстра…
Противостояние с монстром Data Corruption
На первый взгляд все выглядит нормально. База NEO
данных запущена и доступна, и в журнале событий не было сообщений об ошибках. В Management Studio я могу без проблем детализировать объекты базы данных, включая таблицу ONE
. Однако если я попытаюсь запросить таблицу с помощью SELECT * FROM ONE, произойдет нечто пугающее, как показано в листинге 2.
Msg 824, Level 24, State 2, Line 1
SQL Server detected a logical consistency-based I/O error: incorrect checksum (expected: 0x9a3e399c; actual: 0x9a14b99c).
It occurred during a read of page (1:184) in database ID 23 at offset 0x00000000170000 in file
'C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATANEO.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately.
Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.
Листинг 2: Последствия Data Corruption в таблице ONE.
Это какое-то шоу ужасов, которое администраторы баз данных не хотели бы увидеть. Очевидно, это очень серьезная ошибка и опасное повреждение. Такая ошибка будет выдаваться каждый раз, когда запись 553 будет попадать в результаты запроса, поэтому любой просмотр таблицы будет приводить к проявлению проблемы.
Такие повреждения нужно уметь быстро исправлять. К счастью, перед повреждением файла данных мы сделали резервную копию. Поэтому, если ничего не поможет, я могу воспользоваться этим файлом резервной копии для восстановления данных. При решении проблем с подобными повреждениями критически важно, чтобы у вас были исправные резервные копии. К сожалению, в реальности это повреждение может оставаться незамеченным в течение нескольких дней, а это будет означать, что ваши резервные копии также будут содержать повреждённые данные.
Если это так, то в какой-то момент вы можете столкнуться с самым худшим из возможных сценариев, а именно с потерей данных. Однако, прежде чем смириться с этим фатальным исходом, я собираюсь победить монстра и посмотреть, смогу ли я решить проблему с помощью DBCC CHECKDB
.
У DBCC CHECKDB
много разных параметров, здесь я коснусь лишь некоторых из них. DBCC CHECKDB
за время своего существования много раз улучшалась и подвергалась значительным переработкам в релизе SQL Server 2005 и более поздних версиях. Одним из самых полезных усовершенствований для администратора баз данных, работающего над устранением проблем с повреждением в базе, является большое количество подробных и полезных сообщений об ошибках.
Итак, погнали, давайте посмотрим, насколько всё плохо и что с этим можно поделать. Для начала я выполню ограниченную проверку согласованности данных на физическом уровне базы данных. Сделать это можно с помощью следующей команды:
DBCC CHECKDB ('neo') WITH PHYSICAL_ONLY;
GO
На рис. 10 показаны её результаты, которые, как и ожидалось, не вдохновляют.
Наихудшим из узнанного является предпоследняя строка, которая говорит, что REPAIR_ALLOW_DATA_LOSS
это минимальный уровень исправления обнаруженных ошибок. Это означает, что мы можем исправить ущерб, запустив DBCC CHECKDB
с опцией REPAIR_ALLOW_DATA_LOSS
, но, как понятно из имени параметра, это приведет к потере данных.
Есть два других уровня восстановления, которые для нас были бы предпочтительнее: REPAIR_FAST
или REPAIR_REBUILD.
Первый имеется только для обратной совместимости и не выполняет восстановление базы данных с 2005 года. Если бы минимальный вариант восстановления был REPAIR_REBUILD
, это указывало бы на то, что повреждение можно было бы легко восстановить, поскольку оно затронуло восстановимую структуру, например, некластерный индекс. Такое повреждение можно исправить перестроением индекса и без опасности потери данных.
Только в крайнем случае рекомендуется использовать варианты восстановления DBCC CHECKDB
которые могут привести к потере данных. Причем восстановление из резервной копии очевидно является предпочтительным выбором, если это приведёт данные в неповрежденное состояние. Это, конечно, будет возможным только если сама резервная копия не содержит поврежденных данных.
Однако сейчас я собираюсь действовать в соответствии с тем, что рекомендовано в выводе команды DBCC CHECKDB
и запускать её с параметром, который определяет вариант быстрого восстановления: REPAIR_ALLOW_DATA_LOSS
. Для работы этой опции база данных должна быть в однопользовательском режиме, поэтому синтаксис будет следующим:
ALTER DATABASE NEO SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DBCC CHECKDB ('neo', REPAIR_ALLOW_DATA_LOSS)
GO
Результаты выполнения DBCC CHECKDB
команды показаны в листинге 3.
DBCC results for 'ONE'.
Repair: The page (1:184) has been deallocated from object ID 2121058592, index ID 0, partition ID 72057594039042048, alloc unit ID 72057594043301888 (type In-row data).
Msg 8928, Level 16, State 1, Line 1
Object ID 2121058592, index ID 0, partition ID 72057594039042048, alloc unit ID 72057594043301888 (type In-row data): Page (1:184) could not be processed. See other errors for details.
The error has been repaired.
Msg 8939, Level 16, State 98, Line 1
Table error: Object ID 2121058592, index ID 0, partition ID 72057594039042048, alloc unit ID 72057594043301888 (type In-row data), page (1:184). Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed. Values are 29362185 and -4.
The error has been repaired.
There are 930 rows in 14 pages for object "ONE".
Листинг 3: Ошибка устранена, но данные потеряны.
«Хорошей» новостью является то, что ошибки теперь исправлены. Плохая новость заключается в том, что монстр забрал с собой данные, повреждённая страница в файле данных теперь очищена. Попутно обратите внимание, что в выходных данных присутствует идентификатор объекта таблицы, в которой произошло повреждение, а также идентификатор индекса, который в данном случае равен 0, поскольку у таблицы нет индексов.
Итак, на данный ммент я знаю, что потерял данные, и это была только одна страница данных. Но неизвестно сколько именно данных было на этой странице. Простой SELECT
показывает, что я потерял не только строку, которую я «подправил» (NEOID
553), но и еще 68 строк, вплоть до строки 621. Рисунок 11 демонстрирует факт потери этих строк.
Эти строки можно легко восстановлены, если есть актуальная резервная копия. У Вас же есть хорошая резервная копия, верно? Верно? Предполагая, что Вы её сделали, понадобится восстановить резервную копии в другую базу данных, например, пусть она называется NEO2
. После этого можно синхронизировать две таблицы путем копирования отсутствующих строк. Синхронизация двух таблиц может быть выполнена с помощью простого оператора INSERT INTO
, подобного показанному в листинге 4.
INSERT INTO NEO..ONE ( NEOID, NEOTEXT )
SELECT NEOID,
NEOTEXT
FROM NEO2..ONE
WHERE NEOID NOT IN ( SELECT NEOID
FROM NEO..ONE )
Листинг 4: Синхронизация двух таблиц для восстановления потерянных строк данных.
В этом «контролируемом примере» исправление довольно простое. В других сценариях с гораздо более высоким уровнем повреждения может потребоваться прибегнуть к другим мерам для восполнения утраченных данных после восстановления с потерей данных. Эти средства почти всегда будут включать восстановление базы данных из резервной копии, поэтому я еще раз подчеркиваю важность надежной, проверенной и хорошо документированной политики резервного копирования базы данных.
Повреждение некластерных индексов
Ранее я уже говорил, что с повреждением некластерного индекса справиться намного проще, чем с повреждением страницы данных на листовом уровне, поскольку эти индексы являются дополнительными, избыточными копиями реальных данных и могут быть легко перестроены. Однако было бы интересно доказать эти утверждения. Я воспользуюсь той же техникой подмены данных в шестнадцатеричном редакторе, чтобы повредить некластерный индекс, а не данные таблицы, и посмотрю, как с этим удастся потом справиться.
Мы уже знаем, что в результатах, выводимых командой DBCC индикатором того, относится ли повреждение к индексу или таблице, является значение IndexID.
Для нашей таблицы ONE,
которая является
кучей, в листинге 3 значение IndexID
= 0, поскольку для таблицы не были ещё созданы индексы. Значение IndexID =
1 означает кластерный индекс, а значение от 2 до 250 указывает на возможные некластерные индексы.
Предположим, что я выполнил необходимое восстановление базы из резервной копии и по столбцу NEOID
таблицы ONE
создал некластерный индекс с именем: NEOID
.
Во-первых, нам нужно узнать на каких страницах разместился новый индекс, который создан для таблицы ONE
. Затем мы посмотрим на страницу некластерного индекса средствами DBCC PAGE
, чтобы определить какие данные нужно подменить, имитируя повреждение индекса, и при этом не повредить страницы данных в куче.
Чтобы узнать размещение страниц индекса, можно воспользоваться другой недокументированной командой DBCC, которая называется DBCC IND. Вот синтаксис этой команды:
DBCC IND (DBID, TABLEID,-1)
Итак, чтобы применить эту команду для недавно проиндексированной таблицы ONE
, выполним следующее:
DBCC ind(23, 2121058592, -1)
Результаты показывают несколько строк, у которых значения IndexID
в основном 0, а также несколько строк с IndexID =
2, что указывает на страницы некластерного индекса. Нам нужно запомнить продемонстрированное на рис. 11 значение указателя страницы для случая, когда IndexID =
2. Выберем там страницу 180.
Теперь можно снова запустить DBCC PAGE
, и мы получим нужную нам информацию о странице:
DBCC TRACEON (3604);
GO
DBCC PAGE (NEO,1,180,3)
GO
Результаты выглядят совсем иначе, чем при просмотре страницы данных. Я вижу возвращенное шестнадцатеричное значение (HEAP RID
), представляющее каждую строку индекса для запрошенной страницы, как это показано на рисунке 12.
Я снова использовал шестнадцатеричный редактор, чтобы обнулить HEAP RID,
и снова это повредило базу данных. Однако есть одно существенное отличие: на этот раз, когда я запускаю DBCC CHECKDB('neo') WITH PHYSICAL_ONLY
, значение IndexID
поврежденного объект указывается как «2», то есть это код код некластерного индекса.
Приняв к сведению эту информацию, мы можем предложить иные способы устранения повреждений, кроме восстановления из резервной копии или запуска DBCC CHECKDB
с REPAIR_ALLOW_DATA_LOSS
, что потенциально приводит к потере данных.
Мы можем просто удалить и повторно создать некластерный индекс, используя код из листинга 5.
USE [NEO]
GO
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[ONE]')
AND name = N'NEO_ID_NC')
DROP INDEX [NEO_ID_NC] ON [dbo].[ONE] WITH ( ONLINE = OFF )
GO
USE [NEO]
GO
CREATE NONCLUSTERED INDEX [NEO_ID_NC] ON [dbo].[ONE]
([NEOID] ASC)
WITH (SORT_IN_TEMPDB = ON, ONLINE = ON, ALLOW_PAGE_LOCKS = OFF)
GO
Листинг 5: Удаление и повторное создание поврежденного некластерного индекса.
Теперь, после того, как мы немного углубились в способы поиска и исправления некоторых проблем из-за повреждения данных, давайте обратимся к процессу обнаружения повреждений.
В поисках монстра Data Corruption
Нам нужен наилучший способ узнавать о повреждения в базах данных прежде чем они попадут в резервные копии и превратятся в более серьезную проблему. Как же этого добиться?
Один из вариантов — настроить регулярные проверки целостности с помощью планов обслуживания. Такое решение будет простым, поддерживаемым Майкрософт, прозрачным, полезным и, безусловно, лучше, чем отсутствие проверок целостности вообще. Тем не менее, мне нравится уровень контроля и гибкости, которые можно получить, создавая свои скрипты для выполнения тех же функций, что и планы обслуживания. Поэтому я поделюсь с вами сценарием, который я использую для перебора всех баз данных, включая системные базы данных, и получения отчета об ошибках, возвращаемых командой DBCC CHECKDB
.
С помощью этого скрипта и тривиального способа извлечения во временную таблицу вывода результатов DBCC CHECKDB,
вы не позволите монстру незаметно проникнуть в вашу инфраструктуру данных. И вы сможете действовать обдуманно, когда будете решать проблему сразу после обнаружения.
Скрипт в листинге 6 пробегает по всем базам данных экземпляра SQL Server, фиксирует ошибки и отправляет вам сообщение о числе обнаруженных ошибок, чтобы вы могли более подробно исследовать проблему при её обнаружении.
CREATE TABLE #CheckDBTemp (
Error INT
, [Level] INT
, [State] INT
, MessageText NVARCHAR(1000)
, RepairLevel NVARCHAR(1000)
, [Status] INT
, [DBID] INT
, ObjectID INT
, IndexID INT
, PartitionID BIGINT
, AllocUnitID BIGINT
, [File] INT
, Page INT
, Slot INT
, RefFile INT
, RefPage INT
, RefSlot INT
, Allocation INT
)
-- Needed variables
DECLARE @TSQL NVARCHAR(1000)
DECLARE @dbName NVARCHAR(100)
DECLARE @dbErrorList NVARCHAR(1000)
DECLARE @dbID INT
DECLARE @ErrorCount INT
DECLARE @EmailSubject NVARCHAR(255)
DECLARE @ProfileName VARCHAR(100)
DECLARE @EmailRecipient VARCHAR(255)
-- Init variables
SET @dbID = 0
SET @dbErrorList = ''
SET @EmailSubject = 'Integrity Check Failure on ' + CAST(COALESCE(@@SERVERNAME, 'Server Name Not Available') AS NVARCHAR)
SET @ProfileName = 'Notifications'
SET @EmailRecipient = 'rlandrum13@cox.net'
-- CYCLE THROUGH DATABASES
WHILE(@@ROWCOUNT > 0)
BEGIN
IF( @dbID > 0 )
BEGIN
SET @TSQL = 'DBCC CHECKDB(''' + @dbName + ''') WITH TABLERESULTS, PHYSICAL_ONLY, NO_INFOMSGS'
INSERT INTO #CheckDBTemp
EXEC(@TSQL)
SELECT @ErrorCount = COUNT(*) FROM #CheckDBTemp
IF( @ErrorCount > 0 )
BEGIN
SET @dbErrorList = @dbErrorList + CHAR(10) + CHAR(13) + 'Issue found on database : ' + @dbName
SET @dbErrorList = @dbErrorList + CHAR(10) + CHAR(13) + (Select Top 1 MessageText from #CheckDBTemp)
END
TRUNCATE TABLE #CheckDBTemp
END
IF SUBSTRING(CONVERT(varchar(50), SERVERPROPERTY('ProductVersion')),1,1) = '8'
BEGIN
SELECT TOP 1 @dbName = name, @dbID = dbid
FROM sysdatabases WHERE dbid > @dbID
AND name NOT IN ('tempdb')
AND DATABASEPROPERTYEX(name, 'Status') = 'Online'
ORDER by dbid
END
ELSE
BEGIN
SELECT TOP 1 @dbName = name, @dbID = database_ID
FROM sys.databases WHERE database_ID > @dbID
AND name NOT IN ('tempdb')
AND DATABASEPROPERTYEX(name, 'Status') = 'Online'
ORDER by database_ID
END
END
-- If errors were found
IF( @dbErrorList <> '' )
BEGIN
IF SUBSTRING(CONVERT(varchar(50), SERVERPROPERTY('ProductVersion')),1,1) = '8'
BEGIN
EXEC master..xp_sendmail @recipients = @EmailRecipient, @subject = @EmailSubject, @message = @dbErrorList
END
ELSE
BEGIN
EXEC msdb..sp_send_dbmail @profile_name = @ProfileName, @recipients = @EmailRecipient, @subject = @EmailSubject, @body = @dbErrorList, @importance = 'High'
END
END
DROP TABLE #CheckDBTemp
Листинг 6: Сценарий для поиска и сообщения о повреждении базы данных.
Вы могли заметить, что в коде используется параметр DBCC CHECKDB
, который я ранее не упоминал, а именно WITH TABLERESULTS
. Как следует из названия, результаты выполнения команды возвращаются в виде таблицы. Этот параметр не упоминается в электронной документации, но очень полезен для автоматизации проверки ошибок с помощью SQL Agent Jobs или ваших собственных скриптов.
Этот скрипт можно легко изменить, чтобы он отсылал сообщение электронной почты о том, что все базы данных, кроме базы данных NEO
, не имеют ошибок. Это может несколько смягчить шок, если будет видно, например, что из 20 баз данных повреждена будет только одна. Я знаю, что это могло бы мне немного помочь… В любом случае, когда будет обнаружено повреждение, вы получите сообщение, похожее на то, что изображено на рисунке 14. И это сообщение действительно будет тем монстром, который разбудит вас посреди ночи в холодном поту.
В этом письме я показываю ObjectID
, IndexID
и другую информацию о поврежденной странице, а также вывожу имя базы данных. Этого должно быть достаточно, чтобы продолжить расследование с помощью «новых» инструментов: DBCC PAGE,
DBCC INDID
и DBCC CHECKDB
в разных вариантах восстановления. Или это должно стать тревожным сигналом ктому факту, что вам, возможно, придется восстанавливать данные из резервной копии, не содержащей повреждения.
Резюме
В этой статье мы повредили данные в базе данных и бегло рассмотрели несколько недокументированных параметров DBCC, которые помогали восстановить поврежденные данные. Здесь мы затронули тему только поверхностно, упрощённо показав, как редактировать на странице шестнадцатеричные значения, а также немного научились понимать как сопоставлять результаты различных команд DBCC при устранении неполадок, связанных с повреждением данных.
Я не устану напоминать, что наличие продуманного плана резервного копирования является самой важной задачей для администратора баз данных. Хотя в этой статье я не описывал подробно резервное копирование и восстановление (только по этой теме можно написать целую книгу), но сама тема статьи представляет вескую причину иметь хорошие резервные копии как часть мер по обеспечению высокой доступности и защиты данных в рамках аварийного плана восстановления. Поврежденная база данных действительно угрожает катастрофой и может привести к длительному простою. Наверняка Вам не хочется когда‑нибудь прийти к своему начальнику, или начальнику вашего начальника, и сказать что вы потеряли данные безвозвратно. Если вам предстоит такое, лучше сразу актуализировать свое резюме, при условии, что диск, где оно хранилось, также не поврежден.
Часто у DBA возникает паника после обнаружения в базе данных Data Corruption любого уровня. Если нет проверенных резервных копий и проигнорированы основные рекомендации, которые помогают устранению неполадок, у администратора нет безопасного места, где он мог бы спрятаться, когда монстр впадает в ярость. Все, что вы сможете сделать, это починить базу с возможностью потери данных на сотнях страниц, а затем забиться в уголок своего рабочего места, которое скоро опустеет.
Если у вас есть проверенные резервные копии и вы умеете устранять повреждения без потери данных, то ваше рабочее место однажды может переместиться в офис руководителя с тонированными стёклами во всю стену, из которых открывается отличный вид на мир, где нет монстров.
← →
Фокс Йожин
(2011-10-01 16:59)
[0]
Есть некая таблица MyTable. При выборке SELECT * FROM MyTable получаю ошибку:
SQL Server обнаружил логическую ошибку ввода-вывода, связанную с согласованностью: недопустимый параметр защиты. Она произошла при прочитать страницы (1:1412094) в базе данных с идентификатором 10 по смещению 0x000002b17fc000 файла «D:Base BC1BC1.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С запустил. Жду результата.