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
时间: 2024-08-02 15:12:20

SQL基础之数据库快照的相关文章

SQL Server 创建数据库快照

创建数据库快照: 必须在create database 命令中包括源数据库的每一个数据文件,原始逻辑名,新物理名与路径, 不能指定其他属性 create database db_snapshot_name on (....)[,(....)....] as snapshot of db_name; ------------------------------- 例子: create database studio_snapshot      on(name = 'studio',filename

SQL基础之数据库

1.基础概念 首先要强调一点,就是我们的数据库是由数据库系统来管理的,我们登入数据库并在其上进行操作时最终均要通过数据库系统来完成.可以理解成在数据库上进行操作的是客户端,数据库系统是服务端.一个数据库由具体的数据和数据库对象组成,可将数据库看成一个大容器,里面除了存储数据还有描述这些数据信息的对象,比如表.视图.索引等都是这个数据库里面的对象.我们知道数据库中有4个系统数据库,它们是数据库系统在运行过程中存储数据和记录相关信息的重要组成部分.它们的作用如下所示. (1)master数据库,如其

SQL Server 从数据库快照还原数据库

语法: restore database db_name from database_snapshot  = 'db_snapshot_name'; ---------------------------------------------------------------------------------------------------------------------------------- 例子: restore database AdventrueWorks2012 from

[整理]数据库镜像与数据库快照

http://wuxinaiaman928.blog.163.com/blog/static/64932144200861035432565 在SQL Server2005课程中提到了数据库快照与数据库镜像的问题,这两个功能都是在SQL2005中增加的新特性,由于上课时间有限,没有时间进行详细的阐述,现将相关资料发布在上面,希望学员能够认真学习,加以领会.   数据库镜像是SQL Server 2005的一个新特性,它允许你将一个SQL Server中的数据库内容镜像到另一个SQL Server

11、SQL Server 视图、数据库快照

SQL Server 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中的几列数据,无需授予用户访问基础表的权限,取而代之的是授予视图访问权限. 为什么用视图? 1.如果是比较复杂的多表联查,可以将这些复杂的语句放在视图中完成,而我们只需要使用简单的语句查询视图即可. 2.保护基础表,敏感列无法被检索出. 3.对视图添加索引,可以提高效率. 创建视图 1.可以使用SSM

[SQL] SQL 基础知识梳理(一)- 数据库与 SQL

SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 序 目录 What's 数据库 数据库结构 SQL 概要 创建表 删除和更新表 1-1 What's 数据库 1.数据库(Database,DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.如:大型-银行存储的信息,小型-电话簿. 2.数据库管理系统(Batabase Management Syste

数据库复习2——SQL基础

数据库复习 CH4 SQL SQL(Structured Query Language,结构化查询语言)是通用的关系数据库系统操作语言,下面从几个方面来复习SQL基础 4.1 DDL SQL语句可根据其操作性质分成三类: DDL(Data Definition Language) DCL(Data Constraint Language) DML(Data Manipulation Language) DCL完成完整性和安全性的约束,也可以看作从属于DDL,下面介绍DCL除外的DDL部分SQL语

SQL Server中使用数据库快照的方式来完成测试环境中数据库的轻量级备份还原操作

原文:SQL Server中使用数据库快照的方式来完成测试环境中数据库的轻量级备份还原操作 在开发或者测试环境的数据库中,经常会发现有开发或者测试人员误删除表或者数据的情况,对于开发或者测试库,一般都没有安排定时的备份任务去备份数据库,一方面是由于存储资源有限,不太可能给开发或者测试环境准备大量的存储空间,二是必要性不是很强,开发或者测试库的数据库对象变化太多,通过还原备份的方式又有可能冲掉其最近新建的数据库对象.但是不得不面对的问题就是个别人在执行update或者delete操作的时候“忘了加

Oracle数据库之SQL基础和分支循环

一.SQL基础语言 DECLARE --声明 a varchar2(10); --变量或对象 BEGIN a:='小明';-- := 表示给一个变量赋值 dbms_output.put_line(a); --输出用 dbms_output.put_line() END; 二.分支 DECLARE --声明 A NUMBER(10); B NUMBER(10); BEGIN A := 2; B := 3; IF A < B THEN DBMS_OUTPUT.PUT_LINE('a小于b'); EL