Устранение ошибок DBCC 2570 в SQL Server 2005 и более поздних версий

Номер ошибки: 60178 (Content Maintenance)

ВВЕДЕНИЕ

В данной статье описывается SQL Server об ошибке 2570, что приводит к ошибке и решить проблему.

Дополнительные сведения

DATA_PURITY проверок

В SQL Server 2005 был добавлен новый параметр DATA_PURITY, команды DBCC CHECKDB и DBCC CHECKTABLE. При выполнении команды DBCC CHECKDB и DBCC CHECKTABLE этот параметр включен, будет выполнять проверки «данных чистоту» на все значения столбцов во всех строках таблицы или таблиц в базе данных. Эти новые проверки выполняются для проверки допустимости значения, хранящиеся в столбцах (то есть, значения не вне диапазона для домена связан с типом данных этого столбца). Характер проверки допустимости зависит от типа данных столбца. Следующий список не исчерпывающий предоставляет несколько примеров:

Тип данных столбца

Тип проверки данных выполнено

Знак Юникода

Длина данных должен быть кратен 2.

Datetime

Поле дней должно быть между 1 января 1753 г. и 31 декабря 9999 года. Поле время должна предшествовать «11:59:59:999 PM».

Реальные и с плавающей запятой

Проверьте наличие недопустимых значений с плавающей запятой, например SNAN, QNAN, NINF, ND, PD, PINF.

Не все типы данных проверяются на допустимость значений данных в столбце. Только там, где это возможно хранится в виде значения, находится вне допустимого диапазона проверки. Например тип данных tinyint имеет допустимый диапазон от 0 до 255, хранятся в один байт (который может хранить только значения от 0 до 255), поэтому проверка значения не требуется.

Проверка данных чистота не включается автоматически для всех баз данных. Проверяет, включены в зависимости от нескольких факторов:

  • Для баз данных, созданных в SQL Server 2005 и более поздних версий эти проверки включается по умолчанию и не может быть отключен, поэтому использование параметра DATA_PURITY при выполнении команды DBCC CHECKDB и DBCC CHECKTABLE не учитывается.

  • Для баз данных, созданных в более ранних версиях SQL Server, SQL Server 2000, SQL Server 7.0 и версии обновлены до SQL Server 2005 эти проверки не включена по умолчанию. Чтобы эти проверки должны быть выполнены необходимо указать параметре DATA_PURITY в команде DBCC CHECKDB и DBCC CHECKTABLE. Это может привести к две вещи:

    • Команда DBCC завершает и сообщает о чистой, включая все проверки чистоты данных базы данных. Этот факт записывается в заголовке базы данных. Все последующие выполнения команды DBCC CHECKDB и DBCC CHECKTABLE заметит эту информацию и автоматически выполнит проверку данных чистоты, как произойдет для баз данных, созданных в SQL Server 2005. Другими словами когда известно, что база данных является «чистое», всегда выполняются проверки чистоты данных.

    • Команда DBCC завершения, но сообщает о несогласованности данных проблем. Если это так, будет необходимо очистить базу данных, чтобы избавиться от несоответствий и попробуйте снова выполнить команду DBCC. Необходимо для указания параметра DATA_PURITY для команды DBCC, пока база данных считается новой.

  • Если при выполнении команды DBCC CHECKDB и DBCC CHECKTABLE указан параметр PHYSICAL_ONLY, проверка чистоты данных не выполняется.

СИМПТОМЫ

Недопустимый или выход из допустимого диапазона данных может сохранены в базе данных SQL Server в более ранних версиях по следующим причинам:

  • Недопустимые данные присутствовало в источнике при использовании bulk insert методы, такие как программа bcp.

  • Недопустимые данные были переданы через вызовы RPC событий SQL Server.

  • Другие возможные причины повреждения слева физических данных значение столбца в недопустимом состоянии.

Если имеются недопустимые данные в столбце таблицы, могут возникнуть проблемы в зависимости от типа операции, которая выполняется недопустимые данные. Тем не менее это также возможно, что будет отображаться нормально и не будет обнаруживаться недопустимые данные до выполнения команды DBCC CHECKDB и DBCC CHECKTABLE на SQL Server 2005 и более поздних версий.

Некоторые симптомы, которые могут возникнуть из-за наличия недопустимых данных относятся (но не ограничиваются):

  • Нарушение прав доступа или другие типы исключений во время выполнения запросов к проблемной колонке.

  • Неверные результаты запросов данных соответствующих столбцов.

  • Ошибки или проблемы, когда статистика строятся для задействованных столбцов.

  • Сообщения об ошибках следующим образом:

    Msg 9100, 23 уровня, состояние 2, строка 1 возможных обнаружено повреждение индекса. Выполните инструкцию DBCC CHECKDB.

Отчет о проблеме DATA_PURITY

При выполнении инструкции DBCC CHECKDB и DBCC CHECKTABLE с включенным параметром DATA_PURITY (или чистота данных, проверки запускаются автоматически) и недопустимые данные существуют в таблицах проверяются с помощью команд DBCC, выходные данные инструкции DBCC включает дополнительные сообщения, которые указывают на проблемы с данными. Ниже приведены некоторые образца сообщений об ошибке, которые указывают на проблемы чистоты данных:

Результаты выполнения команды DBCC для «account_history».
Msg 2570, уровень 16, состояние 2, строка 1
Страницы (1:1073), 33 разъем в объект 1977058079 идентификатор индекса с кодом 0, ID 129568478265344 раздела, единицы ID 129568478265344 (тип «в строке данных»). Столбец «account_name_japan» значение лежит вне диапазона для типа данных «nvarchar». Обновление столбца на допустимое значение.

Msg 2570, уровень 16, состояние 2, строка 1
Страницы (1:1156), 120 в объект разъем 1977058079 идентификатор индекса с кодом 0, ID 129568478265344 раздела, единицы ID 129568478265344 (тип «в строке данных»). Столбец «account_name_japan» значение лежит вне диапазона для типа данных «nvarchar». Обновление столбца на допустимое значение.
Существуют 153137 строк на страницах 1080 для объекта «account_history».
В таблице «account_history» (объект ID 1977058079) CHECKDB найдено 0 ошибок распределения и 338 ошибок согласованности.
CHECKDB найдено 0 ошибок распределения и 338 ошибок согласованности в базе данных «BadUnicodeData».
Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Результаты выполнения команды DBCC для «table1».
Msg 2570, уровень 16, состояние 3, строка 1
Страницы (1:154), разъем 0 в объекте с Идентификатором 2073058421, индекса с Идентификатором 0, раздел 72057594038321152 ID, единицы ID 72057594042318848 (тип «в строке данных»). Значение столбца «col2» находится вне диапазона для типа данных «реальными». Обновление столбца на допустимое значение.
Существует 4 строки в 2 страницы для объекта «Таблица1».
CHECKDB найдено 0 распределения и согласованности 1 ошибки в таблице «table1» (объект ID 2073058421).
CHECKDB найдено 0 ошибок распределения и 1 ошибок согласованности в базе данных «realdata». Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Результаты выполнения команды DBCC для «table2».
Msg 2570, уровень 16, состояние 3, строка 1
Страницы (1:155), разъем 0 в объекте с Идентификатором 2105058535, индекса с Идентификатором 0, раздел 72057594038452224 ID, единицы ID 72057594042449920 (тип «в строке данных»). Значение столбца «col2» находится вне диапазона для типа данных «decimal». Обновление столбца на допустимое значение.
Существует 4 строки в 1 страницы для объекта «Таблица2».
CHECKDB найдено 0 распределения и согласованности 1 ошибки в таблице «table2» (объект ID 2105058535).
CHECKDB найдено 0 ошибок распределения и 1 ошибок согласованности в базе данных «realdata». Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Результаты выполнения команды DBCC для 'Таблица3».
Msg 2570, уровень 16, состояние 3, строка 1
Страницы (1:157), разъем 0 в объекте с Идентификатором 2121058592, индекса с Идентификатором 0, раздел 72057594038517760 ID, единицы ID 72057594042515456 (тип «в строке данных»). Значение столбца «col2» находится вне диапазона для типа данных «datetime». Обновление столбца на допустимое значение.
Существует 3 строки в 1 страницы для объекта «Таблица3».
CHECKDB найдено 0 распределения и согласованности 1 ошибки в таблице «Таблица3» (объект ID 2121058592).
CHECKDB найдено 0 ошибок распределения и 1 ошибок согласованности в базе данных «realdata». Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

Для каждой строки, которая содержит недопустимое значение столбца создается ошибка 2570.

Устранение неполадок чистота данных

С помощью любого из параметров восстановления DBCC не подлежат 2570 ошибки. Это потому, что это невозможно для инструкции DBCC определить, какие значения следует использовать для замены недопустимое значение столбца. Таким образом значение этого столбца следует обновить вручную.

Чтобы выполнить обновление вручную, необходимо найти строку, содержащую проблему. Существует два способа выполнения этой задачи.

  • Выполните запрос к таблице, которая содержит недопустимые значения, чтобы найти строки, которые содержат недопустимые значения.

  • Используйте сведения об ошибке 2570 для идентификации строк, которые имеют недопустимое значение.

Мы рассмотрим оба эти методы рассматриваются подробно ниже, используя примеры для поиска строк, которые содержат недопустимые данные.

После нахождения требуемой строки решения необходимо сделать на новое значение, которое будет использоваться для замены существующего недопустимые данные. Это решение должно выполнены очень внимательно на основании диапазона значений, которые работают для приложения и делает логический смысл для определенной строки данных. Варианты являются:

  • Если вы знаете, какое значение следует, присвойте ему значение, определенное значение.

  • Установите его в значение по умолчанию приемлемо.

  • Значение столбца NULL.

  • Значение столбца в максимальное или минимальное значение для типа данных столбца.

  • Если вы считаете, что определенной строки не использовать не является допустимым значением для столбца, строки можно удалить полностью.

Поиск строк с неверными значениями с помощью запросов T-SQL

Тип запроса, которые необходимо выполнить для поиска строк, которые содержат недопустимые значения зависит от типа данных столбца, который сообщил проблему. Если вы посмотрите на сообщение об ошибке 2570, вы заметите два важных аспекта сведений, которые помогут в этом. В следующем примере столбец «account_name_japan» значение за пределами допустимого диапазона для типа данных «nvarchar». Легко можно определить столбец, имеющий проблемы, а также тип данных связанных столбцов. Таким образом когда известен его тип данных и столбец, формулировать запрос, чтобы найти строки, которые содержат недопустимые значения для этого столбца, выбор столбцов необходимые для идентификации строки (как предикаты в предложении WHERE) для любого дальнейшего обновления или удаления.

Тип данных Юникода:

SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0


Тип данных float:

-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from the CHECKDB output
SELECT col1, col2 FROM table1
WHERE col2<>0.0 AND (col2 < 2.23E-308 OR col2 > 1.79E+308) AND (col2 < -1.79E+308 OR col2 > -2.23E-308)


Тип данных real:

-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from -- the CHECKDB output
SELECT col1, col2 FROM testReal
WHERE col2<>0.0 AND (col2 < CONVERT(real,1.18E-38) OR col2 > CONVERT(real,3.40E+38)) AND (col2 < CONVERT(real,-3.40E+38) OR col2 > CONVERT(real,-1.18E-38))
ORDER BY col1; -- checks for real out of range

Десятичных и числовых типов данных:

SELECT col1 FROM table2WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999

Имейте в виду, необходимый для настройки на основе точности и масштаба, с которой определено столбцов десятичных или числовых значений. В приведенном выше примере столбец определен как столбец col2 decimal(15,5).

Дата время данных типа:
Необходимо будет выполнить разные запросы, чтобы определить строки, которые содержат недопустимые значения для столбца даты-времени.

SELECT col1 FROM table3WHERE col2 < '1/1/1753 12:00:00 AM' OR col2 > '12/31/9999 11:59:59 PM'

SELECT col1 FROM table3 WHERE
((DATEPART(ms,col2)+ (1000*DATEPART(s,col2)) + (1000*60*DATEPART(mi,col2)) + (1000*60*60*DATEPART(hh,col2)))/(1000*0.00333))
> 25919999

Поиск строк с недопустимое значение с помощью физического расположения:

Этот метод можно использовать, если не удается найти строки интерес, используя метод T-SQL, описанных выше. В сообщении об ошибке 2570 физическое расположение строки, содержащей недопустимое значение выводится на печать. Например рассмотрим следующее сообщение:

Страницы (1:157), разъем 0 в объекте с Идентификатором 2121058592, индекса с Идентификатором 0, раздел 72057594038517760 ID, единицы ID 72057594042515456 (тип «в строке данных»). Значение столбца «col2» находится вне диапазона для типа данных «datetime». Обновление столбца на допустимое значение.

В этом сообщении можно заметить информация: страницы (1:157), разъем 0. Это сведения, необходимые для идентификации строки. Идентификатор файла равен 1, 157, PageInFile и SlotId — 0. Получив эти данные, необходимо выполнить команду, как показано ниже:

DBCC TRACEON ( 3604 )DBCC PAGE ( realdata , 1 , 157 , 3 )

Эта команда будет напечатать все содержимое страницы. Параметры команды DBCC страницы являются:

  • Имя базы данных

  • Идентификатор файла

  • PageInFile

  • параметры печати

После выполнения этой команды, можно заметить, что вывод, который содержит сведения, похожие на следующий формат:

Slot 0  Offset 0x60 Length 19 Record Type = PRIMARY_RECORD Record  Attributes = NULL_BITMAP Memory Dump @0x44D1C060 00000000: 10001000 01000000
ffffffff ffffffff †................ 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 0 Column 0 Offset 0x4 Length 4 col1 = 1 Slot 0 Column 1 Offset 0x8 Length 8 col2 = Dec 31 1899 19:04PM Slot 1 Offset 0x73 Length 19 Record Type = PRIMARY_RECORD Record
Attributes = NULL_BITMAP Memory Dump @0x44D1C073 00000000: 10001000 02000000
0ba96301 f8970000 †..........c..... 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 1 Column 0 Offset 0x4 Length 4
col1 = 2 Slot 1 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM Slot 2
Offset 0x86 Length 19 Record Type = PRIMARY_RECORD Record Attributes =
NULL_BITMAP Memory Dump @0x44D1C086 00000000: 10001000 03000000 0ba96301
f8970000 †..........c..... 00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 2 Column 0 Offset 0x4 Length 4 col1 = 3 Slot 2 Column 1 Offset 0x8 Length
8 col2 = Jul 8 2006 9:34PM

В эти выходные данные можно ясно увидеть значения столбца для строки, интересующие вас. В этом случае необходимо строк, хранящихся в разъем 0 страницы. Из сообщения об ошибке вы знаете, что этот столбец col2 является один со своей проблемой. Таким образом можно принимать значения col1 разъем 0 и использовать его в качестве предиката в предложении WHERE инструкции update или delete.

Предупреждение Рекомендуется использовать первый метод (, используйте T-SQL запросы для поиска необходимой информации). Команда DBCC страницы только в качестве последнего средства. Занять важнейшую осторожность при использовании этой команды в производственной среде. Рекомендуется для восстановления производственной базы данных на тестовом сервере, а затем получить все необходимые сведения, с помощью инструкции DBCC страницы и выполните обновление на рабочем сервере. Как и всегда убедитесь, что для поддержания готовности резервной копии на случай, если что-то пойдет не так, и необходимо вернуться к предыдущей копии базы данных.

Ссылки

Дополнительные сведения об инструкции DBCC CHECKDB приведены в разделе «Инструкции DBCC CHECKDB (Transact-SQL)» на следующем веб-узле Microsoft Developer Network (MSDN):

http://msdn2.microsoft.com/en-us/library/ms176064.aspxДополнительные сведения об известных проблемах в SQL Server 2000 щелкните следующий номер статьи базы знаний Майкрософт:

ИСПРАВИТЬ 900335 : Если индекс содержит тип данных FLOAT или тип данных REAL, и этот тип данных содержит значение NaN операции восстановления автоматического базы данных для SQL Server 2000 не удается

Дополнительные сведения о событиях RPC приведены в разделе «Вызов хранимой процедуры (OLE DB)» на веб-узле MSDN:

http://msdn2.microsoft.com/en-us/library/aa198358(SQL.80).aspxДополнительные сведения о типах данных приведены в разделе «Вызов хранимой процедуры (OLE DB)» на веб-узле MSDN:

http://msdn2.microsoft.com/en-us/library/ms187752.aspxДополнительные сведения о соглашениях значение с плавающей точкой посетите следующий сайт корпорации Intel:

http://www.intel.com/design/pentiumii/manuals/243191.htmКорпорация Майкрософт предоставляет контактные данные независимых производителей для поиска технической поддержки. Данная информация может изменяться без предупреждения. Корпорация Майкрософт не гарантирует точность контактных данных независимых производителей.

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Спасибо за ваш отзыв!

Благодарим за отзыв! Возможно, будет полезно связать вас с одним из наших специалистов службы поддержки Office.

×