Диагностика ошибок DBCC 2570 в SQL Server 2005

Переводы статьи Переводы статьи
Код статьи: 923247 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Введение эта ссылка может указывать на содержимое полностью или частично на английском языке

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

Дополнительная информация

Проверка DATA_PURITY

В SQL Server 2005 был добавлен новый параметр DATA_PURITY, команды DBCC CHECKDB и DBCC CHECKTABLE. При выполнении команды DBCC CHECKDB и DBCC CHECKTABLE этот параметр включен, будет выполнять проверки «данных чистота» на значение каждого столбца во всех строках таблицы или таблиц в базе данных. Эти новые проверки выполняются, чтобы гарантировать правильность значений, хранящихся в столбцах (то есть, значения не равны вне этого диапазона для домена связан с типом данных этого столбца). Характер выполнения проверки зависит от типа данных столбца. Ниже приведен не исчерпывающий список предоставляет несколько примеров:
Свернуть эту таблицуРазвернуть эту таблицу
Тип данных столбцаТип проверки данных выполнено
Знак ЮникодаДлина данных должна быть кратна 2.
Дата и времяВ поле дней должно быть между 1 января 1753 года и 31 декабря 9999 года. В поле время должна быть меньше "11:59:59:999 по".
Реальные и ПоплавковыйПроверьте наличие недопустимые значения с плавающей SNAN, QNAN NINF, Плотности, 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 завершения, но сообщает о нарушении целостности данных проблем. If this is the case, you will have to clean the database to remove the inconsistencies and then attempt to execute the DBCC command again. You will have to specify the DATA_PURITY option for the DBCC command until the database is reported to be clean.
  • If the PHYSICAL_ONLY option is specified when the DBCC CHECKDB or DBCC CHECKTABLE command is executed, the data purity checks are not performed.

Признаки

Invalid or out-of-range data may have been stored in the SQL Server database in earlier versions for the following reasons:
  • Invalid data was present in the source while using bulk insert methods, such as the bcp utility.
  • Invalid data was passed through RPC event calls made to SQL Server.
  • Other potential causes of physical data corruption left the column value in an invalid state.
If you have invalid data in a column of a table, you might encounter problems depending on the type of operation that is performed against the invalid data. However, it is also possible that no problem will appear, and the invalid data will not be discovered until you execute a DBCC CHECKDB or DBCC CHECKTABLE command on SQL Server 2005.

Some of the symptoms you may notice due to the presence of invalid data include (but are not limited to):
  • Access violations or other types of exceptions while executing queries against the affected column.
  • Incorrect results returned by queries executed against the affected column.
  • Errors or problems when statistics are being built against the affected columns.
  • Error messages like the following:
    Msg 9100, Level 23, State 2, Line 1 Possible index corruption detected. Run DBCC CHECKDB.

DATA_PURITY Problem Report

When you execute a DBCC CHECKDB or DBCC CHECKTABLE command with the DATA_PURITY option enabled (or the data purity checks are run automatically), and invalid data exists in the tables checked by the DBCC commands, the DBCC output includes additional messages that indicate the problems with the data. Some sample error messages that indicate data purity problems are shown below:
DBCC results for "account_history".
Msg 2570, Level 16, State 2, Line 1
Page (1:1073), slot 33 in object ID 1977058079, index ID 0, partition ID 129568478265344, alloc unit ID 129568478265344 (type "In-row data"). Column "account_name_japan" value is out of range for data type "nvarchar". Update column to a legal value.
Msg 2570, Level 16, State 2, Line 1
Page (1:1156), slot 120 in object ID 1977058079, index ID 0, partition ID 129568478265344, alloc unit ID 129568478265344 (type "In-row data"). Column "account_name_japan" value is out of range for data type "nvarchar". Update column to a legal value.
There are 153137 rows in 1080 pages for object "account_history".
CHECKDB found 0 allocation errors and 338 consistency errors in table "account_history" (object ID 1977058079).
CHECKDB found 0 allocation errors and 338 consistency errors in database 'BadUnicodeData'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC results for 'table1'.
Msg 2570, Level 16, State 3, Line 1
Page (1:154), slot 0 in object ID 2073058421, index ID 0, partition ID 72057594038321152, alloc unit ID 72057594042318848 (type "In-row data"). Column "col2" value is out of range for data type "real". Update column to a legal value.
There are 4 rows in 2 pages for object "table1".
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table1' (object ID 2073058421).
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC results for 'table2'.
Msg 2570, Level 16, State 3, Line 1
Page (1:155), slot 0 in object ID 2105058535, index ID 0, partition ID 72057594038452224, alloc unit ID 72057594042449920 (type "In-row data"). Column "col2" value is out of range for data type "decimal". Update column to a legal value.
There are 4 rows in 1 pages for object "table2".
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table2' (object ID 2105058535).
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC results for 'table3'.
Msg 2570, Level 16, State 3, Line 1
Page (1:157), slot 0 in object ID 2121058592, index ID 0, partition ID 72057594038517760, alloc unit ID 72057594042515456 (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value.
There are 3 rows in 1 pages for object "table3".
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table3' (object ID 2121058592).
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator.
For every row that contains an invalid column value, a 2570 error is generated.

Fixing the Data Purity Problem

The 2570 errors cannot be repaired using any of the DBCC repair options. This is because it is impossible for DBCC to determine what value should used to replace the invalid column value. Thus, the column value must be manually updated.

To perform a manual update, you have to find the row that has the problem. There are two ways to accomplish this.
  • Execute a query against the table that contains the invalid values to find the rows that contain the invalid values.
  • Use the information from the 2570 error to identify the rows that have an invalid value.
We will discuss both of these methods in detail below, using examples to find the rows that have invalid data.

После того, как найти правильную строку, решение необходимо сделать на новое значение, которое будет использоваться для замены существующих недопустимые данные. Это решение должно выполняться очень тщательно на основе ряда значений, которые работают для приложения также делает логический смысл для этой конкретной строки данных. У вас есть варианты:
  • Если вы знаете, какое значение должно быть, его значение, определенное значение.
  • Установите значение по умолчанию приемлемо.
  • Значение столбца установлено в 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
Реальные и Поплавковый тип данных:
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)
Десятичных и числовых типов данных:
SELECT col1 FROM table2
WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999
Имейте в виду, необходимые для настройки значений на основе точности и масштаба с помощью которого определен столбец decimal или numeric. В приведенном выше примере столбец определен как col2 decimal(15,5).

Дата, время данных типа:
Необходимо выполнить два разных запросов для идентификации строки, содержащие недопустимые значения для столбца даты времени.
SELECT col1 FROM table3
WHERE 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

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

You can use this method if you are unable to find the rows of interest using the T-SQL method discussed above. In the 2570 error message, the physical location of the row that contains the invalid value is printed. For example, look at the following message:
Page (1:157), slot 0 in object ID 2121058592, index ID 0, partition ID 72057594038517760, alloc unit ID 72057594042515456 (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value.
In this message, you will notice the information: Page (1:157), slot 0. This is the information you need to identify the row. The FileId is 1, the PageInFile is 157, and the SlotId is 0. Once you have this information, you will need to execute the command, as follows:
DBCC TRACEON ( 3604 )
DBCC PAGE ( realdata , 1 , 157 , 3 )
This command will print the entire contents of a page. Parameters to the DBCC PAGE command are:
  • Database Name:
  • FileId
  • PageInFile
  • print option
Once you execute this command, you will notice output that contains information similar to the following format:
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 = 1Slot 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 
In this output you can clearly see the column values for the row of interest to you. In this case, you need the row stored in slot 0 of the page. From the error message, you know that col2 is the one with the problem. So you can take the value of col1 for Slot 0 and use it as the predicate in the WHERE clause of your update statement or delete statement.

ПредупреждениеWe recommend that you use the first method (that is, use T-SQL queries to find the required information). Use the DBCC PAGE command only as a last resort. Take utmost care while you use this command in a production environment. It is advisable to restore the production database on a test server, then get all the required information using DBCC PAGE, and then do the updates on the production server. As always, make sure to keep a backup ready in case something goes wrong and you need to revert to an earlier copy of the database.

Ссылки

For more information about the DBCC CHECKDB statement, see the "DBCC CHECKDB (Transact-SQL)" topic on the following Microsoft Developer Network (MSDN) Web site:
http://msdn2.microsoft.com/en-us/library/ms176064.aspx
For more information about known issues in SQL Server 2000, click the following article number to view the article in the Microsoft Knowledge Base:
900335FIX: The SQL Server 2000 automatic database recovery operation may not succeed if an index contains a FLOAT data type or a REAL data type, and this data type contains a NaN value
For more information about RPC events, see the "Calling a Stored Procedure (OLE DB)" topic on the following MSDN Web site:
http://msdn2.microsoft.com/en-us/library/aa198358(SQL.80).aspx
For more information about the different data types, see the "Calling a Stored Procedure (OLE DB)" topic on the following MSDN Web site:
http://msdn2.microsoft.com/en-us/library/ms187752.aspx
For more information about floating point value conventions, visit the following Intel Web site:
http://www.intel.com/design/pentiumii/manuals/243191.htm
Контактные данные независимых производителей предоставлены в этой статье с целью помочь пользователям получить необходимую техническую поддержку.. Эти данные могут быть изменены без предварительного уведомления.. Корпорация Майкрософт не дает гарантий относительно верности приведенных контактных данных сторонних производителей..

Свойства

Код статьи: 923247 - Последний отзыв: 27 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Express Edition with Advanced Services
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Standard X64 Edition
Ключевые слова: 
kbtshoot kbexpertiseadvanced kbsql2005engine kbinfo kbmt KB923247 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:923247

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com