データベースページを破損し、同じページを復元したい。
それ、どうやったら出来るの?
この質問が大好きです!
デモを行うには、 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のデータベース破損の課題 を強くお勧めします。
楽しい!
現在のテストデータベースの適切なバックアップがあることを確認してください。これは、適切なバージョンに復元する必要がある場合に必要です。 DBCC WRITEPAGE を使用してSQL Serverデータベースを故意に破損させる方法の指示に従ってください
その投稿の一番上に大胆な免責事項があります
警告:この投稿の指示は、運用サーバーの近く、または貴重なデータベースが置かれている開発サーバーの近くでも実行しないでください。これらの手順を誤って実行すると、単一のデータベースまたはSQL Serverインスタンス全体に重大な損傷を与える可能性があります
テストが完了したら、作成したバックアップからテストデータベースを復元します。