您的位置:新葡亰496net > 网络数据库 > 新葡亰496net:Server数据库快速照相初探,Server中

新葡亰496net:Server数据库快速照相初探,Server中

发布时间:2019-09-15 20:17编辑:网络数据库浏览(62)

    简介
        数据库快照,正如其名称所示那样,是数据库在某一时间点的视图。快照设计最开始的目的是为了报表服务。比如我需要出2011的资产负债表,这需要数据保持在2011年12月31日零点时的状态,则利用快照可以实现这一点。快照还可以和镜像结合来达到读写分离的目的。下面我们来看什么是快照。
     
    什么是快照
        数据库快照是 SQL Server 数据库(源数据库)的只读静态视图。换句话说,快照可以理解为一个只读的数据库。利用快照,可以提供如下好处:
        提供了一个静态的视图来为报表提供服务
        可以利用数据库快照来恢复数据库,相比备份恢复来说,这个速度会大大提高(在下面我会解释为什么)
        和数据库镜像结合使用,提供读写分离
        作为测试环境或数据变更前的备份,比如我要大批导入或删除数据前,或是将数据提供给测试人员进行测试前,做一个快照,如果出现问题,则可以利用快照恢复到快照建立时的状态
     
    快照的原理
        与备份数据库复制整个数据库不同,快照并不复制整个数据库的页,而是仅仅复制在快照建立时间点之后改变的页。因此,当利用快照进行数据库恢复时,也仅仅将那些做出改变的页恢复到源数据库,这个速度无疑会大大高于备份和恢复方式。这个原理如图1所示(图摘自SQL Server 2008揭秘)。
        
        图1.镜像的原理

    简介

        数据库快照,正如其名称所示那样,是数据库在某一时间点的视图。是SQL Server在2005之后的版本引入的特性。快照的应用场景比较多,但快照设计最开始的目的是为了报表服务。比如我需要出2011的资产负债表,这需要数据保持在2011年12月31日零点时的状态,则利用快照可以实现这一点。快照还可以和镜像结合来达到读写分离的目的。下面我们来看什么是快照。

     

    什么是快照

        数据库快照是 SQL Server 数据库(源数据库)的只读静态视图。换句话说,快照可以理解为一个只读的数据库。利用快照,可以提供如下好处:

    •     提供了一个静态的视图来为报表提供服务
    •     可以利用数据库快照来恢复数据库,相比备份恢复来说,这个速度会大大提高(在下面我会解释为什么)
    •     和数据库镜像结合使用,提供读写分离
    •     作为测试环境或数据变更前的备份,比如我要大批导入或删除数据前,或是将数据提供给测试人员进行测试前,做一个快照,如果出现问题,则可以利用快照恢复到快照建立时的状态

       新葡亰496net 1

    什么是快照

        数据库快照是 SQL Server 数据库(源数据库)的只读静态视图。换句话说,快照可以理解为一个只读的数据库。利用快照,可以提供如下好处:

    •     提供了一个静态的视图来为报表提供服务
    •     可以利用数据库快照来恢复数据库,相比备份恢复来说,这个速度会大大提高(在下面我会解释为什么)
    •     和数据库镜像结合使用,提供读写分离
    •     作为测试环境或数据变更前的备份,比如我要大批导入或删除数据前,或是将数据提供给测试人员进行测试前,做一个快照,如果出现问题,则可以利用快照恢复到快照建立时的状态

     

    写入时复制(Copy On Writing)和稀疏文件(Sparse Flie)

        快照数据库的文件是基于稀疏文件(Sparse File),稀疏文件是NTFS文件系统的一项特性。所谓的稀疏文件,是指文件中出现大量0的数据,这些数据对我们用处并不大,却一样占用着磁盘空间。因此NTFS对此进行了优化,利用算法将这个文件进行压缩。因此当稀疏文件被创建时,稀疏文件刚开始大小会很小(甚至是空文件),比如图3所示的文件就是一个稀疏文件。虽然逻辑上占了21M,但文件实际上占了128KB磁盘空间。

        由图1可以看出,快照并不是复制整个整个数据库,而仅仅利用快照存储原始页。因此可以看出,源数据库上建立快照会给IO增加额外负担.当对快照数据库进行查询时,快照时间点之后更改的数据会查询数据文件,。这个概念如图2所示(图摘自SQL Server 2008揭秘)。
        新葡亰496net 2

    新葡亰496net,快照的原理

        与备份数据库复制整个数据库不同,快照并不复制整个数据库的页,而是仅仅复制在快照建立时间点之后改变的页。因此,当利用快照进行数据库恢复时,也仅仅将那些做出改变的页恢复到源数据库,这个速度无疑会大大高于备份和恢复方式。这个原理如图1所示(图摘自SQL Server 2008揭秘)。

        新葡亰496net 3

        图1.镜像的原理

       

        由图1可以看出,快照并不是复制整个整个数据库,而仅仅利用快照存储原始页。因此可以看出,源数据库上建立快照会给IO增加额外负担.当对快照数据库进行查询时,快照时间点之后更改的数据会查询数据文件,。这个概念如图2所示(图摘自SQL Server 2008揭秘)。

        新葡亰496net 4

        图2.查询快照数据库时查询的分布

     

    使用快照其他一些需要考虑的因素

        1.快照数据库的安全设置继承源数据库的安全设置。也就是说能访问源数据库的用户或角色也能访问快照数据库,当然,因为快照数据库是只读的,所以无论任何角色或人都无法修改快照数据库。

        2.我们由文章前面图5看出,随着快照存在的时间越来越长,快照会不断增长。所以推荐在快照达到源数据库大小30%之前,重新创建快照。

        3.由于快照会拖累数据库性能,所以数据库不宜存在过多快照。

    创建数据库快照**  **

    --检索数据库相关信息
    use DBTest
    go
    execute sp_helpfile
    go
    
    ---创建DBTest数据库快照
    create database DBTest_Snap on
    (name=DBTest,filename='D:SQLbakDBTest_Snap.snap')
    as snapshot of DBTest;
    go
    
    
    --查看sys.databases目录视图source_database_id列,为null则为常规数据库,不为null则是数据库快照的源数据库的ID
    select * from sys.databases
    
    --动态管理视图sys.dm_io_virtual_file_stats查看数据库快照大小
    SELECT database_id,size_on_disk_bytes 
    FROM sys.dm_io_virtual_file_stats(DB_ID('DBTest_Snap'),1)
    
    
    --还原DBTest数据库到DBTest_Snap数据库快照.(错误:3137)如果源数据库有多个数据库快照,尝试还原到某一个数据库快照
    use master
    go
    restore database DBTest
    from database_snapshot='DBTest_Snap'
    go
    
    --删除数据库快照与删除常规数据库一样
    Drop database DBTest_Snap
    
    --测试执行大量数据时先做一次数据库快照,以便误操作时恢复
    create database DBTest_Snap_am
    ON ( NAME = DBTest_Snap1, FILENAME= 'D:SQLbakDBTest_Snap1.snap'),
       ( NAME = DBTest_Snap2, FILENAME= 'D:SQLbakDBTest_Snap2.snap')
    AS SNAPSHOT OF DBTest
    go
    

    使用数据库快照一些常规用途
      1.不阻塞生产/源数据库的情况下生成报告

      2.维护历史数据

      3.在数据库镜像上执行报告

      4.从用户或者管理错误操作后恢复

      5.还原源数据库到一个更早的时间,使用数据库快照恢复源数据库

        图2.查询快照数据库时查询的分布
    写入时复制(Copy On Writing)和稀疏文件(Sparse Flie)
        由上图中可以看出,快照数据库的文件是基于稀疏文件(Sparse File),稀疏文件是NTFS文件系统的一项特性。所谓的稀疏文件,是指文件中出现大量0的数据,这些数据对我们用处并不大,却一样占用着磁盘空间。因此NTFS对此进行了优化,利用算法将这个文件进行压缩。因此当稀疏文件被创建时,稀疏文件刚开始大小会很小(甚至是空文件),比如图3所示的文件就是一个稀疏文件。虽然逻辑上占了21M,但文件实际上占了128KB磁盘空间。
        
        图3.一个稀疏文件
       新葡亰496net 5

    写入时复制(Copy On Writing)和稀疏文件(Sparse Flie)

        由上图中可以看出,快照数据库的文件是基于稀疏文件(Sparse File),稀疏文件是NTFS文件系统的一项特性。所谓的稀疏文件,是指文件中出现大量0的数据,这些数据对我们用处并不大,却一样占用着磁盘空间。因此NTFS对此进行了优化,利用算法将这个文件进行压缩。因此当稀疏文件被创建时,稀疏文件刚开始大小会很小(甚至是空文件),比如图3所示的文件就是一个稀疏文件。虽然逻辑上占了21M,但文件实际上占了128KB磁盘空间。

        新葡亰496net 6

        图3.一个稀疏文件

       

        对于快照来说,除了通过快照数据库文件的属性来看快照的大小之外,也可以通过DMV来查看,如图4所示.

        新葡亰496net 7

        图4.通过DMV查看快照数据库大小

    新葡亰496net:Server数据库快速照相初探,Server中的快照。    

        而当快照创建后,随着对源数据库的改变逐渐增多,稀疏文件也会慢慢增长,概念如图4所示。

        新葡亰496net 8

        图5.随着源数据库的更改越来越多,稀疏文件不断增长

     

        所以,通常来说,当稀疏文件增长到源数据库文件大小的30%时,就应该考虑重建快照了。

        而稀疏文件的写入是利用了微软的写入时复制技术(Copy-On-Writing),意思是在复制一个对象时并不是真正把对象复制到另一个位置,而是在新的对象中映射一个指针,指向原对象的位置。这样当对新对象执行读操作时,直接指向原对象。而在对新的对象执行写操作时,将改变部分对象的指针指向到新的地址中。并修改映射表到新的位置中。

     

        对于快照来说,除了通过快照数据库文件的属性来看快照的大小之外,也可以通过DMV来查看,如图4所示.
        新葡亰496net 9

    使用快照的限制

        使用快照存在诸多限制,由于列表太长(详细请参考MSDN:),我只概括的说一下主要限制。

    •     当使用快照恢复数据库时,首先要删除其他快照
    •     快照在创建时的时间点上没有commit的数据不会被记入快照
    •     快照是快照整个数据库,而不是数据库的某一部分
    •     快照是只读的,意思是不能在快照上加任何更改,即使是你想加一个让报表跑得更快的索引
    •     在利用快照恢复数据库时,快照和源数据库都不可用
    •     快照和源数据必须在同一个实例上
    •     快照数据库的文件必须在NTFS格式的盘上
    •     当磁盘不能满足快照的增长时,快照数据库会被置为suspect状态
    •     快照上不能存在全文索引

        其实,虽然限制看上去很多,但只要明白快照的原理,自然能推测出快照应该有的限制。

     

        图4.通过DMV查看快照数据库大小
        
        而当快照创建后,随着对源数据库的改变逐渐增多,稀疏文件也会慢慢增长,概念如图4所示。
        新葡亰496net 10

    快照的创建和使用

        无论是使用SSMS或是命令行,快照只能通过T-SQL语句创建。在创建数据库之前,首先要知道数据库分布在几个文件上,因为快照需要对每一个文件进行copy-on-writing。如图6所示。

        新葡亰496net 11

        图6.首先查出数据库的文件分布

      

        根据图6的数据库分布,我们通过T-SQL创建快照,如图7所示。

        新葡亰496net 12

        图7,根据图6的数据库信息创建一个数据库快照

     

         当快照数据库创建成功后,就可以像使用普通数据库一样使用快照数据库了,如图8所示。

        新葡亰496net 13

        图8.快照数据库和普通数据库一样使用

     

        通过如下语句可以看到,快照数据库文件和源数据库的文件貌似并无区别,仅仅是快照数据库文件是稀疏文件,如图9所示。

    新葡亰496net:Server数据库快速照相初探,Server中的快照。    新葡亰496net 14

        图9.源数据库和快照数据库

     

        而删除快照数据库和删除普通数据库并无二至,也仅仅是使用DROP语句,如图10所示。

        新葡亰496net 15

        图10.删除快照数据库

     

        我们也可以利用快照恢复数据库,这个恢复速度要比普通的备份-恢复来的快得多,这也可以将数据库呈现给测试人员,当测试结束后,恢复数据库到测试之前的状态。如图11所示。

        新葡亰496net 16

        图11.利用快照恢复数据库

     

        图5.随着源数据库的更改越来越多,稀疏文件不断增长
     
        所以,通常来说,当稀疏文件增长到源数据库文件大小的30%时,就应该考虑重建快照了。
        而稀疏文件的写入是利用了微软的写入时复制技术(Copy-On-Writing),意思是在复制一个对象时并不是真正把对象复制到另一个位置,而是在新的对象中映射一个指针,指向原对象的位置。这样当对新对象执行读操作时,直接指向原对象。而在对新的对象执行写操作时,将改变部分对象的指针指向到新的地址中。并修改映射表到新的位置中。
     
    使用快照的限制
        使用快照存在诸多限制,由于列表太长(详细请参考MSDN:),我只概括的说一下主要限制。
        当使用快照恢复数据库时,首先要删除其他快照
        快照在创建时的时间点上没有commit的数据不会被记入快照
        快照是快照整个数据库,而不是数据库的某一部分
        快照是只读的,意思是不能在快照上加任何更改,即使是你想加一个让报表跑得更快的索引
        在利用快照恢复数据库时,快照和源数据库都不可用
        快照和源数据必须在同一个实例上
        快照数据库的文件必须在NTFS格式的盘上
        当磁盘不能满足快照的增长时,快照数据库会被置为suspect状态
        快照上不能存在全文索引
        其实,虽然限制看上去很多,但只要明白快照的原理,自然能推测出快照应该有的限制。
     
    快照的创建和使用
        无论是使用SSMS或是命令行,快照只能通过T-SQL语句创建。在创建数据库之前,首先要知道数据库分布在几个文件上,因为快照需要对每一个文件进行copy-on-writing。如图6所示。
        新葡亰496net 17

    使用快照其他一些需要考虑的因素

        1.快照数据库的安全设置继承源数据库的安全设置。也就是说能访问源数据库的用户或角色也能访问快照数据库,当然,因为快照数据库是只读的,所以无论任何角色或人都无法修改快照数据库。

        2.我们由文章前面图5看出,随着快照存在的时间越来越长,快照会不断增长。所以推荐在快照达到源数据库大小30%之前,重新创建快照。

        3.由于快照会拖累数据库性能,所以数据库不宜存在过多快照。

     

        图6.首先查出数据库的文件分布
      
        根据图6的数据库分布,我们通过T-SQL创建快照,如图7所示。
        新葡亰496net 18

    总结

        本文简单讲述了数据库快照的概念,原理以及使用。数据库快照可以在很多场景下使用,无论是用于报表,还是和镜像配合提供负载,以及利用快照恢复数据库,使用得当的话,快照将会是一把利器。

       

         本文示例代码猛击这里

        图7,根据图6的数据库信息创建一个数据库快照
     
         当快照数据库创建成功后,就可以像使用普通数据库一样使用快照数据库了,如图8所示。
        新葡亰496net 19

        图8.快照数据库和普通数据库一样使用
     
        通过如下语句可以看到,快照数据库文件和源数据库的文件貌似并无区别,仅仅是快照数据库文件是稀疏文件,如图9所示。
        新葡亰496net 20

        图9.源数据库和快照数据库
     
        而删除快照数据库和删除普通数据库并无二至,也仅仅是使用DROP语句,如图10所示。
        新葡亰496net 21

        图10.删除快照数据库
     
        我们也可以利用快照恢复数据库,这个恢复速度要比普通的备份-恢复来的快得多,这也可以将数据库呈现给测试人员,当测试结束后,恢复数据库到测试之前的状态。如图11所示。
        新葡亰496net 22

        图11.利用快照恢复数据库
     
    使用快照其他一些需要考虑的因素
        1.快照数据库的安全设置继承源数据库的安全设置。也就是说能访问源数据库的用户或角色也能访问快照数据库,当然,因为快照数据库是只读的,所以无论任何角色或人都无法修改快照数据库。
        2.我们由文章前面图5看出,随着快照存在的时间越来越长,快照会不断增长。所以推荐在快照达到源数据库大小30%之前,重新创建快照。
        3.由于快照会拖累数据库性能,所以数据库不宜存在过多快照。
    总结
        本文简单讲述了数据库快照的概念,原理以及使用。数据库快照可以在很多场景下使用,无论是用于报表,还是和镜像配合提供负载,以及利用快照恢复数据库,使用得当的话,快照将会是一把利器。
    转载于

    本文由新葡亰496net发布于网络数据库,转载请注明出处:新葡亰496net:Server数据库快速照相初探,Server中

    关键词: