SQL Server диагностика обнаруживает незарегистрированные проблемы ввода-вывода из-за устаревших операций чтения или потери операций записи

В этой статье объясняется, как диагностика SQL Server помогает обнаруживать незарегистрированные проблемы ввода или вывода, возникающие из-за устаревших операций чтения или потери операций записи.

Оригинальная версия продукта: SQL Server
Исходный номер базы знаний: 826433

Симптомы

Если проблемы с операционной системой, драйвером или оборудованием приводят к потере операций записи или устаревшим условиям чтения в пути ввода-вывода, в SQL Server могут отображаться сообщения об ошибках, связанных с целостностью данных, например ошибки 605, 823, 3448 и 3456. Вы можете получать сообщения об ошибках, аналогичные следующим примерам:

2003-07-24 16:43:04.57 spid63 Getpage: bstat=0x9, sstat=0x800, cache
2003-07-24 16:43:04.57 spid63 pageno is/should be: objid is/should be:
2003-07-24 16:43:04.57 spid63 (1:7040966)/(1:7040966) 2093354622/2039782424
2003-07-24 16:43:04.57 spid63 ... IAM indicates that page is allocated to this object
2003-07-24 16:52:37.67 spid63 Error: 605, Severity: 21, State: 1
2003-07-24 16:52:37.67 spid63 Attempt to fetch logical page (1:7040966) in database 'pubs' belongs to object 'authors', not to object 'titles'..
2003-07-24 16:52:40.99 spid63 Error: 3448, Severity: 21, State: 1
2003-07-24 16:52:40.99 spid63 Could not undo log record (63361:16876:181), for transaction ID (0:159696956), on page (1:7040977), database 'pubs' (database ID 12). Page information: LSN = (63192:958360:10), type = 2. Log information: OpCode = 2, context 1..
2003-07-09 14:31:35.92 spid66 Error: 823, Severity: 24, State: 2
2003-07-09 14:31:35.92 spid66 I/O error (bad page ID) detected during read at offset 0x00000016774000 in file 'h:\sql\MSSQL\data\tempdb.mdf'..
2010-02-06 15:57:24.14 spid17s Error: 3456, Severity: 21, State: 1.
2010-02-06 15:57:24.14 spid17s Could not redo log record (58997:5252:28), for transaction ID (0:109000187), on page (1:480946), database 'MyDatabase' (database ID 17). Page: LSN = (58997:5234:17), type = 3. Log: OpCode = 2, context 5, PrevPageLSN: (58997:5243:17). Restore from a backup of the database, or repair the database.

Новые возможности диагностики ввода-вывода в SQL Server

SQL Server появились новые возможности диагностики операций ввода-вывода, начиная с SQL Server 2000 с пакетом обновления 4 (SP4), и с тех пор эти диагностика стали частью продукта. Эти возможности предназначены для обнаружения внешних проблем, связанных с вводом-выводом, и устранения неполадок с сообщениями об ошибках, описанными в разделе "Симптомы ".

Если вы получаете какие-либо сообщения об ошибках, перечисленные в разделе "Симптомы", и они не объясняются таким событием, как сбой физического диска, просмотрите все известные проблемы с SQL Server, операционной системой, драйверами и оборудованием. В диагностика попытаться предоставить сведения о следующих двух условиях:

  • Потерянная запись. Успешный вызов API WriteFile, но операционная система, драйвер или контроллер кэширования неправильно сбрасывают данные на физический носитель, даже если SQL Server сообщает, что запись прошла успешно.

  • Устаревшее чтение. Успешный вызов API ReadFile, но операционная система, драйвер или контроллер кэширования неправильно возвращает старую версию данных.

Чтобы проиллюстрировать, корпорация Майкрософт подтвердила сценарии, в которых вызов API WriteFile возвращает состояние успешного выполнения, но при немедленном успешном чтении того же блока данных возвращаются старые данные, включая данные, которые, вероятно, хранятся в аппаратном кэше чтения. Иногда эта проблема возникает из-за проблемы с кэшем чтения. В других случаях данные записи никогда не записываются на физический диск.

Включение диагностика

В SQL Server 2017 и более поздних версиях эта возможность диагностики включена по умолчанию. В SQL Server 2016 и более ранних версиях эти диагностика можно включить только с помощью флага трассировки 818. Можно указать флаг трассировки 818 в качестве параметра запуска -T818 для экземпляра SQL Server или выполнить следующую инструкцию T-SQL, чтобы включить их во время выполнения:

DBCC TRACEON(818, -1)

Флаг трассировки 818 включает кольцевой буфер в памяти, который используется для отслеживания последних 2048 успешных операций записи, выполняемых компьютером под управлением SQL Server, не включая операции сортировки и ввода-вывода рабочих файлов. При возникновении таких ошибок, как 605, 823 или 3448, значение последовательного номера журнала (LSN) входящего буфера сравнивается со списком последней записи. Если номер LSN, полученный во время операции чтения, старше, чем используемый в операции записи, новое сообщение об ошибке регистрируется в журнале ошибок SQL Server. Большинство операций записи SQL Server выполняются в виде контрольных точек или отложенных операций записи (отложенная запись — фоновая задача, использующая асинхронный ввод-вывод). Реализация кольцевого буфера является упрощенной, а влияние на производительность системы незначительно.

Сведения о сообщении в журнале ошибок

В следующем сообщении не отображаются явные ошибки из API WriteFile или вызовов API ReadFile, которые SQL Server. Вместо этого отображается логическая ошибка ввода-вывода, которая возникла при проверке LSN и ее ожидаемое значение было неправильным:

Начиная с SQL Server 2005 г., отображается следующее сообщение об ошибке:

SQL Server обнаружена ошибка ввода-вывода на основе логической согласованности: устаревшее чтение. Это произошло во время <Read/Write> страницы <PAGEID> в идентификаторе <DBID> базы данных со смещением <PHYSICAL OFFSET> в файле <FILE NAME>. Дополнительные сведения в журнале ошибок SQL Server или системном журнале событий могут содержать дополнительные сведения. Это серьезное состояние ошибки, которое угрожает целостности базы данных и должно быть немедленно исправлено. Выполните полную проверка согласованности базы данных (DBCC CHECKDB). Эта ошибка может быть вызвана многими факторами. Дополнительные сведения см. в SQL Server электронной документации.

Дополнительные сведения об ошибке 824 см. в разделе MSSQLSERVER_824.

На момент или сообщения об этой ошибке кэш чтения содержит более старую версию страницы, или данные были неправильно записаны на физический диск. В любом случае (потерянная запись или устаревшее чтение) SQL Server сообщает о внешней проблеме с операционной системой, драйвером или аппаратными уровнями.

Если при попытке отката транзакции с ошибкой 605 или 823 возникает ошибка 3448, экземпляр SQL Server автоматически закрывает базу данных и пытается открыть и восстановить ее. Первая страница с ошибкой 605 или 823 считается неправильной страницей, а идентификатор страницы сохраняется компьютером, работающим SQL Server. Во время восстановления (до этапа повтора), когда считывается недопустимый идентификатор страницы, основные сведения о заголовке страницы регистрируются в журнале ошибок SQL Server. Это действие важно, так как оно помогает различать сценарии потерянной записи и устаревшего чтения.

Поведение, наблюдаемое при устаревших операциях чтения и потерянных операций записи

В устаревших сценариях чтения могут отображаться следующие два распространенных поведения:

  • Если файлы базы данных закрыты, а затем открыты, во время восстановления возвращаются правильные и последние записанные данные.

  • Когда вы создаете контрольную точку и выполняете инструкцию DBCC DROPCLEANBUFFERS (чтобы удалить все страницы базы данных из памяти), а затем выполняете DBCC CHECKDB инструкцию в базе данных, возвращаются последние записанные данные.

Поведение, описанное в предыдущем абзаце, указывает на проблему кэширования чтения, и часто решается путем отключения кэша чтения. Действия, описанные в предыдущем абзаце, обычно принудительно делают кэш недействительным, а успешные операции чтения показывают, что физический носитель обновлен правильно. Потерянное поведение записи возникает, когда страница, считываемая обратно, по-прежнему является старой версией данных, даже после принудительного сброса механизмов кэширования.

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

Описание различных сценариев устаревших операций чтения и потерянных операций записи

Корпорация Майкрософт также отметила условия, которые не соответствуют критериям ошибки 605 или 823, но вызваны тем же устаревшим действием чтения или потери записи. В некоторых случаях страница обновляется дважды, но с тем же значением LSN. Такое поведение может произойти, если идентификатор объекта и идентификатор страницы правильные (страница уже выделена для объекта), а на странице внесены изменения и сбрасываются на диск. При извлечении следующей страницы возвращается более старое изображение, а затем выполняется второе изменение. Журнал транзакций SQL Server показывает, что страница была дважды обновлена с тем же значением LSN. Это действие становится проблемой при попытке восстановить последовательность журнала транзакций или с проблемами согласованности данных, такими как сбои внешнего ключа или отсутствующие записи данных. В следующем сообщении об ошибке показан один из примеров этого условия:

Ошибка: 3456, серьезность: 21, состояние: 1 Не удалось повторить запись журнала (276666:1664:19), для идентификатора транзакции (0:825853240), на странице (1:1787100), базы данных "авторы" (7). Страница: LSN = (276658:4501:9), введите = 1. Журнал: OpCode = 4, контекст 2, PrevPageLSN: (275565:3959:31)..

Некоторые сценарии более подробно описаны в следующих списках:

LSN SequenceAction
1   Checkpoint
2   Begin Transaction
3   Table created or truncated
4   Inserts (Pages allocated)
5   Newly allocated page written to disk by Lazy Writer
6   Select from table - Scans IAM chain, newly allocated page read back from disk (LRU | HASHED = 0x9 in getpage message), encounters Error 605 - Invalid Object ID
7   Rollback of transaction initiated
LSN SequenceAction
1   Checkpoint
2   Begin Transaction
3   Page Modification
4   Page written to disk by Lazy Writer
5   Page read in for another modification (stale image returned)
6   Page Modified for a second time but because of stale image does not see first modification 
7   Rollback - Fails - Transaction Log shows two different log records with the same PREV LSN for the page

sort операторы SQL Server выполняют операции ввода-вывода, как правило, в tempdb базе данных. Эти операции ввода-вывода похожи на операции буферного ввода-вывода; однако они уже разработаны для использования логики повторных попыток чтения, чтобы попытаться устранить аналогичные проблемы. Дополнительные диагностика, описанные в этой статье, не применяются к этим операциям ввода-вывода.

Корпорация Майкрософт отметила, что первопричиной следующих ошибок чтения сортировки, как правило, является устаревшее чтение или потеря записи:

2003-04-01 20:13:31.38 spid122 SQL Server Assertion: File: <p:\sql\ntdbms\storeng\drs\include\record.inl>, line=1447 Failed Assertion = 'm_SizeRec > 0 && m_SizeRec <= MAXDATAROW'.
2003-03-29 09:51:41.12 spid57 Sort read failure (bad page ID). pageid = (0x1:0x13e9), dbid = 2, file = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf. Retrying.
2003-03-29 09:51:41.13 spid57 Error: 823, Severity: 24, State: 7
2003-03-29 09:51:41.13 spid57 I/O error (bad page ID) detected during read at offset 0x000000027d2000 in file 'e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf'..
* 00931097 Module(sqlservr+00531097) (utassert_fail+000002E3)
* 005B1DA8 Module(sqlservr+001B1DA8) (RecBase::Resize+00000091)
* 00407EE7 Module(sqlservr+00007EE7) (RecBase::LocateColumn+00000012)
* 00852520 Module(sqlservr+00452520) (mergerow+000000A4)
* 008522B3 Module(sqlservr+004522B3) (merge_getnext+00000285)
* 0085207D Module(sqlservr+0045207D) (mergenext+0000000D)
* 004FC5FB Module(sqlservr+000FC5FB) (getsorted+00000021)

Так как устаревшее чтение или потеря записи приводит к хранилищу данных, которое не ожидается, может возникнуть широкий спектр вариантов поведения. Он может отображаться как отсутствующие данные, но некоторые из наиболее распространенных последствий отсутствующих данных отображаются в виде повреждений индекса, таких как ошибка 644 или 625:

Ошибка 644 Уровень серьезности 21 Текст сообщения Не удалось найти запись индекса для RID "%.*hs" на странице индекса %S_PGID, идентификатор индекса %d, база данных "%.*ls".

Ошибка 625 Уровень серьезности 21 Текст сообщения Не удается извлечь строку со страницы %S_PGID с помощью RID, так как идентификатор слота (%d) недопустим.

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

Важно!

Если у вас возникает какое-либо поведение или вы подозреваете аналогичные проблемы вместе с отключением механизмов кэширования, корпорация Майкрософт настоятельно рекомендует получить последнее обновление для SQL Server. Корпорация Майкрософт также настоятельно рекомендует выполнять строгую проверку операционной системы и связанных с ней конфигураций.

Обратите внимание, что корпорация Майкрософт подтвердила, что при редких и тяжелых нагрузках ввода-вывода некоторые аппаратные платформы могут возвращать устаревшее чтение. Если расширенный диагностика указывает на возможное устаревшее условие чтения или потери записи, обратитесь к поставщику оборудования, чтобы немедленно выполнить дальнейшие действия и протестировать с помощью программы SQLIOSim.

SQL Server требуется, чтобы системы поддерживали гарантированную доставку на стабильный носитель, как описано в SQL Server требований к программе надежности операций ввода-вывода. Дополнительные сведения о требованиях к входным и выходным данным для ядра СУБД SQL Server см. в разделе требования к входным и выходным данным ядро СУБД Microsoft SQL Server.