[Déconseillé] Impossible de récupérer la ligne de la page avec son RID car le numéro du RID demandé est supérieur au numéro du dernier RID de la page

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:

Résumé

Cette erreur se produit quand il est impossible de récupérer une ligne d'une page de données en spécifiant l'ID de ligne (RID) car le RID demandé est supérieur au dernier RID de la page. Ceci peut se produire au cours d'un traitement normal, si la page feuille d'un index non cluster pointe vers un RID incorrect ou inexistant dans une page de données.

Causes

Si l'erreur se produit dans une table système durant une opération en lecture seule alors que des utilisateurs mettent à jour des tables système (exécution de DDL), il s'agit probablement d'une erreur 624 temporaire et non d'un problème d'index endommagé. Pour vérifier l'absence de dommages, exécutez DBCC CHECKTABLE sans clause de réparation

Solutions

La procédure de récupération dépend du moment où l'erreur s'est produite. Si les problèmes persistent, les procédures ci-après risquent de ne pas suffire pour corriger l'index endommagé. Dans ce cas, contactez votre fournisseur de support principal. Gardez disponible la sortie de DBCC CHECKTABLE (pour vérifier si la table système n'est pas endommagée) ou de DBCC CHECKDB.

Si l'erreur s'est produite lors d'une phase normale de traitement

Exécutez DBCC CHECKTABLE avec la clause REPAIR_REBUILD. Si l'exécution de DBCC CHECKTABLE avec la clause REPAIR_REBUILD ne résout pas le problème, supprimez puis recréez les index affectés.

Important : Si le problème d'indexation n'est pas corrigé après l'exécution de DBCC CHECKDB avec la clause REPAIR_REBUILD ou si vous ignorez les conséquences sur vos données de l'exécution de DBCC CHECKDB avec la clause REPAIR_REBUILD, contactez votre fournisseur de support principal.

Index inconnu, requête connue

Le moyen le plus rapide pour résoudre ce problème consiste à exécuter DBCC CHECKDB avec la clause REPAIR_REBUILD. Cela permet de corriger les index endommagés dans l'ensemble de la base de données. Si vous ne voulez pas exécuter DBCC CHECKDB en raison de la taille trop importante de la base de données, utilisez ces instructions pour rechercher l'index spécifique à supprimer et à recréer.

Si vous ignorez quel est l'index à l'origine du problème mais si vous savez quelle est la requête concernée, suivez les instructions ci-dessous. Si vous ne connaissez pas l'index ni la requête, suivez les instructions situées sous la prochaine section, « Index et requête inconnus ».

Identifiez l'index à supprimer en examinant la sortie du plan de la requête où l'erreur s'est produite. Si vous affectez la valeur ON à SET SHOWPLAN_TEXT et à SET NOEXEC, puis si vous exécutez la requête en question, la sortie indique l'index non cluster utilisé par la requête pour accéder à la table correspondante.

Exemple :

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

Jeu de résultats obtenu :

StmtText----------------SET NOEXEC ON(1 ligne(s) affectée(s))

StmtText----------------SELECT title FROM titles WHERE title 'Cooking' (1 ligne(s) affectée(s))

StmtText-------------|--Index Seek(OBJECT:([pubs].[dbo].[titles].[titleind]), SEEK:([titles].[title] ;[@1]) ORDERED FORWARD) (1 ligne(s) affectée(s))

Affectez la valeur OFF à NOEXEC et à nouveau OFF à SHOWPLAN_TEXT : SET NOEXEC OFF GO SET SHOWPLAN_TEXT OFF GO

Supprimez et recréez l'index identifié au cours de l'étape 1 (dans cet exemple, titleind).

Index et requête inconnus

Si vous ne connaissez pas l'index ni la requête, reconstruisez tous les index non cluster de la table en procédant comme suit :

Examinez la sortie créée avec DBCC CHECKDB lorsque vous avez obtenu le nom de la table :

Si l'ID d'objet est inférieur à 100, vous ne pouvez pas supprimer et recréer les index. Ne passez pas aux étapes 2 ou 3. Vous devez restaurer la base de données à partir d'une sauvegarde saine.

Si l'ID d'objet est supérieur ou égal à 100, passez à l'étape 2.

Utilisez sp_helpindex pour répertorier tous les index de la table, puis reconstruisez tous les index non cluster en utilisant une des méthodes suivantes :

Supprimez et recréez chaque index non cluster de la table.

Si la table dispose d'un index ordonné en clusters, supprimez-le puis recréez-le. Cela entraîne la reconstruction automatique de tous les index non cluster. Si votre table est d'une taille importante, vous risquez de manquer d'espace pour pouvoir effectuer l'opération. En règle générale, l'espace disponible doit être égal à 1,2 fois la taille de la table.

Une fois l'index approprié recréé, exécutez DBCC CHECKTABLE sur la table pour vous assurer que le problème est résolu.

Paramètres remplaçables

Nom

Description

Valeur par défaut

Activé

Active ou désactive le flux de travail.

Non

Priorité

Définit la priorité de l'alerte.

1

Gravité

Définit la gravité de l'alerte.

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
Impossible de récupérer la ligne de la page avec son RID parce que le numéro du RID requis est supérieur au numéro du dernier RID de la page
{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>$Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>