Cette erreur se produit lorsqu'il est impossible de récupérer une ligne d'une page de données en spécifiant l'identificateur de ligne (RID), car le numéro du RID demandé est supérieur au dernier RID de la page. Cela peut se produire durant une phase normale de traitement, si la page de feuille d'un index non cluster pointe vers un RID incorrect ou inexistant dans une page de données.
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
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 les dommages de l'index. Dans ce cas, contactez le Support Technique. Examinez 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é lors de 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 d'assistance 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 OFF à SHOWPLAN_TEXT une nouvelle fois : 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 procédant de l'une des manières 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.
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>