Поделиться через


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

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

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

Симптомы

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

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 и эти диагностика были частью продукта. Эти возможности предназначены для обнаружения внешних проблем ввода-вывода и устранения неполадок, описанных в разделе "Симптомы ".

Если вы получаете сообщения об ошибках, перечисленные в разделе "Симптомы" , и они не объясняются событием, например сбоем физического диска, просмотрите все известные проблемы с 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 сообщает о внешней проблеме с операционной системой, драйвером или аппаратными слоями.

Если ошибка 3448 возникает при попытке отката транзакции с ошибкой 605 или 823, экземпляр 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

Операторы SQL Server sort выполняют операции ввода-вывода, обычно в 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 Требования к входным и выходным данным.