web-dev-qa-db-ja.com

特定のページのデータベースを確認する方法

私はデータベースの修復に取り組んでおり、修正する必要のある約80個のエラーがあり、REPAIR_WITH_DATA_LOSSを実行する以外に、修正方法がわからない3種類の問題があるようです。

問題のない以前のバックアップがあり、ページレベルのリストアの実行について読みました。ただし、これまでのところ、SSMSとTSQLを使用することに失敗しています。 「良い」データベースにクエリを実行して、これらのページが含まれているかどうかを確認することはできますか?たとえば、ページ「1:10429855」を探すために何かを実行できますか?

また、同じページが何に関連付けられているか、または「不良」データベースにあるかを確認する方法はありますか?

テーブルエラー:オブジェクトID 0、インデックスID -1、パーティションID 0、割り当てユニットID -4342159331760996352(タイプ不明)、ページ(31205:-867600381)。テスト(IS_OFF(BUF_IOERR、pBUF-> bstat))が失敗しました。値は2057と-4です。

テーブルエラー:オブジェクトID 0、インデックスID -1、パーティションID 0、割り当てユニットID 6691734499630645248(タイプ不明)、ページ(23723:203812287)。テスト(IS_OFF(BUF_IOERR、pBUF-> bstat))が失敗しました。値は2057と-11です。

テーブルエラー:オブジェクトID 1518653945、インデックスID 1、パーティションID 72057594166444032、割り当てユニットID 71875645566156800(タイプLOBデータ)。ページ(1:10429953)、スロット0、テキストID 954357841920の行外データノードは、ページ(1:10429855)、スロット4で参照されていますが、スキャンでは見られませんでした。

オブジェクトID 1518653945、インデックスID 1、パーティションID 72057594166444032、割り当てユニットID 72057594253410304(行内データタイプ):RID =(1:10488687:10)で識別されるデータレコードが所有するID 954358824960の行外データでエラーが見つかりました

2
Thorin

SQLサーバーの特定のページに関する情報を取得するには、undocumentedDBCC PAGEコマンドを使用する必要があります。または、SQL Server 2012以降を使用している場合は、sys.dm_db_database_page_allocations DMVをクエリすることもできます。

ページの復元に関する問題については、Enterprise Editionを使用していない限り、ページの復元をオフラインで実行する必要があります。 (つまり、データベースをRECOVERしてはならず、NORECOVERYオプションを使用してログリストアまたはフルリストアを実行する必要があります。これにより、データベースはどちらのエディションでもページリストアが可能な状態になります)

これは、sys.dm_db_database_page_allocations DMVを紹介する簡単なブログ投稿です: SQL SERVER 2012 – sys.dm_db_database_page_allocations –動的管理関数

DBCC PAGEコマンドの概要については、Paul Randalのブログ投稿を参照してください。 DBCC PAGEの使用方法

EnterpriseおよびStandard Editionでページを復元する方法の概要: SQL Server StandardおよびEnterprise Editionでページを復元する方法

3