要求された RID がページの最後の RID よりも大きい数値であるため、RID を使ってページから行を取得できませんでした : 非推奨

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:

概要

このエラーは、行 ID (RID) を指定してデータ ページから行を取得しようとしたとき、要求した RID がページ上の RID より大きい数値だったために失敗した場合に発生します。これは、通常の処理中でも、破損したクラスター化されていないインデックスのリーフ ページが無効な RID やデータ ページに存在しない RID を指し示している場合に発生することがあります。

原因

他のユーザーが (DDL を実行して) システム テーブルを更新しているときに、読み取り専用操作でシステム テーブルにエラーが発生した場合は、(インデックスの破損ではなく) 一時的な 624 エラーである可能性があります。破損がないことを確認するには、修復句を使用せずに DBCC CHECKTABLE を実行します。

解決方法

復旧手順はエラーの発生した時点によって異なります。問題が解決しない場合、次の手順だけではインデックスの破損を完全には解消できない可能性があります。この場合は、サポート提供元にお問い合わせください。DBCC CHECKTABLE (システム テーブル破損の可能性を調べる場合) または DBCC CHECKDB を実行して、結果を取得します。

通常の処理中にエラーが発生した場合

REPAIR_REBUILD 句を使用した DBCC CHECKTABLE を実行します。REPAIR_REBUILD 句を使用した DBCC CHECKTABLE を実行しても問題が解決しない場合は、影響を受けたインデックスを削除して作成し直します。

重要: REPAIR_REBUILD 句を指定して DBCC CHECKDB を実行してもインデックスの問題が解決しない場合や、REPAIR_REBUILD 句を指定した DBCC CHECKDB がデータにどのような影響を与えるかわからない場合は、サポート提供元にお問い合わせください。

インデックスがわからずクエリがわかっている場合

この問題を最も早く解決する方法は、REPAIR_REBUILD 句を使用した DBCC CHECKDB を実行することです。これによって、データベース全体のインデックスの破損が修正されます。データベースが大きいため DBCC CHECKDB を実行したくない場合は、次の指示に従って、削除して作成し直す特定のインデックスを見つけます。

問題の原因となっているインデックスがわからず、問題が起きているクエリがわかっている場合は、次の指示に従います。インデックスまたはクエリがわからない場合は、後の「インデックスとクエリが両方ともわからない場合」の指示に従います。

エラーが発生したクエリのプラン表示の結果を見て、削除する必要があるインデックスを特定します。SHOWPLAN_TEXT を ON に、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 行処理されました)

StmtText----------------SELECT title FROM titles WHERE title 'Cooking' (1 行処理されました)

ステートメント テキスト-------------|--Index Seek(OBJECT:([pubs].[dbo].[titles].[titleind]), SEEK:([titles].[title] ;[@1]) ORDERED FORWARD) (1 行が影響を受ける)

SET NOEXEC to OFF and SET SHOWPLAN_TEXT TO OFF again: SET NOEXEC OFF GO SET SHOWPLAN_TEXT OFF GO

手順 1 で識別したインデックス (この例では titleind) を削除して作成し直します。

インデックスとクエリが両方ともわからない場合

インデックスやクエリがわからない場合は、次のようにテーブル上のすべての非クラスター化インデックスを再構築します。

テーブル名を取得したときに DBCC CHECKDB で作成された結果を調べます。

オブジェクト ID が 100 未満の場合は、インデックスの削除や再作成はできません。手順 2. または 3. に進まないでください。既知のクリーン バックアップを使用してデータベースを復元する必要があります。

オブジェクト ID が 100 以上の場合は、手順 2 に進みます。

sp_helpindex を使用してテーブル上のすべてのインデックスを一覧表示し、次のいずれかの方法を使用して、すべてのクラスター化されていないインデックスを再構築します。

テーブル上の個々の非クラスター化インデックスを削除して作成し直します。

テーブルにクラスター化されたインデックスがある場合は、それを削除して作成し直します。これによって、すべてのクラスター化されていないインデックスが自動的に再構築されます。テーブルが大きい場合は、これを実行するための領域がない可能性があります。一般に、テーブル サイズの 1.2 倍を使用する必要があります。

該当するインデックスを再作成したら、テーブルに対して DBCC CHECKTABLE を実行し、問題が解決したことを確認します。

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
要求された RID がページの最後の RID よりも大きい数値であるため、RID を使ってページから行を取得できませんでした
{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>