我喜欢这个问题!
为了演示,我将使用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
Run Code Online (Sandbox Code Playgroud)
接下来,进入您的数据库,并抓取一个页面进行破坏。您应该能够在 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;
Run Code Online (Sandbox Code Playgroud)
之后,您需要将数据库设置为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
Run Code Online (Sandbox Code Playgroud)
请记住记下您要覆盖的页面。对我来说,它是第 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;
Run Code Online (Sandbox Code Playgroud)
如果你想要更多的练习,我强烈推荐Steve Stedman 的数据库损坏挑战。
享受!
归档时间: |
|
查看次数: |
769 次 |
最近记录: |