Dieser Fehler tritt auf, wenn das Abrufen einer Zeile aus einer Datenseite durch das Angeben der Zeilen-ID (RID, Row-ID) gescheitert ist, weil die angefragte RID höher als die letzte RID auf der Seite war. Dies kann im Rahmen einer normalen Verarbeitung auftreten, wenn die Blattseite eines beschädigten und nicht gruppierten Index auf eine falsche oder nicht vorhandene RID auf einer Datenseite verweist.
Wenn der Fehler in einer Systemtabelle bei einem schreibgeschützten Vorgang auftritt, während andere Benutzer Systemtabellen aktualisieren (DDL ausführen), handelt es sich wahrscheinlich um einen vorübergehenden 624-Fehler und nicht um einen beschädigten Index. Um sicherzustellen, dass keine Beschädigung vorliegt, führen Sie DBCC CHECKTABLE ohne REPAIR-Klausel aus.
Der Wiederherstellungsvorgang hängt vom Zeitpunkt ab, zu dem der Fehler aufgetreten ist. Wenn das Problem weiterhin besteht, reichen die folgenden Vorgänge möglicherweise nicht zum Bereinigen der Indexbeschädigung aus. Wenden Sie sich in diesem Fall an den primären Anbieter für technischen Support. Halten Sie die Ausgabe von DBCC CHECKTABLE (wenn Sie eine mögliche Systemtabellenbeschädigung untersuchen) oder DBCC CHECKDB bereit.
Wenn der Fehler im Rahmen der normalen Verarbeitung auftrat
Führen Sie DBCC CHECKTABLE mit der REPAIR_REBUILD-Klausel aus. Wenn das Ausführen von DBCC CHECKTABLE mit der REPAIR_REBUILD-Klausel das Problem nicht löst, löschen Sie die betroffenen Indizes, und erstellen Sie sie neu.
Wichtig: Wenn das Ausführen von DBCC CHECKDB mit der REPAIR_REBUILD-Klausel das Indexproblem nicht korrigiert oder wenn Sie nicht sicher sind, welche Auswirkung DBCC CHECKDB mit der REPAIR_REBUILD-Klausel auf die Daten hat, wenden Sie sich an Ihren primären Anbieter für technischen Support.
Unbekannter Index, bekannte Abfrage
Dieses Problem lässt sich am schnellsten durch Ausführen von DBCC CHECKDB mit der REPAIR_REBUILD-Klausel lösen. Dadurch werden jegliche Indexbeschädigungen in der gesamten Datenbank behoben. Wenn die Datenbank so umfangreich ist, dass Sie DBCC CHECKDB nicht ausführen möchten, suchen Sie mithilfe dieser Anweisungen nach dem zu löschenden und neu zu erstellenden Index.
Wenn Sie zwar wissen, bei welcher Abfrage das Problem auftritt, aber den problemverursachenden Index nicht kennen, folgen Sie den unten angegebenen Anweisungen. Wenn Sie den Index oder die Abfrage nicht kennen, folgen Sie den Anweisungen im nächsten Abschnitt "Index und Abfrage unbekannt".
Bestimmen Sie, welcher Index gelöscht werden soll, indem Sie die Showplanausgabe für die fehlerbehaftete Abfrage lesen. Wenn Sie SET SHOWPLAN_TEXT und SET NOEXEC aktivieren und dann die fragliche Abfrage ausführen, gibt die Ausgabe an, welchen nicht gruppierten Index die Abfrage zum Zugreifen auf die fragliche Tabelle verwendet.
Beispiele:
USE pubs GO SET SHOWPLAN_TEXT ON GO SET NOEXEC ON GO SELECT title FROM titles WHERE title "Kochen" GO
Im Folgenden wird das Resultset aufgeführt:
StmtText----------------SET NOEXEC ON(1 Reihe(n) ist/sind betroffen)
StmtText----------------SELECT title FROM titles WHERE title "Kochen" (1 Reihe(n) ist/sind betroffen)
StmtText-------------|--Index Seek(OBJECT:([pubs].[dbo].[titles].[titleind]), SEEK:([titles].[title] ;[@1]) ORDERED FORWARD) (1 Reihe(n) ist/sind betroffen)
SET NOEXEC auf OFF und SET SHOWPLAN_TEXT TO OFF erneut: SET NOEXEC OFF GO SET SHOWPLAN_TEXT OFF GO
Löschen Sie den Index von Schritt 1, und erstellen Sie ihn neu (in diesem Beispiel titleind).
Index und Abfrage unbekannt
Wenn Sie weder den Index noch die Abfrage kennen, erstellen Sie alle nicht gruppierten Indizes in der Tabelle wie folgt:
Sehen Sie sich die Ausgabe an, die Sie mit DBCC CHECKDB erstellt haben, als Sie den Tabellennamen erhalten haben.
Wenn die Objekt-ID kleiner als 100 ist, können Sie die Indizes nicht löschen und neu erstellen. Fahren Sie nicht mit Schritt 2 oder 3 fort. Sie müssen die Datenbank von einer bekanntermaßen fehlerfreien Sicherung wiederherstellen.
Wenn die Objekt-ID 100 oder größer ist, fahren Sie mit Schritt 2 fort.
Listen Sie mithilfe von sp_helpindex sämtliche Indizes in der Tabelle auf, und erstellen Sie dann alle nicht gruppierten Indizes mit einer der folgenden Methoden neu:
Löschen Sie jeden nicht gruppierten Index in der Tabelle, und erstellen Sie ihn neu.
Wenn die Tabelle einen gruppierten Index aufweist, löschen Sie ihn, und erstellen Sie ihn neu. Dadurch werden alle nicht gruppierten Indizes automatisch neu erstellt. Bei einer großen Tabelle reicht dafür möglicherweise der Platz nicht aus. Im Allgemeinen muss das 1,2-fache der Tabelle an verfügbarem Platz vorhanden sein.
Nachdem der entsprechende Index neu erstellt wurde, führen Sie DBCC CHECKTABLE für die Tabelle aus, um sicherzustellen, dass das Problem gelöst wurde.
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>