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 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中 ...
随机推荐
- Sublime更换默认字体的方法
Sublime是一款很不错的编辑器,不过默认安装后的字体却不尽人意,并且Sublime竟然连个完整的设置页面都没有(直接让你编辑配置文件).于是很多人对这字体就忍气吞声了.其实只要添加一行代码就可以完 ...
- 【函数】Oracle函数系列(2)--数学函数及日期函数
[函数]Oracle函数系列(2)--数学函数及日期函数 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...
- jQuery简单入门(四)
4.表单应用 表单是HTML的重要组成部分,在采集.提交用户输入的信息和显示列表数据等需求中有重要作用 表单应用 一个简单的表单HTML示例: <form action=”url” method ...
- Makefile目标,伪目标,头文件自动依赖
目标 即我们最终要生成的文件,make默认生成第一个目标,注意 makefile中tab和空格不是一回事,规则使用tab缩进,编辑器不要设置诸如"将tab替换为空格之类的选项",目 ...
- 字典dictionary
字典,即我们可以通过索引来查找更详细的内容.每个item都是由一对index:value构成的 索引可以有副本,但是试图根据存在副本的索引访问元素时,只会取最靠后的那个. 索引必须是immutable ...
- ubuntu下apache2 安装 配置 卸载 CGI设置 SSL设置
一.安装.卸载apache2 apache2可直接用命令安装 sudo apt-get install apache2 卸载比较麻烦,必须卸干净,否则会影响ap ...
- Android Fragment初探:静态Fragment组成Activity
一直习惯了在Activity中写所有事件处理代码,直到认真学习Fragment时,才发现,Activity完全可以由多个Fragment组成. 对Fragment的了解还不够深入,先从静态Fragme ...
- FTP上传与下载
1.连接 先假设一个ftp地址 用户名 密码 FTP Server: 192.168.1.125 User: administrator Password: abc123 2. 打开win ...
- Java开发之JSP指令
一.page指令 page指令是最常用的指令,用来说明JSP页面的属性等.JSP指令的多个属性可以写在一个page指令里,也可以写在多个指令里.但需要注意的是,无论在哪个page指令里的属性,任何pa ...
- HDU 2117 取(2堆)石子游戏【wzf博弈】
题意:威佐夫博弈原型,除了输出先手能不能胜,还要输出先手的第一手选择. 思路:预处理出1000000以内的所有奇异局势.对于每个自然数,其必然是某一个奇异局势的a或者b.故对于一个非奇异局势,必定有一 ...