SqlServer 2008R2 sp1 CHECKDB аварийно завершает работу при наличии пространственного индекса

SqlServer 2008R2 sp1 CHECKDB аварийно завершает работу при наличии пространственного индекса

У нас была проблема с падением DBCC CHECKDB с нарушением доступа (отсрочка нулевого указателя) на Sql Server 2008R2 при наличии пространственных индексов. Это повторяется с DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS, но также происходит в некоторых случаях и с просто DBCC CHECKDB.

У нас это происходит на SQL Server 2008 R2 sp1 standard (и developer edition) под управлением Windows 2008 R2 и Windows 7 (все 64-разрядные).

Вот простой скрипт T-SQL, демонстрирующий проблему. Если вы запустите его в SSMS, вы увидите вывод и прекращение соединения sql.

использовать мастер
идти
если существует (выберите * из sys.databases, где имя = 'DbccCrashExample') удалить базу данных DbccCrashExample
идти
создать базу данных DbccCrashExample
ИДТИ
использовать DbccCrashExample
идти
СОЗДАТЬ ТАБЛИЦУ dbo.GeometryTable
(
    GeometryTableID int НЕ NULL,
    Геометрия объекта НЕ NULL,
    ОГРАНИЧЕНИЕ PK_GeometryTable ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРИЗОВАННЫЙ (GeometryTableID)
)
ИДТИ
вставить в dbo.GeometryTable(GeometryTableID, Feature)
выберите 1, геометрия::STGeomFromText('POINT(0 0)', 4326)
идти
создать пространственный индекс SPATIAL_GeometryTable_Feature на dbo.GeometryTable(Feature) с (BOUNDING_BOX=(0, -2, 1, 2))

-- работает
--DBCC ПРОВЕРКА БД

-- не удается
DBCC CHECKDB С РАСШИРЕННЫМИ_ЛОГИЧЕСКИМИ_ПРОВЕРКАМИ

Странно то, что, кажется, DBCC завершился без ошибок, но затем возникает серьезная ошибка:

CHECKDB обнаружил 0 ошибок распределения и 0 ошибок согласованности в базе данных «DbccCrashExample».
Сообщение 0, Уровень 11, Состояние 0, Строка 0
Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, следует отбросить.
Сообщение 0, Уровень 20, Состояние 0, Строка 0
Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, следует отбросить.

В журнале ошибок сервера SQL мы видим такой дамп стека:

SqlDumpExceptionHandler: Процесс 59 сгенерировал фатальное исключение c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server завершает этот процесс.                                                                                        
* *******************************************************************************                                
*                                                                                                                
* НАЧАТЬ СБОР СТЕКЛА:                                                                                              
* 20.11.11 13:23:34 spid 59                                                                                    
*                                                                                                                
*                                                                                                                
* Адрес исключения = 0000000000E84A8D Модуль(sqlservr+0000000000274A8D)                                       
* Код исключения = c0000005 EXCEPTION_ACCESS_VIOLATION                                                      
* Произошло нарушение прав доступа при чтении адреса 0000000000000000                                                   
* Входной буфер 408 байт -                                                                                       
* создать пространственный индекс SPATIAL_GeometryTable_Feature на dbo.Geo                                      
* metryTable(Feature) с (BOUNDING_BOX=(0, -2, 1, 2)) -- работает --DBCC                                       
* CHECKDB -- не удается выполнить DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS                                                   
*                                                                                          

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

решение1

Обновлять:

Исправление выпущено в Sql Server 2008 r2 sp1 cu4.

Накопительный пакет обновлений 4 для SQL Server 2008 R2 Service Pack 1

Более подробную информацию о проблеме можно найти здесь:

ИСПРАВЛЕНИЕ: Нарушение прав доступа при запуске команды DBCC CHECKDB для базы данных, содержащей таблицу с пространственным индексом в SQL Server 2008 или SQL Server 2008 R2

История:

Мы подали запрос в службу поддержки Microsoft по поводу этой проблемы. По-видимому, это известная проблема, которая была исправлена ​​в других версиях Sql Server (2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4) и будет исправлена ​​в Sql Server 2008R2 SP1 CU4 (sp1 Cumulative Update 4).

Поэтому на данный момент решением является не запускать «WITH EXTENDED_LOGICAL_CHECKS» или вообще пропустить «DBCC CHECKDB» до выхода накопительного обновления в середине декабря 2011 года.

Описание проблемы
-----------------------------

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS завершается с ошибкой ниже и генерирует дамп нарушения доступа

CHECKDB обнаружил 0 ошибок распределения и 0 ошибок согласованности в базе данных «AriesTempForEtlOnly».
Сообщение 0, Уровень 11, Состояние 0, Строка 0
Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, следует отбросить.
Сообщение 0, Уровень 20, Состояние 0, Строка 0
Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, следует отбросить

DBCC CHECKDB работает нормально, и когда вы удаляете пространственные индексы, похоже, все работает нормально.

Анализ
--------------------
-- Инструкция, которая натолкнулась на нарушение прав доступа

sqlservr!CScaOp_Identifier::Украсить+0x63:
00000000`00954a8d 488b01 mov rax,qword ptr [rcx] ds:00000000`00000000=????????????????

-- Стек потока, который столкнулся с AV
Сайт вызова Child-SP RetAddr
00000000`0e3d8dd0 00000000`01a40289 sqlservr!CScaOp_Identifier::Украсить+0x63
00000000`0e3d8e20 00000000`01a4007a sqlservr!CScaOp_Identifier::XRelBindSelf+0x16d
00000000`0e3d8eb0 00000000`01a3ccd9 sqlservr!CScaOpArg::XRelBind+0x62
00000000`0e3d8ee0 00000000`01a3cda2 sqlservr!XRelBindProjectList+0x8d
00000000`0e3d8f20 00000000`01a3d781 sqlservr!CRelOp_Project::XRelBind+0x56
00000000`0e3d8f90 00000000`01a3f877 sqlservr!CRelOp_Union::XRelBind+0xa5
00000000`0e3d8ff0 00000000`01a3f990 sqlservr!CRelOp_Query::XRelBind+0x27
00000000`0e3d9020 00000000`00d48d4b sqlservr!CRelOp_Query::XRelBindQuery+0xb4
00000000`0e3d91f0 00000000`008b37a5 sqlservr!CProchdr::FNormQuery+0x3a
00000000`0e3d9230 00000000`00876644 sqlservr!CProchdr::FNormalizeStep+0x13ae
00000000`0e3d9700 00000000`00877259 sqlservr!CSQLSource::FCompile+0xc99
00000000`0e3dbd20 00000000`008770fc sqlservr!CSQLSource::FCompWrapper+0xc1
00000000`0e3dbdf0 00000000`0074ac63 sqlservr!CSQLSource::Transform+0x4de
00000000`0e3dbeb0 00000000`00bce5c9 sqlservr!CSQLSource::Выполнить+0x449
00000000`0e3dbfe0 00000000`02418255 sqlservr!CSQLSource::SeExecute+0x17c
00000000`0e3dc0a0 00000000`028abc55 sqlservr!ExecXrel+0x1f1
00000000`0e3dc570 00000000`028ab7d5 sqlservr!CheckRowsetDiff::ExecuteXREL+0x195
00000000`0e3dc5f0 00000000`028ad41a sqlservr!CheckRowsetDiff::Execute+0x55
00000000`0e3dc630 00000000`028845eb sqlservr!RowsetDiffExecutor::Execute+0x386
00000000`0e3dd300 00000000`02882661 sqlservr!UtilDbccCheckDatabase+0x1a37
00000000`0e3de670 00000000`028bd0b0 sqlservr!DbccCheckDB+0x2bd
00000000`0e3de6d0 00000000`01bd50a2 sqlservr!DbccCommand::Выполнить+0xc8
00000000`0e3de7a0 00000000`00749a86 sqlservr!CStmtDbcc::XretExecute+0x8ce
00000000`0e3deb20 00000000`0074b4af sqlservr!CMsqlExecContext::ExecuteStmts+0x375
00000000`0e3dec30 00000000`0074ad6c sqlservr!CMsqlExecContext::FExecute+0x97e
00000000`0e3dedb0 00000000`0076cfa6 sqlservr!CSQLSource::Выполнить+0x7b5
00000000`0e3deee0 00000000`007965e2 sqlservr!process_request+0x64b
00000000`0e3df540 00000000`006eb450 sqlservr!process_commands+0x4e5
00000000`0e3df750 00000000`006eb116 sqlservr!SOS_Task::Param::Execute+0x12a
00000000`0e3df860 00000000`006eaf5b sqlservr!SOS_Scheduler::RunTask+0x96
00000000`0e3df8c0 00000000`008244fa sqlservr!SOS_Scheduler::ProcessTasks+0x128
00000000`0e3df930 00000000`008247dd sqlservr!SchedulerManager::WorkerEntryPoint+0x2d2
00000000`0e3dfa10 00000000`00c6c0cd sqlservr!SystemThread::RunWorker+0xcc
00000000`0e3dfa50 00000000`008253d2 sqlservr!SystemThreadDispatcher::ProcessWorker+0x2db
00000000`0e3dfb00 00000000`733037d7 sqlservr!SchedulerManager::ThreadEntryPoint+0x173
00000000`0e3dfba0 00000000`73303894 msvcr80!_callthreadstartex+0x17
00000000`0e3dfbd0 00000000`76cc652d msvcr80!_threadstartex+0x84
00000000`0e3dfc00 00000000`773bc521 kernel32!BaseThreadInitThunk+0xd
00000000`0e3dfc30 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
  • Запрос на исправление был подан для переноса с Kilimanjaro RTM CU11 на Kilimanjaro SP1CU4
  • Исключение нарушения прав доступа в CScaOp_Identifier::Decorate при запуске CheckTable для пространственного индекса.
  • Проблема возникает в строке кода функции CScaOp_Identifier::Decorate.
  • Здесь мы пытаемся разыменовать структуру pLR (LookupResult), но она установлена ​​в NULL.
  • Проблема исправлена ​​в следующих сборках: 2008 SP2 CU7, 2008 SP3 CU3, 2008R2 RTM CU11, 2008R2 SP1 CU4
  • Запрос на исправление был подан для переноса с Kilimanjaro RTM CU11 на Kilimanjaro SP1CU4

Связанный контент