Sqlserver 快照
最近,开发系统使用SqlServer2008 R2,但是由于系统数据压力的增加,准备增加一个和正式数据库同步的库,用来供接口和报表使用,所以开始对SqlServer里面的一些技术开始研究,第一篇先来研究一下最基本的数据库快照。
基本概念
先简单介绍一下快照的基本概念,数据库快照是 SQL Server 数据库(源数据库)的只读静态视图。 自创建快照那刻起,数据库快照在事务上与源数据库一致。 数据库快照始终与其源数据库位于同一服务器实例上。 当源数据库更新时,数据库快照也将更新。 因此,数据库快照存在的时间越长,就越有可能用完其可用磁盘空间。
数据库快照操作的级别是“页面级别”,在第一次修改源数据库页之前,先将原始页从源数据库复制到快照, 快照将存储原始页,保留它们在创建快照时的数据记录。 对要进行第一次修改的每一页重复此过程。 对于用户而言,数据库快照似乎始终保持不变,因为对数据库快照的读操作始终访问原始数据页,而与页驻留的位置无关。其实就是快照一直会备份源数据的修改之前的原始页,所以随着数据的修改增多,快照的文件存储就会慢慢变大。
为了存储复制的原始页,快照使用一个或多个“稀疏文件”。 最初,稀疏文件实质上是空文件,不包含用户数据并且未被分配存储用户数据的磁盘空间。 随着源数据库中更新的页越来越多,文件的大小也不断增长。 下图说明了两种相对的更新模式对快照大小的影响。 更新模式 A 反映的是在快照使用期限内仅有 30% 的原始页更新的环境。 更新模式 B 反映的是在快照使用期限内有 80% 的原始页更新的环境。

快照可用于报告目的。
客户端可以查询数据库快照,这对于基于创建快照时的数据编写报表是很有用的。
使数据免受管理失误所带来的影响。
如果源数据库上出现用户错误,您可将源数据库恢复到创建给定数据库快照时的状态。 丢失的数据仅限于创建该快照后数据库中发生更新的数据。
例如,在进行重大更新(比如大容量更新或架构更改)前,对数据库创建数据库快照以保护数据。 一旦进行了错误操作,可以使用快照将数据库恢复到生成快照时的状态。 为此目的进行的。
使数据免受用户失误所带来的影响。
定期创建数据库快照,可以减轻重大用户错误(例如,删除的表)的影响。 为了很好地保护数据,可以创建时间跨度足以识别和处理大多数用户错误的一系列数据库快照。 例如,根据磁盘资源,可以每 24 小时创建 6 到 12 个滚动快照。 每创建一个新的快照,就删除最早的快照。
若要从用户错误中恢复,可以将数据库恢复到在错误发生的前一时刻的快照。 为此目的进行的恢复很可能比从备份还原快得多;但是,此后您无法对数据进行前滚操作。
或者,也可以利用快照中的信息,手动重新创建删除的表或其他丢失的数据。 例如,可以将快照中的数据大容量复制到数据库中,然后手动将数据合并回数据库中。
管理测试数据库。
在测试环境中,当每一轮测试开始时针对要包含相同数据的数据库重复运行测试协议将十分有用。 在运行第一轮测试前,应用程序开发人员或测试人员可以在测试数据库中创建数据库快照。 每次运行测试之后,数据库都可以通过恢复数据库快照快速返回到它以前的状态。
数据库快照的限制
源数据库的限制:
不能对数据库进行删除、分离或还原。可以备份源数据库,这方面将不受数据库快照的影响。
源数据库的性能受到影响。由于每次更新页时都会对快照执行“写入时复制”操作,导致源数据库上的 I/O 增加。
不能从源数据库或任何快照中删除文件。
快照数据库的限制:
数据库快照必须与源数据库在相同的服务器实例上创建和保留。
始终对整个数据库制作数据库快照。
当将源数据库中更新的页强制压入快照时,如果快照用尽磁盘空间或者遇到其他错误,则该快照将成为可疑快照并且必须将其删除。
快照为只读。
禁止对 model 数据库、master 数据库和 tempdb 数据库创建快照。
不能在 FAT32 文件系统或 RAW 分区上创建数据库快照。 数据库快照所用的稀疏文件由 NTFS 文件系统提供。
数据库快照将继承快照创建时其源数据库的安全约束。 由于快照是只读的,因此无法更改继承的权限,对源数据库的更改权限将不反映在现有快照中。
如果源数据库的状态为 RECOVERY_PENDING,可能无法访问其数据库快照。 但是,当解决了源数据库的问题之后,快照将再次变成可用快照。
只要理解它的原理它的限制也就自然明了。
创建数据库快照
在创建数据库之前,首先要知道数据库分布在几个文件上,因为快照需要对每一个文件进行copy-on-writing。
先查看数据库有几个数据库文件:
--根据数据文件个数创建快照
exec sp_helpdb demo01
go
我的数据库只有一个数据库文件,所以直接执行以下脚本创建快照:
--创建快照
create database snap_demo_10am
on (name=Demo01,filename='C:\SQLTest\SNAPSHOT\Snap_advlt.snap')
as SNAPSHOT of Demo01
go
如果数据库存在于文件组,可能涉及多个数据库文件创建快照的示例:
----多文件数据创建快照
CREATE DATABASE sales_snapshot1200 ON
( NAME = SPri1_dat, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SPri1dat_1200.ss'),
( NAME = SPri2_dat, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SPri2dt_1200.ss'),
( NAME = SGrp1Fi1_dat, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\mssql\data\SG1Fi1dt_1200.ss'),
( NAME = SGrp1Fi2_dat, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG1Fi2dt_1200.ss'),
( NAME = SGrp2Fi1_dat, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG2Fi1dt_1200.ss'),
( NAME = SGrp2Fi2_dat, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\data\SG2Fi2dt_1200.ss')
AS SNAPSHOT OF Sales
GO
数据库快照恢复和删除
--利用快着恢复数据库
use master
restore database Demo01 from database_snapshot='snap_demo_10am'
go --删除快照
drop database snap_demo_10am;
Sqlserver 快照的更多相关文章
- sqlserver快照,启用基于行版本控制的隔离级别
在sqlserver标准的已提交读(read committed)隔离级别下,读写操作相互阻塞.未提交读(read uncommitted)虽然不会有这种阻塞,但是读操作可能会读到脏数据,这是大部分用 ...
- SqlServer代理执行[分发清除: distribution] 无法删除快照文件
每天偶尔检查数据库作业是否失败,发现有错误 select top 10 job_id,run_date,run_time,run_duration,step_name,message from ms ...
- sqlserver 关于快照
数据库快照:是数据库某一时间点的视图,快照涉及最初目的是为了报表服务,快照还可以和镜像结合来达到读写分离的目的 数据库快照:是sqlserver数据库的只读静态视图快照的作用:1 提供了一个静态的视图 ...
- sqlserver数据库创建快照发布遇到的错误:对路径“XXXX”访问被拒绝
在创建了一个sqlserver数据库的发布后,显示创建成功,但当查看快照代理状态时,显示“对路径‘XXXX’访问被拒绝”,这一错误导致订阅无法实现.然后网上有一方案帮忙解决了,主要有以下操作: 1)在 ...
- sqlserver同步后在不重新初始化快照的情况下新增表
在已有事务复制中,时长需要新增表.索引,这些变更时不会同步到从库中.如果采用默认的设置,每次都需要重新初始化快照,从库重新应用快照和未执行的同步命令,这显然是无法在线上实践的方法.另一种 ...
- SQLServer Agent执行[分发清除: distribution] 无法删除快照文件
由于之前创建的发布订阅造成严重的性能压力,症状表现为发布订阅表查询产生CMEMTHREAD suspend等待,由于开发配置每隔十分钟会产生大量的SQLCOMMAND(create table,cr ...
- SQLServer之创建数据库快照
创建数据库快照注意事项 语法:set transaction isolation level snapshot; 指定事务中任何语句读取的数据都将是在事务开始时便存在的数据的事务上一致的版本. 事务只 ...
- sqlserver配置允许快照隔离
ALTER DATABASE TustenaOS SET ALLOW_SNAPSHOT_ISOLATION ON
- SQLServer 数据库镜像+复制方案
目标: 主机做了Mirror和Replication,当主机出现问题时,Replication和Mirror实现自动的故障转移(Mirror 和Replication都切换到备机,而当主机 重新启动后 ...
随机推荐
- HDU4276 - The Ghost Blows Light(树形DP)
题目大意 给定一棵n个结点的树,每个结点上有一定数量的treasure,经过每条边需要花一定的时间,要求你从结点1出发,在不超过时间T的情况下,最多能够获得的treasure是多少,并且要求结束于结点 ...
- iOS 详解NSXMLParser方法解析XML数据方法
前一篇文章已经介绍了如何通过URL从网络上获取xml数据.下面介绍如何将获取到的数据进行解析. 下面先看看xml的数据格式吧! <?xml version="1.0" enc ...
- iOS7自定义statusbar和navigationbar的若干问题
当然有许多问题是这篇文章中没有提到的,按照文章的方法进行设置,你可能会遇到以下问题: 1.navigationbar的背景图片自定义以后,statusbar虽然和navigationbar共用了背景图 ...
- Javascript注意事项二【避免误用parseInt】
parseInt("123abc"); //123parseInt("1.73"); //1parseInt(".123"); //NaN ...
- JavaScript要点(十三) HTML DOM EventListener
addEventListener() 方法 <body> <p>该实例使用 addEventListener() 方法在按钮中添加点击事件. </p> <bu ...
- Android开发日志问题
以前在Android开发中发现,日志打印好多,调试的时候各种加Log,之后就各种不删除,导致项目后期花大把时间删除日志打印. 学到一个好方法: 在所有尽可能高的父类里面加上一个常量 DEBUG ,一开 ...
- 【转】C++ function、bind以及lamda表达式
本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对 ...
- MVC返回http状态码
//controller ); //asp.net return HttpStatusCode.OK
- 从零开始学android开发-获取TextView的值
昨日写一个Android Demo,逻辑大概是从TextView获取其中的值,然后处理后再放回TextView中.整个处理过程是由一个Button的OnClick触发的. 可是在调试的过程中,一点击B ...
- Windows Phone-框架结构和启动过程
上一篇文章介绍了Windows Phone的开发环境和一个简单的Windows Phone程序的演示和结构,这一篇文章要深入一点,介绍Windows Phone的框架结构和程序启动的过程. 一 Win ...