在 SQL Server 中查询差异变化图

usr*_*usr 6 sql-server sql-server-2012

差异备份使用差异更改映射页面来确定要备份的页面。我想研究一种涉及差异备份的备份策略。为此,我想自动跟踪多个数据库随时间变化的数据量。

我想以编程方式查询差异更改映射以确定更改了多少页。

DBCC PAGE根据http://www.practicalsqldba.com/2013/07/sql-server-understanding-differential.html这似乎是可能的。有没有比这更清洁或“记录更多”的方式?看起来这在实施时会很笨拙且容易出错。

Mic*_*een 5

SQL Server 2019 包含新的 DMV sys.dm_db_page_info()文档)。

该函数返回一行,其中包含页面的标题信息。

该头信息包括

diff_status         bit             Bit to indicate if diff status is changed 
diff_status_desc    nvarchar(64)    Description of the diff status bit
Run Code Online (Sandbox Code Playgroud)

干净页的位列为 0,脏页的位列为 1。描述分别为“未更改”或“已更改”。

假设我们创建一个新表并添加一行。

use Sandpit;
create table t(c int);
insert t(c) values(1);
Run Code Online (Sandbox Code Playgroud)

我们可以通过传统方式或使用另一个 DMV来查找页面 id

select t.c, pr.*
from t
cross apply sys.fn_PageResCracker(%%physloc%%) as pr;
Run Code Online (Sandbox Code Playgroud)

对我来说,这恰好返回文件 1,第 240 页。将其插入 DMV 我们得到

select diff_status, diff_status_desc
from sys.dm_db_page_info(db_id(N'Sandpit'), 1, 240, N'DETAILED');
Run Code Online (Sandbox Code Playgroud)

哪个返回

diff_status diff_status_desc
----------- ----------------
1           CHANGED
Run Code Online (Sandbox Code Playgroud)

完整备份应该重置这些标志,果然,它确实如此

backup database Sandpit to disk = N'C:\Dummy\Sandpit.bak'

select diff_status, diff_status_desc
from sys.dm_db_page_info(db_id(N'Sandpit'), 1, 240, N'DETAILED');

diff_status diff_status_desc
----------- ----------------
0           NOT CHANGED
Run Code Online (Sandbox Code Playgroud)