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 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中 ...
随机推荐
- Maven 打包涉及证书文件问题
当使用maven-assembly-plugin或者maven-shade-plugin打包时,如果涉及到证书文件,一定设置过滤,否则证书文件会被做修改.报异常: java.io.IOExceptio ...
- Maven详细介绍
Maven 目录 1 什么是Maven? 2 Maven 的好处 3 获取和安装 3.1 获取 3.2 安装 3.2.1 环境变量的配置 4 设置本地仓库 5 创建简单的Maven实例 5.1 使用骨 ...
- oracle忘记sys/system/scott用户密码了,如何重置oracle密码?
今天用到的oracle数据库,但是发现以前设置的密码,忘记了,怎么输入都不对,所以从网上找了一下资料,解决了,然后整理分享给大家. 一.遇到的问题: 1..忘记除SYS.SYSTEM用户之外的用户的登 ...
- 烂泥:rsync与inotify集成实现数据实时同步更新
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章我们介绍了如何使用rsync同步文件,这篇文章我们再来介绍下,如何把rsync与inotify集成实现数据的实时同步. 要达到这个目的,我们需要 ...
- QT学习第2天
回顾: 1.构建一个QT工程步骤 (1)qmake -project (2)qmake (3)make 2.两个常用的组件 QLabel 标签 QPushButton 按钮 --------- ...
- Semiautomated IMINT Processing Baseline System——翻译
题目 半自动的IMINT(图像情报)处理基准系统 摘要 SAIP ACTD(半自动图像情报处理高级概念技术展示项目)的目的是,通过战略上的传感器采集,使图像成为指挥官掌控整个战场的主要源头.该采集系统 ...
- jQuery UI常用插件使用
一.什么是插件 ①是遵循一定接口规范编写的程序 ②是原有系统平台功能的扩展和补充 ③只能运行在规定的系统平台下,而不能单独运行 注:由于jQuery插件是基于jQuery脚本库的扩展,所以所有jQue ...
- VS 的编译选项 build下的 platform target -- Any CPU和x86有什么影响?
VS 的编译选项 build下的platform -- Any CPU和x86有什么影响? 现在的问题是,我的一个assembly用Any CPU编译就不能在64位系统下运行了,但是用x86编译就ok ...
- OAuth2授权原理
最近在做第三方接入的,初步定下使用OAuth2协议,花了些时间对OAuth2的授权方式做了些了解. 我还记得一两年前,跟一位同事聊起互联网时,当时我说过一个想法: 目前不少较为稀有的资源,很多都是论坛 ...
- SQL主外键和子查询
主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...