MSSQLSERVER_7105

Применимо к:SQL Server

Сведения

Атрибут значение
Название продукта SQL Server
Идентификатор события 7105
Источник событий MSSQLSERVER
Компонент SQLEngine
Символическое имя TXT_PGNOTEXIST
Текст сообщения Идентификатор базы данных %d, страница %S_PGID, область памяти %d для узла типа данных LOB не существует. Обычно это вызвано тем, что транзакция выполняет считывание незафиксированных данных со страницы данных. Выполнение инструкции DBCC CHECKTABLE

Пояснение

Запрос может вернуть сообщение 7105, если не удается получить доступ к данным большого объекта (LOB), на который ссылается строка страницы в базе данных.

Так как эта ошибка имеет уровень серьезности 22, соединение завершается сервером. Это сообщение об ошибке также записывается в файл журнала ошибок SQL и в журнал событий приложений Windows с EventID=7105.

Возможные причины

Эта ошибка может возникать по одной из следующих причин:

  • Повреждена страница базы данных или структуры страницы LOB, на которые ссылается страница базы данных.
  • В запросе, который вызывает сбой, используется указание запроса READ UNCOMMITTED ISOLATION LEVEL или NOLOCK.
  • Проблема существует в подсистеме SQL Server, что приводит к сбою запроса с этой ошибкой.

Ознакомьтесь с разделами "Разрешение" и Дополнительные сведения, чтобы определить причину проблемы и соответствующее решение.

Действие пользователя

  1. Как указано в сообщении, сначала следует выполнить инструкцию DBCC CHECKDB применительно к базе данных или DBCC CHECKTABLE применительно к таблице, в которой возникла проблема.

    • Имя базы данных указано в сообщении.

    • Чтобы узнать, с какой таблицей связан сбой, не выполняя DBCC CHECKDB, необходимо выяснить, к каким таблицам обращался запрос. Одним из способов является использование профилировщика SQL для трассировки запроса. Однако в SQL Server 2008 (10.0.x) и SQL Server 2008 (10.0.x) R2 вы можете найти запрос с помощью сеанса расширенных событий system_health. Дополнительные сведения об использовании сеанса system_health см. в этой ссылке: использование сеанса system_health.

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

    • Однако если восстановление из резервной копии невозможно, следуйте рекомендациям по использованию DBCC CHECKDB или DBCC CHECKTABLE. Это может привести к потере данных. Дополнительные сведения об использовании CHECKDB и причинах повреждения базы данных см. в статье: устранение ошибок согласованности баз данных, сообщаемых DBCC CHECKDB.

  2. Эта ошибка могла возникнуть из-за того, что в запросе к таблице использовался уровень изоляции READ UNCOMMITTED или указание запроса NOLOCK (также известное как чтение "грязных" данных).

    • Если инструкция DBCC CHECKDB или DBCC CHECKTABLE не выводит ошибок, связанных с таблицей и данными LOB, наиболее вероятной причиной является чтение "грязных" данных. В этом случае необходимо либо избегать такого чтения, либо повторить запрос.

    • Если причина ошибки в этом, проблем с согласованностью базы данных нет.

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

Если причиной проблемы является повреждение базы данных, то команды DBCC CHECKDB и DBCC CHECKTABLE должны сообщать об ошибках. Однако они не будут выдавать сообщение 7105. Ошибки, выдаваемые инструкцией CHECKDB, зависят от того, что повреждено в ссылке на структуры LOB или в самих структурах LOB.

  • Если строка страницы базы данных некорректно ссылается на допустимую страницу LOB, могут возникать такие ошибки:

    Сообщение 8929, уровень 16, состояние 1, строка 1
    Идентификатор объекта 2137058649, идентификатор индекса 0, идентификатор секции 72057594038910976, идентификатор единицы выделения 72057594039828480 (введите данные в строке): ошибки, найденные в данных вне строки с идентификатором 131203072, принадлежащим записи данных, определенной RID = (1:179:1)
    Сообщение 8964, уровень 16, состояние 1, строка 1
    Ошибка таблицы: идентификатор объекта 2137058649, идентификатор индекса 0, идентификатор секции 72057594038910976, идентификатор единицы выделения 72057594039894016 (бизнес-данные типа). Отсутствует ссылка на узел внестрочных данных на странице (1:177), область памяти 1, идентификатор текста 131203072.
    Сообщение 8965, уровень 16, состояние 1, строка 1
    Ошибка таблицы: идентификатор объекта 2137058649, идентификатор индекса 0, идентификатор секции 72057594038910976, идентификатор единицы выделения 72057594039894016 (бизнес-данные типа). На узел внестрочных данных на странице (255:177), область памяти 1, идентификатор текста 131203072 имеется ссылка со страницы (1:179), область памяти 1, но он не виден при просмотре.

  • Различные сценарии могут приводить к разным сочетаниям ошибок. В этом примере:

    Страница базы данных 1:179 в области памяти 1 ссылается на страницу LOB, которая не является допустимой страницей в базе данных (страница 255:177). Страница (1:177) является допустимой страницей LOB, но на нее никогда не ссылалась ни одна страница базы данных. Поэтому в этой ситуации проблема в том, что строка в области памяти 1 страницы 1:179 ссылается на страницу 255:177 вместо 1:177.

  • Для определения того, связаны ли ошибки DBCC CHECKDB с проблемами на страницах LOB, в первую очередь необходимо обратить внимание на наличие фраз "внестрочные данные" и "тип данных LOB".

    Сообщение 8929 — это ошибка, связанная со страницей базы данных, ссылающейся на страницы LOB.
    Сообщение 8964 — это ошибка, указывающая на то, что на страницу LOB не ссылается ни одна страница базы данных.
    Сообщение 8965 — это ошибка, указывающая на то, что на страницу LOB, которая не является действительной, ссылается страница базы данных.

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

  • В приведенном здесь примере сообщения, возвращаемые CHECKTABLE при использовании REPAIR_ALLOW_DATA_LOSS, выглядят следующим образом.

    Исправление: удаленная запись для идентификатора объекта 2137058649, идентификатор индекса 0, идентификатор секции 72057594038910976, идентификатор единицы выделения 72057594039828480 (тип данных в строке), на странице (1:179), слот 1. Индексы будут перестроены.
    Исправление: удален столбец данных вне строки с идентификатором 131203072 для идентификатора объекта 2137058649, идентификатора индекса 0, идентификатора секции 72057594038910976, идентификатора единицы выделения 72057594039894016 (тип бизнес-данных) на странице (1:177), слот 1.
    Сообщение 8929, уровень 16, состояние 1, строка 1
    Идентификатор объекта 2137058649, идентификатор индекса 0, идентификатор секции 72057594038910976, идентификатор единицы выделения 72057594039828480 (введите данные в строке): ошибки, найденные в данных вне строки с идентификатором 131203072, принадлежащим записи данных, определенной RID = (1:179:1)
            Ошибка исправлена.
    Сообщение 8964, уровень 16, состояние 1, строка 1
    Ошибка таблицы: идентификатор объекта 2137058649, идентификатор индекса 0, идентификатор секции 72057594038910976, идентификатор единицы выделения 72057594039894016 (бизнес-данные типа). Отсутствует ссылка на узел внестрочных данных на странице (1:177), область памяти 1, идентификатор текста 131203072.
            Ошибка исправлена.
    Сообщение 8965, уровень 16, состояние 1, строка 1
    Ошибка таблицы: идентификатор объекта 2137058649, идентификатор индекса 0, идентификатор секции 72057594038910976, идентификатор единицы выделения 72057594039894016 (бизнес-данные типа). На узел внестрочных данных на странице (255:177), область памяти 1, идентификатор текста 131203072 имеется ссылка со страницы (1:179), область памяти 1, но он не виден при просмотре.
            Не удалось исправить эту ошибку.

    Последняя часть сообщения (Could not repair this error) вводит в заблуждение. Ошибка была исправлена, так как строка страницы базы данных, указывавшая на недопустимую страницу (255:177), была удалена.