• Sql Server数据库快照初探


    什么是快照

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

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

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

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

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

        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.还原源数据库到一个更早的时间,使用数据库快照恢复源数据库

  • 相关阅读:
    aptget 的使用
    NetScaler
    This Android SDK requires Android Developer Toolkit version 10.0.0 or above
    创建menu的时候为什么要用Menu.FIRST常量?
    SQLServer中char、varchar、nchar、nvarchar的区别
    HTTP响应头信息和请求头信息详解
    第十一章 常见字词误用的情形 《英语科技写作(文法与修辞原则)》by 方克涛
    Random类不能产生随机数的情况测试
    将Web Services封装到一个dll
    在DataTable中查找
  • 原文地址:https://www.cnblogs.com/aaronguo/p/3049795.html
Copyright © 2020-2023  润新知