Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
rensit
Member

Откуда:
Сообщений: 6
Добрый день. После проверки базы 1С с помощью CHECKDB получил следующие ошибки:

+

Сообщение 2570, уровень 16, состояние 3, строка 1
Страница (1:3186416), область памяти 17 идентификатора объекта 278396161, идентификатор индекса 1, идентификатор секции 72057664337739776, идентификатор единицы размещения 72057663987122176 (тип "In-row data"). Значение столбца "_RecordKind" выходит за пределы диапазона для типа данных "numeric". Обновите столбец, поместив допустимое значение.
Система не может самостоятельно исправить эту ошибку.


CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице "_AccumRg22508" (идентификатор объекта 278396161).
Сообщение 2570, уровень 16, состояние 3, строка 1
Страница (1:7379806), область памяти 19 идентификатора объекта 1394208117, идентификатор индекса 1, идентификатор секции 72057664358449152, идентификатор единицы размещения 72057664007831552 (тип "In-row data"). Значение столбца "_RecordKind" выходит за пределы диапазона для типа данных "numeric". Обновите столбец, поместив допустимое значение.
Система не может самостоятельно исправить эту ошибку.



CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице "_AccumRg24043" (идентификатор объекта 1394208117).
CHECKDB обнаружил 0 ошибок размещения и 2 ошибок согласованности в базе данных "имя_базы".


Для решения этой проблемы порекомендовали воспользоваться статьёй:
https://support.microsoft.com/en-us/help/923247/troubleshooting-dbcc-error-2570-in-sql-server-2005-and-later-versions

1 способом решить проблему не получилось, при выполнении SELECT'а получаю ошибку:
Произошла ошибка при выполнении пакетного файла. Сообщение об ошибке: Переполнение при арифметической операции.

А вот при использовании способа возник такой вопрос. Если взять, например, вторую ошибку:

+
CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице "_AccumRg22508" (идентификатор объекта 278396161).
Сообщение 2570, уровень 16, состояние 3, строка 1
Страница (1:7379806), область памяти 19 идентификатора объекта 1394208117, идентификатор индекса 1, идентификатор секции 72057664358449152, идентификатор единицы размещения 72057664007831552 (тип "In-row data"). Значение столбца "_RecordKind" выходит за пределы диапазона для типа данных "numeric". Обновите столбец, поместив допустимое значение.
Система не может самостоятельно исправить эту ошибку.


И выполнить запрос:
DBCC TRACEON ( 3604 )
DBCC PAGE ( имя_базы , 1 , 7379806 , 3 )

то выводится куча информации, исходя из текста ошибки, я ищу в этом тексте Slot 19, затем мне надо взять значение какой либо колонки и составить запрос с значением из этой колонки для изменения значения в колонке _RecordKind.
И вопрос вот в чём: в Slot 19 есть, например, такая запись:

+
_Fld6869RRef = [Binary data] Slot 19 Column 4 Offset 0x1d Length 16 Length (physical) 16



Как я понял, это 4 колонка, её имя "_Fld6869RRef" и ниже её значение. Так вот, в таблице, указанной в ошибке: _AccumRg22508 нет такой колонки. Да и вообще, в этой таблице 28 колонок, а в информации, которая вывелась на экран их 30, т.е. явно я вывел другую таблицу.
Так и должно быть? Или я в чём то ошибся?
1 май 17, 14:38    [20448048]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
aleks2
Guest
Ну чо ты суетишься?

1. У тя, всего навсего, "неправильное значение" в ячейке.
2. Таблица есть, колонка есть.
3. Рисуем запрос

select top(1000000000) Колонка from Таблица

и отгребаем ошибку.

4. Методом деления 1000000000 пополам находим строку с ошибкой.

5. Фсе. Дальше дело техники. Либо грохнуть строку, либо исправить апдейтом.
1 май 17, 15:11    [20448077]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
rensit
Member

Откуда:
Сообщений: 6
Спасибо, этот способ действительно помог быстро найти проблемную строку. Только... как её удалить? Дело в том, что ни за одну колонку зацепиться не могу, нет ID у записей. С помощью последовательных запросов вида:

+
SELECT TOP(169145) *
FROM [test].[dbo].[_AccumRg22508]
ORDER BY _Period


Я определил, что проблема в строке 169146, но как удалить саму эту строку? Нужно каким то образом использовать ROW_NUMBER?
1 май 17, 18:36    [20448243]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
rensit
Спасибо, этот способ действительно помог быстро найти проблемную строку. Только... как её удалить? Дело в том, что ни за одну колонку зацепиться не могу, нет ID у записей. С помощью последовательных запросов вида:

+
SELECT TOP(169145) *
FROM [test].[dbo].[_AccumRg22508]
ORDER BY _Period


Я определил, что проблема в строке 169146, но как удалить саму эту строку? Нужно каким то образом использовать ROW_NUMBER?
А _Period уникальна? Иначе как же вы по ней делаете ORDER BY, и получаете точно нужную строку?
Если да, то можно сделать апдэйт по _Period
1 май 17, 18:50    [20448254]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
rensit
Member

Откуда:
Сообщений: 6
alexeyvg,

Эта колона тоже не уникальна, просто она первая :)

Ещё раз внимательно изучил таблицу, судя по предыдущим записям уникальных полей не нашёл... Впрочем пришёл в голову вариант развернуть какой нибудь старый бекап и посмотреть там, что хранилось в этой записи, а затем сделать UPDATE... По результату отпишусь.
1 май 17, 19:35    [20448313]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
rensit
Ещё раз внимательно изучил таблицу, судя по предыдущим записям уникальных полей не нашёл
Уникальным может быть сочетание столбцов.
У вашей таблицы кластерный индекс. Скорее всего это ПК. Вот и посмотрите в метаданных какие столбцы в него включены.
1 май 17, 20:09    [20448344]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
amr-now
Member

Откуда:
Сообщений: 3
> идентификатора объекта 278396161, идентификатор индекса 1.

Что за индекс у этой таблицы?
Для этого индекса будет некий набор столбцов.
1 май 17, 20:11    [20448345]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
aleks2
Guest
rensit
Спасибо, этот способ действительно помог быстро найти проблемную строку. Только... как её удалить? Дело в том, что ни за одну колонку зацепиться не могу, нет ID у записей. С помощью последовательных запросов вида:

+
SELECT TOP(169145) *
FROM [test].[dbo].[_AccumRg22508]
ORDER BY _Period


Я определил, что проблема в строке 169146, но как удалить саму эту строку? Нужно каким то образом использовать ROW_NUMBER?


select top(1) * from (
SELECT TOP(169146) *
 FROM [test].[dbo].[_AccumRg22508]
 ORDER BY _Period asc) as x 
ORDER BY _Period desc
2 май 17, 06:06    [20448609]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
rensit
Member

Откуда:
Сообщений: 6
Итак, всем большое спасибо за помощь, проблему решил при помощи dbcc page, я допустил банальную ошибку: я скопировал список ошибок в блокнот, и когда запускал команду, вставил значения страницы от другой базы. Когда я ещё раз прогнал тестовую базу через CHECKDB я это увидел. Ну и затем через апдейт вылечил обе битые записи.

На всякий случай, если кому из новичков придётся работать с этой командой.

Вот текст ошибки после лечения базы при помощи DBCC CHECKDB (N'База', REPAIR_REBUILD) WITH NO_INFOMSGS:
+
Сообщение 2570, уровень 16, состояние 3, строка 1
Страница (1:10884340), область памяти 17 идентификатора объекта 278396161, идентификатор индекса 1, идентификатор секции 72057665028816896, идентификатор единицы размещения 72057664678592512 (тип "In-row data"). Значение столбца "_RecordKind" выходит за пределы диапазона для типа данных "numeric". Обновите столбец, поместив допустимое значение.
Система не может самостоятельно исправить эту ошибку.
CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице "_AccumRg22508" (идентификатор объекта 278396161).


DBCC TRACEON ( 3604 )
DBCC PAGE ( имя_базы , 1 , 10884340 , 3 )

Жирным выделено то, что мы вставляем в запрос.
Будет выведено много текста вида:
+
Slot (НОМЕР ОБЛАСТИ ПАМЯТИ) Column 1 Offset 0x4 Length 8 Length (physical) 8

Имя_колонки_1 = значение_колонки_1

Имя_колонки_2 = [Binary data] Slot НОМЕР ОБЛАСТИ ПАМЯТИ ( Column 2 Offset 0xc Length 4 Length (physical) 4

Имя_колонки_2 = значение_колонки_2

...

Имя_колонки_N = [Binary data] Slot НОМЕР ОБЛАСТИ ПАМЯТИ ( Column N Offset 0xc Length 4 Length (physical) 4

Имя_колонки_N = INVALID_DATA



Ищем нашу область память (Slot N), из текста ошибки мы точно знаем, в какой колонке ошибка (в моём случае _RecordKind).
И составляем запрос update\delete, используя значения в других колонках для изменения значения в повреждённой колонке или удалении строки полностью.

Тему можно закрывать.
2 май 17, 21:17    [20451513]     Ответить | Цитировать Сообщить модератору
 Re: CHECKDB. Система не может самостоятельно исправить эту ошибку.  [new]
aleks2
Guest
rensit
Итак, всем большое спасибо за помощь, проблему решил при помощи dbcc page, я допустил банальную ошибку: я скопировал список ошибок в блокнот, и когда запускал команду, вставил значения страницы от другой базы. Когда я ещё раз прогнал тестовую базу через CHECKDB я это увидел. Ну и затем через апдейт вылечил обе битые записи.

На всякий случай, если кому из новичков придётся работать с этой командой.

Вот текст ошибки после лечения базы при помощи DBCC CHECKDB (N'База', REPAIR_REBUILD) WITH NO_INFOMSGS:
+
Сообщение 2570, уровень 16, состояние 3, строка 1
Страница (1:10884340), область памяти 17 идентификатора объекта 278396161, идентификатор индекса 1, идентификатор секции 72057665028816896, идентификатор единицы размещения 72057664678592512 (тип "In-row data"). Значение столбца "_RecordKind" выходит за пределы диапазона для типа данных "numeric". Обновите столбец, поместив допустимое значение.
Система не может самостоятельно исправить эту ошибку.
CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице "_AccumRg22508" (идентификатор объекта 278396161).


DBCC TRACEON ( 3604 )
DBCC PAGE ( имя_базы , 1 , 10884340 , 3 )

Жирным выделено то, что мы вставляем в запрос.
Будет выведено много текста вида:
+
Slot (НОМЕР ОБЛАСТИ ПАМЯТИ) Column 1 Offset 0x4 Length 8 Length (physical) 8

Имя_колонки_1 = значение_колонки_1

Имя_колонки_2 = [Binary data] Slot НОМЕР ОБЛАСТИ ПАМЯТИ ( Column 2 Offset 0xc Length 4 Length (physical) 4

Имя_колонки_2 = значение_колонки_2

...

Имя_колонки_N = [Binary data] Slot НОМЕР ОБЛАСТИ ПАМЯТИ ( Column N Offset 0xc Length 4 Length (physical) 4

Имя_колонки_N = INVALID_DATA



Ищем нашу область память (Slot N), из текста ошибки мы точно знаем, в какой колонке ошибка (в моём случае _RecordKind).
И составляем запрос update\delete, используя значения в других колонках для изменения значения в повреждённой колонке или удалении строки полностью.

Тему можно закрывать.


Редкостно бесполезный текст.
3 май 17, 05:45    [20451875]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить