SQL Server数据库快照的工作方式

翻译自:How Database Snapshots Work

最近有一个帖子《errorlog中的异常信息rolled forward 和rolled back》

里面说到:

每周六凌晨1点会出现以下信息,服务器及数据库未出现重启,节点未切换,filestream access level =0

Configuration option 'user options' changed from 0 to 0. Run the RECONFIGURE statement to install.

FILESTREAM: effective level = 0, configured level = 0, file system access share name = 'MSSQLSERVER'.

148 transactions rolled forward in database 'XX_DB' (12). This is an informational message only. No user action is required.

1 transactions rolled back in database 'XX_DB' (12). This is an informational message only. No user action is required.

Recovery completed for database XX_DB (database ID 12) in 21 second(s) (analysis 22 ms, redo 15062 ms, undo 3293 ms.) This is an informational message only. No user action is required.

为什麽会有rolled back和rolled forward?

回复者给出了下面答案:

是DBCC CHECKDB造成的,由于DBCC CHECKDB在执行时要先创建一个数据库快照,所以才会有这些提示。

这些提示并不是针对当前数据库,而是针对快照库,所以当前数据库不会有rolled forward和 rolled back。

如果还有伴有其它error信息,才可能是真的遇到问题了。

参考:

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/46e87f6e-5725-4c46-95b6-b458ab993cd7/transactions-being-rolled-back-and-forward-by-dbcc-checkdb-is-this-ok

http://www.sqlservercentral.com/Forums/Topic617175-149-1.aspx#bm617327

http://support.microsoft.com/kb/926070/zh-cn

但是回复者还没有回复一个问题:

Configuration option 'user options' changed from 0 to 0. Run the RECONFIGURE statement to install.

FILESTREAM: effective level = 0, configured level = 0, file system access share name = 'MSSQLSERVER'.

为什麽会出现FILESTREAM??LZ说他们的系统没有使用到FILESTREAM的相关功能

今晚又看了一篇文章《如何大幅提高DBCC CHECKDB/DBCC CHECKTABLE的性能

里面说到:

正常情况下,CHECKDB/CHECKTABLE的运行不会对数据库使用排它锁,而是使用内部数据库快照(internal database snapshot)。

这个内部数据库快照实质就是Sparse Filestream, 它使用sparse file,COPY-ON-WRITE技术。详细的工作原理可以参考如下的文档:
 
数据库快照的工作方式
http://msdn.microsoft.com/en-us/library/ms187054(v=SQL.105).aspx

我决定翻译一下这篇文章,看文章里是否有说到FILESTREAM


正文

数据库快照提供了一个在源数据库创建快照的时候只读的静态视图,这个静态视图会把还没有提交的事务去除掉

没有提交的事务会在新创建的数据库快照里被回滚,因为数据库引擎会在数据库快照创建完之后运行修复检查程序

但是,源数据库中的事务不会受到任何影响

数据库快照是独立于源数据库的。快照数据库会作为一个数据库存在于同一数据库服务器实例中

此外,无论什么原因,当数据库变为不可用的状态的时候,快照数据库也一样变为不可用

快照数据库不单只可以用来做报表之用,当在源数据库发生一个用户错误的时候,你可以修复源数据库到数据库快照被创建的那个时刻

自从数据库快照被创建之后,数据丢失仅仅限于快照创建之后的那些数据库数据更新的丢失

而且,创建数据库快照对于在一个大的数据库更新操作之前特别有用,例如改变数据库的架构或者表结构

对于更多数据库快照的用途,大家可以看一下数据库快照的典型应用

理解数据库快照的工作方式是很有帮助的,虽然不一定要使用数据库快照。数据库快照操作的级别是“页面级别”

在源数据库的一个页面被第一次修改之前,源数据页面会从源数据库复制到数据库快照。这个过程叫做:“COPY-ON-WRITE”操作

数据库快照存储了源数据页面,保留当快照被创建时已经存在的数据记录。后来的数据页面修改不会影响到快照里的页面内容。

对于每一个第一次被修改的页面会重复上面的COPY-ON-WRITE操作。用这种方法,快照会保存保留了所有已经被修改的数据记录的原始页面

当快照被创建的时候。

为了存储这些复制的原始页面,快照使用一个或者多个稀疏文件。最初,一个稀疏文件实际上是一个没有用户数据和还没有分配磁盘空间的空白的文件

当源数据库里越来越多的数据页面被更新,数据文件的size会增长。当快照建立之后,稀疏文件只会占用一点磁盘空间,当源数据库不断更新,

一个稀疏文件会增长成为一个大文件

想知道稀疏文件的更多信息,可以参阅:Understanding Sparse File Sizes in Database Snapshots

下面的图片描述了一个"copy-on-write"操作。在下面的快照图里灰白色的方块表示一个稀疏文件里还没有被分配的空间

当接收到第一个源数据库的第一个数据页面更新,数据库引擎会将页面写入到稀疏文件,并且操作系统会在快照的稀疏文件里分配

空间然后复制原始数据页。然后数据库引擎会更新源数据库的数据页面。

注意:因为数据库快照不是数据库存储冗余,快照不会防止磁盘错误或者其他类型的数据库损坏。如果你必须还原源数据库到某一个

时间点,这个时间点是数据库快照创建的时刻,那么你就要执行一个备份策略,从数据库备份中还原,而不是从数据库快照中还原

数据库快照的读操作

对于用户来讲,数据库快照从来不会发生改变,因为在数据库快照上的读操作总是访问原始数据页面无论这些数据页面来自哪里

如果在源数据库的数据页面从来没有被更新过,快照上的读操作会读取源数据库的源数据页面。下面的图片显示了一个在刚刚新建的快照上

的读操作,对应的稀疏文件并没有包含任何数据页面。这个读操作只会读取源数据库的数据

当有一个数据页面被更新之后,快照上的读操作就会访问存储在稀疏文件里原始数据页面,下面的图片描述了一个快照上的读操作

访问一个在源数据库被更新了的数据页面。读操作读取快照稀疏文件里的原始页面。

数据库快照增长对于更新模式的影响

如果你的源数据库相当大并且你正在关注磁盘空间的使用率,在某一时刻你应该用新的数据库快照替换旧的快照。

理想的数据库快照生存期依据于快照的增长速率和磁盘的可用空间。所需的磁盘空间取决于快照期间源数据库有多少的数据页面被更新了

因此,如果大部分的更新只是一小部分页面的重复更新,快照增长速率会比较慢,快照所需空间也会保持相对比较小的空间

相反,当所有原始页面至少最终被更新,快照会增长到与源数据库大小一样。如果磁盘开始填满,快照和磁盘会进行相互竞争对于磁盘空间

如果磁盘已经没有空间,对于快照的写操作会失败

记录:关于实际和潜在的快照大小的更多信息可以参阅:Understanding Sparse File Sizes in Database Snapshots

因此,当计划要多少磁盘空间在快照期间知道典型的数据库更新模式是很有用的。对于某些数据库,更新的频率是固定的,

例如:一个库存数据库有可能有很多每日都需要更新的页面,每日或每个星期替换旧的数据库快照是很有用的。对于其他数据库,

页面更新的比例有可能有很大的不同在业务运作期间;例如,一个目录数据库有可能只在季度更新,在其他时间只会偶尔更新

在季度的交替前和后创建数据库快照是一种业务策略。季度交替前的数据库快照允许修复重要的更新错误

而季度交替后的快照能够被用来做报表写入一直到下一个季度

下面的图片描述了两种更新模式的数据库快照的size的影响。

更新模式A影响只有30%原始页面被更新的快照环境

更新模式B影响80%原始页面被更新的快照环境

数据库快照的元数据

对于数据库快照,数据库元数据包括源数据库ID属性,ID属性存储在sys.databases目录视图里的某一列里

更多关于ID属性的信息,可以查看sys.databases (Transact-SQL).

通常,一个数据库快照不会显示元数据信息(就是说你查不到快照数据库里面的一些元数据),不过你可以从源数据库那里查询这些元数据。

这些元数据包括,下面的SQL语句返回的数据

 USE <database_snapshot>
SELECT * FROM sys.database_files

唯一的异常是:当源数据库使用全文搜索或者镜像数据库时,在快照数据库里禁用他们(禁用这些技术)

通过改变一些设置值利用数据库快照的元数据


很可惜还是没有看到FILESTREAM的相关信息

百度了一下,下面的3篇文章都在SQLSERVER启动的时候看到这句话

FILESTREAM: effective level = 0, configured level = 0, file system access share name = 'MSSQLSERVER'.

http://wenwen.soso.com/z/q163659365.htm

http://bbs.csdn.net/topics/370129706

http://wenwen.soso.com/z/q163659365.htm

应该是FILESTREAM功能检查,并不是数据库快照相关的

2013-11-29补充:

这里感谢 nzperfect大侠

对于这条信息:FILESTREAM: effective level = 0, configured level = 0, file system access share name = 'MSSQLSERVER'.

他给出了一个链接:

http://connect.microsoft.com/SQLServer/feedback/details/687963/reconfigure-statement-causes-non-useful-entries-to-be-written-to-the-sql-server-log

里面说到是SQL2008和SQL2008R2 的错误日志冗余信息,即使你没有开启FILESTREAM功能也会有这条信息的

本人在SQL2005 SP4和SQL2012 SP1的错误日志里并没有发现FILESTREAM相关的错误日志记录

应该是SQL2005的时候还没有出FILESTREAM技术,而在SQL2012的时候已经把这个冗余信息去掉了。

非常感谢nzperfect大侠

SQL2008R2 FILESTREAM冗余错误日志记录的截图

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

2013-12-2补充:

http://msdn.microsoft.com/zh-cn/library/ms186858(v=sql.120).aspx

数据库还原是可以从数据看快照中还原的

还原使用 BACKUP 命令所做的备份。 通过此命令,您可以执行下列还原方案:
(1)基于完整数据库备份还原整个数据库(完整还原)。
(2)还原数据库的一部分(部分还原)。
(3)将特定文件或文件组还原到数据库(文件还原)。
(4)将特定页面还原到数据库(页面还原)。
(5)将事务日志还原到数据库(事务日志还原)。
(6)将数据库恢复到数据库快照捕获的时间点。

K.从数据库快照恢复

下面的示例将数据库恢复到数据库快照。 该示例假定该数据库当前仅存在一个快照。 有关如何创建此数据库快照的示例,请参阅创建数据库快照 (Transact-SQL)

 注意

恢复到快照将删除所有全文目录。

 
 
USE master;
RESTORE DATABASE AdventureWorks2012 FROM DATABASE_SNAPSHOT = 'AdventureWorks_dbss1800';
GO

有关详细信息,请参阅将数据库恢复到数据库快照

SQL Server数据库快照的工作方式的更多相关文章

  1. Sql Server数据库快照初探

    什么是快照 数据库快照是 SQL Server 数据库(源数据库)的只读静态视图.换句话说,快照可以理解为一个只读的数据库.利用快照,可以提供如下好处: 提供了一个静态的视图来为报表提供服务 可以利用 ...

  2. C# 连接SQL Server数据库的几种方式--server+data source等方式

    如何使用Connection对象连接数据库? 对于不同的.NET数据提供者,ADO.NET采用不同的Connection对象连接数据库.这些Connection对象为我们屏蔽了具体的实现细节,并提供了 ...

  3. 连接sql server数据库的两种方式

    class DB     { private static SqlConnection conn; public static SqlConnection getConn() { //conn = n ...

  4. 转!!sql server 数据库 索引的原理与应用

    索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...

  5. 《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的还原方式

    本篇是继上篇的备份方式,本篇介绍的是还原方案,在SQL Server在2005以上现有的还原方案一般分为以下4个级别的数据还原: 1.数据库完整还原级别: 还原和恢复整个数据库.数据库在还原和恢复操作 ...

  6. 《SQL Server企业级平台管理实践》读书笔记——SQL Server数据库文件分配方式

    1.文件分配方式以及文件空间检查方法 最常用的检查数据文件和表大小的命令就是:sp_spaceused 此命令有三个缺陷:1.无法直观的看出每个数据文件和日志文件的使用情况.2.这个存储过程依赖SQL ...

  7. 用分离、附加的方式实现sql server数据库的备份和还原

    一.数据库分离.附加的说明 SQL Server提供了"分离/附加"数据库."备份/还原"数据库.复制数据库等多种数据库的备份和恢复方法.这里介绍一种学习中常用 ...

  8. SQL Server数据库多种方式查找重复记录

    摘要:SQL Server是一个关系数据库管理系统,SQL Server数据库的应用是很多的,SQL Server数据库赢得了广大用户的青睐,本文将主要为大家介绍关于SQL Server数据库中查找重 ...

  9. C# 以附加文件方式连接SQL Server数据库文件

    string str = @"data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFileName=z:\ttt.mdf;Us ...

随机推荐

  1. 第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析

    关于spring中的validate注解后台校验的解析 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判 ...

  2. 如何虚拟机里安装Win10操作系统

    不多说,直接上干货! Windows Server 2003.2008.2012系统的安装 推荐网址:打开MSDN网站(http://msdn.itellyou.cn ) 关于给电脑换系统,很多人会花 ...

  3. OpenGL10-骨骼动画原理篇(3)-Shader版本代码已经上传

    视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 接上一个例程OpenGL10-骨骼动画原理篇(2),对骨骼动画 ...

  4. Chapter 3 Phenomenon——6

    A low oath made me aware that someone was with me, and the voice was impossible not to recognize. 某人 ...

  5. Spring MVC 实现web Socket向前端实时推送数据

    最近项目中用到了webSocket服务,由后台实时向所有的前端推送消息,前端暂时是不可以发消息给后端的,数据的来源是由具体的设备数据收集器收集起来,然后通过socket推送给后端,后端收到数据后,再将 ...

  6. golang协程池

    type GoroutinePoll struct { Queue chan func() error Total, Num int Result chan error FinishCallBack ...

  7. 编写dimgr脚本学到的知识及技巧

    编写dimgr是为了管理手机上的镜像,在此总结下过程中学到的知识及技巧(不讨论具体用法). 参数处理 以往处理脚本参数直接用循环加判断语句,若是脚本只有简单参数,这无疑是简便可行的方法.但当需要处理复 ...

  8. 剑指offer62:二插搜索树的第k个节点

    题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 中序遍历 /* struct TreeNo ...

  9. 【持续更新】一个简洁、易用的美赛LaTeX模板: easyMCM

    目录 1 当前美赛模板通行情况的概述 2 easymcm宏包说明 2.1 与mcmthesis的关系之说明 2.2 easymcm宏包的简介 2.3 美赛模板下载地址 3 常见问题的解决方案 若您无意 ...

  10. 开源方案搭建可离线的精美矢量切片地图服务-4.Mapbox样式设计

    项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...