Эта ошибка возникает при сбое попытки извлечения строки со страницы данных по указанному идентификатору строки (RID), вызванном тем, что номер запрошенного RID превышает номер последнего RID на странице. Это может произойти во время обычной обработки, если конечная страница поврежденного некластеризованного индекса указывает на неверный или несуществующий RID на странице данных.
Если эта ошибка возникает в системной таблице во время операции «только для чтения», когда другие пользователи обновляют системные таблицы (выполняя DDL), то это, скорее всего, кратковременная ошибка 624 (а не поврежденный индекс). Чтобы убедиться в отсутствии повреждений, выполните инструкцию DBCC CHECKTABLE без предложения восстановления.
Процедура восстановления зависит от возникшей ошибки. Если ошибка повторяется, то следующих процедур может оказаться недостаточно для очистки повреждения индекса. В этом случае обратитесь к своему основному поставщику услуг технической поддержки. Обеспечьте доступность выходных данных инструкции DBCC CHECKTABLE (при изучении возможного повреждения системной таблицы) или DBCC CHECKDB для просмотра.
Если данная ошибка возникла во время обычной обработки,
выполните инструкцию DBCC CHECKTABLE без предложения REPAIR_REBUILD. Если выполнение инструкции DBCC CHECKTABLE с предложением REPAIR_REBUILD не устраняет проблему, удалите и заново создайте пострадавшие индексы.
Внимание! Если выполнение инструкции DBCC CHECKDB с предложением REPAIR_REBUILD не устраняет проблему с индексом или если есть сомнения в том, какое действие инструкция DBCC CHECKDB с предложением REPAIR_REBUILD окажет на данные, обратитесь к своему основному поставщику услуг технической поддержки.
Неизвестный индекс, известный запрос
Наиболее быстрым способом разрешения данной проблемы является выполнение инструкции DBCC CHECKDB с предложением REPAIR_REBUILD. В этом случае устраняются любые повреждения индексов во всей базе данных. Если база данных так велика, что выполнение инструкции DBCC CHECKDB нецелесообразно, используйте эти инструкции для обнаружения конкретного индекса, который нужно удалить и создать заново.
Если неизвестно, какой индекс вызывает проблему, но известен обнаруживший ее запрос, то следуйте приведенным ниже инструкциям. Если неизвестен такой индекс или запрос, то следуйте инструкциям, приведенным в разделе «Если неизвестны и индекс и запрос».
Определите индекс, который необходимо удалить, считывая выходные данные Showplan для запроса, обнаружившего данную ошибку. Если в SET SHOWPLAN_TEXT задать ON, в SET NOEXEC задать ON, а затем выполнить данный запрос, то в выходных данных должно указываться, какой некластеризованный индекс используется запросом для доступа к указанной таблице.
Например:
USE pubs GO SET SHOWPLAN_TEXT ON GO SET NOEXEC ON GO SELECT title FROM titles WHERE title 'Cooking' GO
Результирующий набор:
StmtText----------------SET NOEXEC ON(1 row(s) affected)
StmtText----------------SELECT title FROM titles WHERE title 'Cooking' (1 row(s) affected)
StmtText-------------|--Index Seek(OBJECT:([pubs].[dbo].[titles].[titleind]), SEEK:([titles].[title] ;[@1]) ORDERED FORWARD) (1 row(s) affected)
SET NOEXEC to OFF and SET SHOWPLAN_TEXT TO OFF again: SET NOEXEC OFF GO SET SHOWPLAN_TEXT OFF GO
Удалите и заново создайте индекс, идентифицированный на шаге 1 (в этом примере titleind).
Если неизвестны и индекс и запрос
Если неизвестен индекс или запрос, то требуется заново создать все некластеризованные индексы в данной таблице (см. ниже).
После получения имени таблицы просмотрите выходные данные инструкции DBCC CHECKDB.
Если идентификатор объекта меньше 100, то данные индексы не могут быть удалены и заново созданы. Не приступайте к выполнению шага 2 или 3. Необходимо восстановить базу данных из безошибочной резервной копии.
Если идентификатор объекта равен 100 или больше, продолжите выполнение шага 2.
С помощью процедуры sp_helpindex перечислите все индексы в таблице, а затем заново создайте все некластеризованные индексы, используя один из следующих методов.
Удалите и заново создайте каждый некластеризованный индекс в таблице.
Если в таблице есть кластеризованный индекс, удалите и создайте его заново. В этом случае все некластеризованные индексы создаются заново автоматически. Если таблица велика, то для выполнения этого может оказаться недостаточно места. Обычно требуется, чтобы было доступно 120 % от размера таблицы.
После повторного создания подходящего индекса выполните инструкцию DBCC CHECKTABLE в данной таблице, чтобы подтвердить разрешение проблемы.
Target | Microsoft.SQLServer.2008.DBEngine | ||
Category | EventCollection | ||
Enabled | False | ||
Event_ID | 624 | ||
Event Source | $Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$ | ||
Alert Generate | True | ||
Alert Severity | Error | ||
Alert Priority | Normal | ||
Remotable | True | ||
Alert Message |
| ||
Event Log | Application | ||
Comment | Mom2008ID='{B490F74B-6850-44E0-AB8A-3E86B10D96F2}';MOM2008GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74} |
ID | Module Type | TypeId | RunAs |
---|---|---|---|
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ | DataSource | Microsoft.Windows.EventProvider | Microsoft.SQLServer.SQLDefaultAccount |
GenerateAlert | WriteAction | System.Health.GenerateAlert | Default |
<Rule ID="Microsoft.SQLServer.2008.Could_not_retrieve_row_from_page_by_RID_because_the_requested_RID_has_a_higher_number_than_the_last_RID_on_the_page_1_5_Rule" Target="SQL2008Core!Microsoft.SQLServer.2008.DBEngine" Enabled="false" ConfirmDelivery="true" Remotable="true" Comment="Mom2008ID='{B490F74B-6850-44E0-AB8A-3E86B10D96F2}';MOM2008GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Windows!Microsoft.Windows.EventProvider" RunAs="SQL!Microsoft.SQLServer.SQLDefaultAccount">
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<LogName>Application</LogName>
<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>PublisherName</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>EventDisplayNumber</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>624</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</And>
</Expression>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="SystemHealth!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>2</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.2008.Could_not_retrieve_row_from_page_by_RID_because_the_requested_RID_has_a_higher_number_than_the_last_RID_on_the_page_1_5_Rule.AlertMessage"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>$Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>