我如何破坏数据库页面并再次恢复它

AMI*_*MIT 4 sql-server corruption sql-server-2012

我想破坏一个数据库页面,并恢复相同的页面。

我怎么做?

Eri*_*ing 6

我喜欢这个问题!

为了演示,我将使用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 次

最近记录:

8 年,5 月 前