SQL基础之数据库快照
1.认识快照
如名字一样,数据库快照就可以理解为数据库某一时刻的照片,它记录了此时数据库的数据信息。如果要认识快照的本质,那就要了解快照的工作原理。当我们执行t-sql创建快照后,此时就会创建一个或多个稀疏文件。稀疏文件的个数与数据库数据文件的个数相等且一定要相等,否则会报错。此时,稀疏文件只是一个空文件并没有在磁盘上分配空间存储用户数据,如果数据库没有任何更新那快照也将一直是空文件。快照唯一的一次写数据,仅发生在第一次更新数据库的数据页,这时快照会将数据页中的数据复制到快照中并在磁盘上真真的分配了空间。以后这个数据页无论怎么变化都与快照没关系,就这样其它页都在第一次更新数据前将这一页的数据复制到快照中,直到数据库的所有页都都被复制到快照中。当然这并不是很好的结果,因为这样的快照占用了大量的空间。另外快照没有冗余存储,所以为了保证数据库不出错还应该多方位考虑比如使用备份。
创建快照后,当访问快照中的数据时如果数据页未更新那么将直接访问源数据库,如果数据页已更新那么将访问快照。知道了快照的工作原理后下一个疑问就是快照的作用以及何时使用它。快照的作用主要有2点:由于快照可以保存数据库某一时刻的数据信息,因此可利用快照做报表;由于快照保存了数据库的数据,可使数据库还原为创建快照时的状态,因此可利用快照作为一种安全和可靠性策略。使用快照恢复数据库一般比备份快得多,但恢复后的数据库将无法再进行前滚操作。不过有一种方式可以解决这个缺点,我们可以将源数据库对比数据库快照中的表,源数据库里误删或数据错误的表可根据快照中的表来建立新的数据表,并将快照中的数据全部复制到源数据库里创建的新表中。当表不多数据量不是很大时这种方法还是挺不错的。
2.稀疏文件
稀疏文件是一种文件存储的方式,当它被创建时稀疏文件占用的磁盘空间非常少,而用户数据并不会占用磁盘空间。这种文件虽然创建了但并未分配完整的存储空间,随着用户数据的写入稀疏文件才开始慢慢占用磁盘空间,当在windows中属性查看这个文件时会发现它的大小就是创建快照是源数据库的大小。稀疏文件以64KB的增量增加,也就是说稀疏文件的大小一定是64KB的整数倍。当增加一个64KB时,它可以存放8个数据页,而这64KB空间最开始为空字符串或只占用一点点用户数据,所以很稀少。随着用户数据的增加稀疏文件最终将等于源数据库的大小。我们可以使用t-sql来查看稀疏文件名: select physical_name from sys.master_files,而在sys.database_files中则只会显示源数据库名,就算是在数据库快照中进行select。另外还可以使用sys.dm_io_virtual_file_stats函数返回表中的size_on_disk_bytes列来查看稀疏文件的真实大小。
3.限制条件
对于源数据库,在数据库快照存在期间,不得对源数据库进行删除、分离或还原,不得对源数据库和快照进行文件删除操作。但此时可以备份数据库,从这里可以看出数据库备份不会受到快照的影响。由于源数据库中的数据页第一次更新时会将数据页写到快照中,因此这必将影响对源数据库更新时的性能。源数据库必须处于联机状态且不能将源数据库配置为可缩放共享数据库。如果在镜像数据库中创建数据库快照,数据库必须处于同步镜像状态。
对于数据库快照,快照必须与源数据库在相同的服务器实例上创建和保留,在快照拷贝源数据页时如果快照用尽磁盘空间或者遇到其他错误,那么就认为该快照为可疑快照并且必须删除快照。禁止对model数据库、master数据库和tempdb数据库创建快照,快照为只读文件不得更改数据库快照的任何规范,当然也就不能删除数据库快照中的文件了。不能备份或还原数据库快照,不能对数据库快照进行附加和分离操作。由于数据库快照使用的稀疏文件是NTFS文件系统提供的,因此只能在NTFS文件系统上建立快照。数据库快照会继承快照创建时源数据库的安全约束,不过由于快照的只读性因此继承的约束性不得修改。在日志传送配置中只能针对主数据库文件,而不能针对辅助数据库创建数据库快照。当从主服务器实例切换为辅助服务器实例时,必须先将数据库快照删除。不能将数据库快照配置为可缩放共享数据库,数据库快照不支持FILESTREAM文件组,如果源数据库中存在FILESTREAM文件组,则在数据库快照中将视这个文件组为脱机状态,并且数据库快照不能用于恢复数据库。
快照始终反映创建该快照时的文件组状态,联机文件组将保持联机状态,脱机文件组将保持脱机状态,这是快照与文件组状态关系的本质。首先快照创建时,如果源数据库存在脱机文件组,因为稀疏文件不能存储脱机文件组,故源数据库中的脱机文件组在快照中将是脱机状态。创建快照后,源数据库不能对脱机文件组进行联机,这样的话脱机文件组将一直保持脱机状态。联机失败的原因在于使文件联机会对该文件进行还原,而在数据库快照存在期间不得对源数据库进行删除、分离或还原。如果创建快照时源文件组是联机的,那么此时若对数据文件进行脱机操作,在数据库快照中将仍然保持联机状态,也就是联机文件组将保持联机状态。接着如果访问快照中的数据,显然如果源数据库数据页没有更新那将访问源数据库,然而数据页所在的文件组已脱机,最终会产生访问错误而导致失败。
4.操作快照
在创建数据库快照时,msdn建议我们应该对源数据库创建多个数据库快照,这些快照代表着不同时间数据库的状态。并且我们还应该定时的更新数据库快照,以提高源数据库的正确性。在恢复数据库操作中,恢复前必须将其它数据库快照删除,另外若源数据库中含有只读或压缩文件、源数据库创建快照后对联机文件进行脱机都将无法进行数据库还原操作。任何对数据库具有restore database权限的用户都可以恢复数据库快照,但要注意恢复过程中除了数据页的恢复外还将覆盖旧的日志文件并重建日志。这样就无法对恢复后的源数据库进行前滚操作,建立快照后的所有数据都将丢失。
--创建数据库快照的唯一方式就是使用t-sql --对应普通数据库,可以创建数据库的用户就可以创建对应的数据库快照
--对应镜像数据库,只有sysadmin固定服务器角色成员才能创建
create database testDB_SS on
(
name=testDB_data, --快照使用的数据文件名
filename='E:\07_代码存放\testDB_SS.ss' --快照存放的路径
)
as snapshot of testDB
go --通过数据库快照恢复源数据库,恢复完成的数据库将保留数据库快照的权限和配置
--在恢复过程中,快照和源数据库都将不可用。如果恢复期间发生错误那数据库在重新启动后会再尝试恢复操作。
restore database testDB from database_snapshot ='testDB_SS.ss' --删除数据库快照,操作完成后将关闭对快照的所有用户连接,显然稀疏文件将不存在
drop database testDB_SS
SQL基础之数据库快照的更多相关文章
- 关于SQL Server 镜像数据库快照的创建及使用
从SQL Server 2005 SP 起,SQL 开始支持数据库镜像.它的设计目的是试图为SQL Server 提供一个具有实时性数据同步的灾难恢复技术,即能够提供数据冗余备份,切换起来比较方便.每 ...
- SQL Server 创建数据库快照
创建数据库快照: 必须在create database 命令中包括源数据库的每一个数据文件,原始逻辑名,新物理名与路径, 不能指定其他属性 create database db_snapshot_na ...
- SQL基础之数据库
1.基础概念 首先要强调一点,就是我们的数据库是由数据库系统来管理的,我们登入数据库并在其上进行操作时最终均要通过数据库系统来完成.可以理解成在数据库上进行操作的是客户端,数据库系统是服务端.一个数据 ...
- SQL Server 从数据库快照还原数据库
语法: restore database db_name from database_snapshot = 'db_snapshot_name'; ------------------------- ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- 数据库学习---SQL基础(二)
数据库学习---SQL基础(一) 数据库学习---SQL基础(二) 数据库学习---SQL基础(三) 上篇复习的sql的增删改查,and ,or ,>=, <=,!=等逻辑运算符,还有in ...
- 数据库学习---SQL基础(一)
数据库学习---SQL基础(一) 数据库学习---SQL基础(二) 数据库学习---SQL基础(三) SQL(struct query language)结构化查询语言:一种专门与数据库通信的语言, ...
- Sql Server 2008R2 数据库发布与订阅
背景描述: 发布服务器A: (远程端) , 数据库服务名: GUANWANG1 订阅服务器B: (本机) , 数据库服务名: PC-LLRDBA 需要从服务器A中数据库发布,然后在B中订阅A发布 ...
- 11、SQL Server 视图、数据库快照
SQL Server 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中 ...
随机推荐
- (ios) nsnotification总结
1 文本输入,键盘显示时,view向上,键盘隐藏时,view向下 1.1 注册键盘显示,关闭通知,并实现主界面上下变动 [[NSNotificationCenter defaultCenter] a ...
- TSQL--临时表和表变量
1. 临时表适用数据量较大的情况,因为临时表可以建立索引 2. 表变量适用于数据较小的情况,表变量只能在定义时创建约束(PRIMARY KEY/UNIQUE)从而间接建立索引 3. 临时表是事务性的, ...
- Linux 引导修复
前些天,我的Ubuntu老提示"Filesystem root"空间不足,于是,我煞笔的用win pe去扩展空间,结果,空间扩展不成,反倒丢失了引导..... 于是就上网查资料,看 ...
- Hello, AnnsShadow!
Hello! 发现这个神奇的园子快一年了,自己的学习历程磕磕碰碰也过了一年了,想想,这么久了,是时候做些记录做个分享者了. 从一开始的只敢看Blog,到现在自己发表一下自己的所感所想,算是一种成长了吧 ...
- python基础(一)
简单的‘Hello World!’ Python命令行 假设你已经安装好了Python, 那么在Linux命令行输入: $python 将直接进入python.然后在命令行提示符>>> ...
- 烂泥:openvpn双网卡客户端与内网机器通信
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 前段时间写了一篇有关openvpn搭建与内网机器通信的文章,那篇文章是基于服务器单网卡 ...
- 企业邮箱在Android(安卓)系统手机上POP3/IMAP协议的设置方法
此处以三星(系统版本4.4.2)为例,介绍下使用安卓系统自带的客户端如何设置pop/imap协议方式方法 以下我们将使用test@zhuyuming.so 为测试案例,请您操作时更换成您自己的邮箱账号 ...
- 偷懒的一天-jQuery之事件与应用
hi 睡得恍恍惚惚不知精神为何物了 1.jQuery -----事件与应用----- ----页面加载时触发ready()事件 ready()事件类似于onLoad()事件,但前者只要页面的DOM结构 ...
- USACO GCD Extreme(II)
题目大意:求gcd(1,2)+gcd(1,3)+gcd(2,3)+...+gcd(n-1,n) ---------------------------------------------------- ...
- HOLOLENS的空间管理
http://blog.csdn.net/sun_t89/article/details/52460272