通过下面的脚本可以计算出数据库从上次完整备份之数据的更改率,在Pual之前还没有人写过类似的代码。
根据运行的结果,我们可以知道数据库的数据自上次完整备份之后的数据修改程度,如果更概率非常大的情况下,我们可以直接选择完整备份,而省掉差异备份,如果更改率非常小则可以选择差异备份。(当然如果数据库小的话即使数据更改很小也不需要差异备份)
即使不需要调整你的备份计划你也可以对数据库的状况有一个深刻的了解。
/*=====================================================================
File: SQLskillsDIFForFULL.sql
Summary: This script creates a system-wideSP SQLskillsDIFForFILL thatworks out what percentage of a database haschanged since theprevious full database
backup.
Date: April 2008
SQL Server Versions:
10.0.1300.13 (SS2008 February CTP -CTP-6)
9.00.3054.00 (SS2005 SP2)
------------------------------------------------------------------------------
Copyright (C) 2008 Paul S. Randal All rights reserved.You may alter this code for
your own*non-commercial* purposes. You mayrepublish altered code as long as you givedue credit.THIS
CODE AND INFORMATION ARE PROVIDED"AS IS" WITHOUT WARRANTY OFANY KIND, EITHER EXPRESSED OR PLIED,INCLUDING BUT NOT LIMITEDTO THE IMPLIED WARRANTIES OFMERCHANTABILITY AND/OR FITNESS FOR
APARTICULAR PURPOSE.
============================================================================*/
-- Create thefunction in MSDB
--
USE msdb;
GO
IF EXISTS(SELECT*FROMsys.objectsWHERE
NAME='SQLskillsConvertToExtents')
DROP FUNCTION SQLskillsConvertToExtents;
GO
-- This functioncracks the output from a DBCC PAGE dump
-- of anallocation bitmap. It takes a string in the form
-- "(1:8) -(1:16)" or "(1:8) -" and returns the number
-- of extentsrepresented by the string. Both the examples
-- above equal 1extent.
--
CREATE FUNCTION SQLskillsConvertToExtents(
@extents VARCHAR (100))
RETURNS INTEGER
AS
BEGIN
DECLARE @extentTotal
INT;
DECLARE@colon
INT;
DECLARE@firstExtent
INT;
DECLARE@secondExtent
INT;
SET@extentTotal = 0;
SET @colon =CHARINDEX(':', @extents);
-- Check for thesingle extent case
--
IF (CHARINDEX(':', @extents,
@colon + 1)
= 0)
SET@extentTotal
= 1;
ELSE
-- We're inthe multi-extent case
--
BEGIN
SET@firstExtent
= CONVERT(INT,
SUBSTRING(@extents, @colon+ 1,CHARINDEX(')',
@extents, @colon)- @colon- 1));
SET@colon =CHARINDEX(':', @extents,
@colon+ 1);
SET@secondExtent
= CONVERT(INT,
SUBSTRING(@extents, @colon+ 1,CHARINDEX(')',
@extents, @colon)- @colon- 1));
SET@extentTotal
=(@secondExtent -@firstExtent)/8+ 1;
END
RETURN@extentTotal;
END;
GO
USE master;
GO
IF OBJECT_ID('sp_SQLskillsDIFForFULL')ISNOTNULL
DROP PROCEDURE sp_SQLskillsDIFForFULL;
GO
-- This SPcracks all differential bitmap pages for all online
-- data files ina database. It creates a sum of changed extents
-- and reportsit as follows (example small msdb):
--
-- EXECsp_SQLskillsDIFForFULL 'msdb';
-- GO
--
-- Total ExtentsChanged Extents Percentage Changed
-- ---------------------------- ----------------------
-- 102 56 54.9
--
-- Note thatafter a full backup you will always see some extents
-- marked aschanged. The number will be 4 + (number of data files - 1).
-- These extentscontain the file headers of each file plus the
-- roots of someof the critical system tables in file 1.
-- The number formsdb may be round 20.
--
CREATE PROCEDURE sp_SQLskillsDIFForFULL(
@dbName VARCHAR (128))
AS
BEGIN
SET NOCOUNTON;
-- Create the temptable
--
IF EXISTS(SELECT*FROM msdb.sys.objectsWHERE
NAME= 'SQLskillsDBCCPage')
DROP TABLE msdb.dbo.SQLskillsDBCCPage;
CREATE TABLE msdb.dbo.SQLskillsDBCCPage(
[ParentObject] VARCHAR(100),
[Object] VARCHAR (100),
[Field] VARCHAR (100),
[VALUE] VARCHAR (100));
DECLARE@fileID
INT;
DECLARE@fileSizePages
INT;
DECLARE@extentID
INT;
DECLARE@pageID
INT;
DECLARE@DIFFTotal
INT;
DECLARE@sizeTotal
INT;
DECLARE@total
INT;
DECLARE@dbccPageString
VARCHAR (200);
SELECT@DIFFTotal = 0;
SELECT@sizeTotal
= 0;
-- Setup a cursorfor all online data files in the database
--
DECLAREfiles CURSORFOR
SELECT[file_id], [size]FROMmaster.sys.master_files
WHERE[type_desc]
= 'ROWS'
AND[state_desc]
= 'ONLINE'
AND[database_id]
= DB_ID(@dbName);
OPEN files;
FETCH NEXT
FROM files INTO @fileID,@fileSizePages;
WHILE @@FETCH_STATUS= 0
BEGIN
SELECT@extentID
= 0;
-- The sizereturned from master.sys.master_files is in
-- pages - weneed to convert to extents
--
SELECT@sizeTotal
= @sizeTotal + @fileSizePages
/ 8;
WHILE (@extentID<@fileSizePages)
BEGIN
-- Theremay be an issue with the DIFF map page position
-- on thefour extents where PFS pages and GAM pages live
-- (at pageIDs 516855552, 1033711104, 1550566656, 2067422208)
-- but Ithink we'll be ok.
-- PFS pagesare every 8088 pages (page 1, 8088, 16176, etc)
-- GAMextents are every 511232 pages
--
SELECT@pageID
= @extentID +6;
-- Build thedynamic SQL
--
SELECT@dbccPageString
= 'DBCCPAGE ('
+@dbName
+ ', '
+ CAST(@fileIDASVARCHAR)+',
'
+ CAST(@pageIDASVARCHAR)+',
3) WITH TABLERESULTS,NO_INFOMSGS';
-- Empty outthe temp table and insert into it again
--
DELETEFROM msdb.dbo.SQLskillsDBCCPage;
INSERTINTO msdb.dbo.SQLskillsDBCCPageEXEC(@dbccPageString);
-- Aggregateall the changed extents using the function
--
SELECT@total
= SUM([msdb].[dbo].[SQLskillsConvertToExtents]([Field]))
FROMmsdb.dbo.SQLskillsDBCCPage
WHERE[VALUE]
= ' CHANGED'
AND[ParentObject]
LIKE 'DIFF_MAP%';
SET@DIFFTotal
= @DIFFTotal + @total;
-- Move tothe next GAM extent
SET@extentID
= @extentID +511232;
END
FETCH NEXTFROM filesINTO @fileID,@fileSizePages;
END;
-- Clean up
--
DROP TABLE msdb.dbo.SQLskillsDBCCPage;
CLOSE files;
DEALLOCATEfiles;
-- Output theresults
--
SELECT
@sizeTotal AS[Total Extents],
@DIFFTotal AS[Changed Extents],
ROUND(
(CONVERT(FLOAT, @DIFFTotal)/
CONVERT(FLOAT, @sizeTotal))* 100,
2)AS [Percentage Changed];
END;
GO
-- Mark the SPas a system object
--
EXEC sys.sp_MS_marksystemobjectsp_SQLskillsDIFForFULL;
GO
-- Test to makesure everything was setup correctly
--
EXECsp_SQLskillsDIFForFULL'msdb';
GO
分享到:
相关推荐
数据库差异备份与恢复图解.doc。超级详细
pc-server2003完整备份,差异备份,增量备份求解
数据库差异备份与增量备份的不同之处 对于许多初学者来说,很难将差异备份和增量备份这两个概念理解透彻,本文中,我们将把增量备份与差异备份的具体定义和不同之处分别进行讲解:
差异备份软件. 支持平台:windows 使用方式:命令行(diffbak -s [源路径] <目的路径>) 功能:加上-s参数将"源路径"下所有文件(包含各级子目录)逐个复制备份到"目的路径"下.备份目录结构与源路径相同. 可做到:差异备份....
差异备份工具
mssql差异备份获得的webshellmssql差异备份获得的webshell
MSSQL差异备份!!!一个关于备份的资料!
差异备份与还原须知:差异备份是上次完整备份之后发生改变的副本。所以还原是需要上次的完整备份和最近一次差异备份。
一套系统用久了,数据量很大,经常全库备份太影响性能。那就用我这个程序吧,每个月全库备份一次,没小时差异备份一次,覆盖上次备份文件,防止空间被占满。即不影戏服务器性能,又能完成数据定时自动备份。
局域网差异备份软件Zsync,主要用于局域网内服务器备份数据等,全中文界面,备份比较简单,只需内网可达即可备份,因其官网无法访问,所以只保留了安卓端和windows端的,mac电脑的不支持。
SQL server 中用T-SQL语句实现的数据库差异备份与恢复
SQL Server 2005 从差异备份还原数据库 数据库备份还原的源代码
[转载]LOG备份与备份差异的对比!.mht[转载]LOG备份与备份差异的对比!.mht
主要有三种基本的备份方式:全备份,增量备份和差异备份。最近,尽管数据备份软件厂商已经推出了一些新类型的备份方式,但是你可能对此不熟悉。尽管如此,在采取行动之前,我要给你们上一堂关于全备份、增量备份和...
针对SQL Server2000做的数据库差异备份和恢复的程序,主要用于同步两台数据库服务器。
利用sql差异本分文件
所有差异备份工具包(getwebshell2,sqlcomm,小志 SQL沙盘提权备份工具.exe,GetWebshellah56bug大众版,MSSQL_UP,DB_OWNER权限备份hta到启动项提权的小工具等等!)
MSsql差异备份总结
利用维护计划,实现SQL SERVER数据库备份,很高效,很实用。一次操作,终身无忧。