web-dev-qa-db-ja.com

データベースページを破損して同じものを再び復元する方法

データベースページを破損し、同じページを復元したい。

それ、どうやったら出来るの?

4
AMIT

この質問が大好きです!

デモを行うには、 Stack Overflow データダンプからFitnessデータベースのローカルコピーを使用します。

まず、データベースが完全に回復していることを確認し、完全なログバックアップを作成します。

BACKUP DATABASE [FITNESS] 
TO  DISK = N'D:\Backup\FITNESS.bak' 
WITH FORMAT, INIT, STATS = 1, COMPRESSION, CHECKSUM
GO

BACKUP LOG [FITNESS] 
TO  DISK = N'D:\Backup\FITNESS.trn' 
WITH FORMAT, INIT, STATS = 1, COMPRESSION, CHECKSUM
GO

次に、データベースにアクセスし、ページを取得して破損させます。このクエリは2012 plusで使用できるはずです。 DBCC WRITEPAGEでシンプルなダイナミックブロックを作成します

USE FITNESS

SELECT TOP 1
    N'DBCC WRITEPAGE (' 
  + CAST([dddpa].[database_id] AS NVARCHAR(10)) + N', '
  + CAST([dddpa].[allocated_page_file_id] AS NVARCHAR(10)) + N', '
  + CAST([dddpa].[allocated_page_page_id] AS NVARCHAR(10)) + N', ' 
  + N'0' + N', ' 
  + N'4' + N', ' 
  + N'0x0000008A' 
  + N', 1) WITH NO_INFOMSGS' AS [cmd]
FROM
    [sys].[dm_db_database_page_allocations](DB_ID(), NULL, NULL, NULL, 'DETAILED') AS [dddpa]
WHERE [dddpa].[allocated_page_page_id] > 250;

その後、データベースをSINGLE_USERに設定し、ページを破損する必要があります

ALTER DATABASE FITNESS SET SINGLE_USER WITH ROLLBACK IMMEDIATE

DBCC WRITEPAGE ( INSERT YOUR DBCC WRITEPAGE COMMAND HERE )

ALTER DATABASE FITNESS SET MULTI_USER WITH ROLLBACK IMMEDIATE

上書きするページを必ずメモしてください。私にとっては280ページでした。次のような復元シーケンスを実行できます。

USE master

RESTORE DATABASE FITNESS
PAGE='1:280' 
FROM DISK = N'D:\Backup\FITNESS.bak' 
WITH NORECOVERY;

RESTORE LOG FITNESS 
FROM DISK = N'D:\Backup\FITNESS.trn' 
WITH NORECOVERY;

BACKUP LOG [FITNESS] 
TO  DISK = N'D:\Backup\FITNESS_1.trn' 
WITH FORMAT, INIT, STATS = 1, COMPRESSION, CHECKSUM, NORECOVERY

RESTORE LOG FITNESS 
FROM DISK = N'D:\Backup\FITNESS_1.trn' 
WITH NORECOVERY;

RESTORE DATABASE FITNESS
WITH RECOVERY;

さらに練習が必要な場合は、 Steve Stedmanのデータベース破損の課題 を強くお勧めします。

楽しい!

6
Erik Darling

現在のテストデータベースの適切なバックアップがあることを確認してください。これは、適切なバージョンに復元する必要がある場合に必要です。 DBCC WRITEPAGE を使用してSQL Serverデータベースを故意に破損させる方法の指示に従ってください

その投稿の一番上に大胆な免責事項があります

警告:この投稿の指示は、運用サーバーの近く、または貴重なデータベースが置かれている開発サーバーの近くでも実行しないでください。これらの手順を誤って実行すると、単一のデータベースまたはSQL Serverインスタンス全体に重大な損傷を与える可能性があります

テストが完了したら、作成したバックアップからテストデータベースを復元します。

1
Scott Hodgin