[En desuso] No se puede obtener la fila de la página por RID, ya que el RID solicitado es superior al último de la página

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 (Rule)

Knowledge Base article:

Resumen

Este error se produce cuando hay un error al intentar recuperar una fila de una página de datos especificando el identificador de fila (RID) debido a que el RID solicitado tenía un número superior al último RID de la página. Esto puede ocurrir durante el procesamiento normal si la página hoja de un índice no agrupado dañado hace referencia a un RID incorrecto o que no existe en una página de datos.

Causas

Si el error se produce en una tabla de sistema durante una operación de solo lectura mientras otros usuarios están actualizando las tablas de sistema (ejecutando DDL), es probable que se trate de un error 624 transitorio (en lugar de un índice dañado). Para confirmar que no existen daños, ejecute DBCC CHECKTABLE sin una cláusula de reparación.

Soluciones

El procedimiento de recuperación depende de cuándo se ha producido el error. Si el problema persiste, puede que los siguientes procedimientos no sean suficientes para limpiar los daños del índice. En ese caso, póngase en contacto con el proveedor de soporte técnico principal. Tenga disponible la salida de DBCC CHECKTABLE (si investiga posibles daños en una tabla de sistema) o de DBCC CHECKDB para su revisión.

Si el error se produjo durante el procesamiento normal

Ejecute DBCC CHECKTABLE con la cláusula REPAIR_REBUILD. Si la ejecución de DBCC CHECKTABLE con la cláusula REPAIR_REBUILD no soluciona el problema, quite los índices afectados y vuelva a crearlos.

Importante: Si al ejecutar DBCC CHECKDB con la cláusula REPAIR_REBUILD no se corrige el problema del índice o si no está seguro del efecto que puede tener DBCC CHECKDB en sus datos con la cláusula REPAIR_REBUILD, póngase en contacto con el proveedor de soporte técnico principal.

Índice desconocido y consulta conocida

La forma más rápida de solucionar este problema es ejecutar DBCC CHECKDB con la cláusula REPAIR_REBUILD. Esto corrige los daños en los índices de toda la base de datos. Si la base de datos en tan grande que no desea ejecutar DBCC CHECKDB, utilice estas instrucciones para buscar el índice específico que se debe quitar y volver a crear.

Si no sabe qué índice está provocando el problema pero sabe qué consulta lo detecta, siga estas instrucciones. Si no conoce el índice ni la consulta, siga las instrucciones de la siguiente sección, "Índice y consulta desconocidos".

Para determinar qué índice se debe quitar, lea la salida del plan de presentación correspondiente a la consulta que detecta el error. Si establece el valor ON para SET SHOWPLAN_TEXT y para SET NOEXEC y, después, ejecuta la consulta en cuestión, la salida indica qué índice no clúster está usando la consulta para obtener acceso a la tabla.

Por ejemplo:

USE pubs GO SET SHOWPLAN_TEXT ON GO SET NOEXEC ON GO SELECT title FROM titles WHERE title 'Cocina' GO

El conjunto de resultados es el siguiente:

StmtText----------------SET NOEXEC ON(1 línea(s) afectada(s))

StmtText----------------SELECT title FROM titles WHERE title 'Cocina' (1 línea(s) afectada(s))

StmtText-------------|--Index Seek(OBJECT:([pubs].[dbo].[titles].[titleind]), SEEK:([titles].[title] ;[@1]) ORDERED FORWARD) (1 línea(s) afectada(s))

Vuelva a establecer el valor OFF para SET NOEXEC y SET SHOWPLAN_TEXT: SET NOEXEC OFF GO SET SHOWPLAN_TEXT OFF GO

Quite el índice identificado en el primer paso (en este ejemplo titleind) y vuelva a crearlo.

Índice y consulta desconocidos

Si no conoce el índice ni la consulta, vuelva a generar todos los índices no agrupados de la tabla como sigue:

Consulte la salida generada mediante DBCC CHECKDB al obtener el nombre de la tabla:

Si el id. de objeto es inferior a 100, no puede quitar y volver a crear los índices. No continúe con los pasos 2 o 3. Debe restaurar la base de datos a partir de una copia de seguridad limpia conocida.

Si el id. de objeto es 100 o superior, continúe con el paso 2.

Use sp_helpindex para obtener una lista de todos los índices de la tabla y, después, vuelva a generar todos los índices no agrupados con uno de estos métodos:

Quite todos los índices no clúster de la tabla y vuelva a crearlos.

Si la tabla dispone de un índice clúster, quítelo y vuelva a crearlo. Esto hace que todos los índices no clúster se reconstruyan de forma automática. Si la tabla es extensa, puede que no disponga de espacio para hacerlo. Normalmente, debe haber disponible una cantidad de espacio similar a 1,2 veces el tamaño de la tabla.

Después de haber vuelto a crear el índice apropiado, ejecute DBCC CHECKTABLE en la tabla para confirmar que se ha solucionado el problema.

Parámetros invalidables

Nombre

Descripción

Valor predeterminado

Habilitado

Habilita o deshabilita el flujo de trabajo.

No

Prioridad

Define la prioridad de la alerta.

1

Gravedad

Define la gravedad de la alerta.

2

Element properties:

TargetMicrosoft.SQLServer.2008.DBEngine
CategoryEventCollection
EnabledFalse
Event_ID624
Event Source$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$
Alert GenerateTrue
Alert SeverityError
Alert PriorityNormal
RemotableTrue
Alert Message
No se puede obtener la fila de la página por RID, ya que el RID solicitado es superior al último de la página
{0}
Event LogApplication
CommentMom2008ID='{B490F74B-6850-44E0-AB8A-3E86B10D96F2}';MOM2008GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}

Member Modules:

ID Module Type TypeId RunAs 
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ DataSource Microsoft.Windows.EventProvider Microsoft.SQLServer.SQLDefaultAccount
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<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>Event ID: $Data/EventDisplayNumber$. $Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>