随笔-152  评论-223  文章-30  trackbacks-0
为什么用VSS
   VSS是Windows系统的卷影像拷贝服务,用于解决如下问题:
       ◆ 许多备份工具涉及打开文件
       ◆ 但是若一个应用程序已经以独占方式打开文件并进行访问时,备份工具则不能访问该文件
       ◆ 即使备份工具能够访问已打开的文件,也可能造成备份文件的不一致性
   在实际数据灾备中,主流厂商实现SQL Server的热备并不会使用数据库自带的backup database/backup log命令,因为这种方式在应急容灾(此时源数据库已宕机)挂载数据时要先还原,而还原要连接数据库运行restore database/restore log命令,这样就需要部署一台机器装上SQL Server专用于还原,不仅增大了成本而且延长了RTO;而使用VSS,备份的就是SQL Server的数据文件及日志文件,在应急容灾挂载时可直接打开并用于增删改查,无须还原,免去了机器成本并降低了RTO(只存在数据库挂载时的事务恢复时间)。

VSS架构
   VSS包括Requestor、Writer、Provider和VSS核心模块四部分,如下图所示
                            
   Requestor在本文中表示热备份应用程序;Writer主要功能是保证数据的一致性,使得那些能够感知影像拷贝的应用程序能够接收到冻结(freeze)和解冻(thaw)通知,以确保其文件的备份拷贝是内在一致的,在本文中即指SQL Server自带的SQL Writer;Provider主要功能是创建影像拷贝即打快照,允许将ISV特定的存储方案与影像拷贝服务集成起来,在本文中即volsnap.sys存储过滤型驱动程序,位于文件系统和卷管理器之间;VSS核心模块即图中的卷影像拷贝服务,主要功能是协调各个模块的协作运行,并提供创建及管理卷影像拷贝的API接口。

VSS原理示例
                          
   无论何时,当卷影像拷贝驱动程序看到一个针对原始卷的写操作时,它把将要被修改的扇区的内容复制到一个与影像卷相关联的、由页面文件支持的内存区中     
      ◆ 对于已修改扇区的影像卷读操作,从该内存区中读取数据
      ◆ 对于未修改扇区的影像卷读操作,从原始卷中读取

备份应用程序、Provider和SQL Writer的局限
   ◆ 只能备份Windows系统支持的本地文件系统上的文件,不支持远程共享或交叉挂载的文件系统
   ◆ 对于系统提供者(Windows系统默认自带的Provider,使用写时拷贝技术),被拷贝的源卷不必是NTFS卷,但影像卷必须是NTFS卷
   ◆ SQL Writer支持全量备份及恢复、支持差异备份及恢复和Copy Only备份,但不支持备份连续事务日志、文件和文件组,不支持页恢复

怎样使用VSS
   微软官网提供的VSS SDK 7.2(https://www.microsoft.com/en-us/download/details.aspx?id=23490)中自带了vshadowbetest工具源码,经过笔者修正一些bug(win 10 + vs2010),并为了备份配置方便将原来的文本换成xml格式,成功地实现了SQL Server的全量热备及恢复、差量热备及恢复
   vshadow用法
      以管理员身份在ms-dos窗口下执行vshadow.exe /?,可得到所有的帮助
      示例
         可用vshadow -wm获取当前系统所有写者的元数据,再从中查找SQL Server Writer的写者ID及它下面COM组件的逻辑路径和名称
    
   betest用法
      以管理员身份在ms-dos窗口下执行betest.exe /?,可得到所有的帮助
      示例
         1. 全量备份SQL Server
             betest.exe /v /b /t FULL /s backupfull.xml  /d f:\backupfull /c SQLWriter.xml
                /v -- 输出详细信息,可选的
                /b -- 备份
                /t -- 备份类型
                /s -- 备份/恢复组件XML格式文档,内含写者及其下组件的元数据(非常重要)
                /d -- 备份目录
                /c -- 相关写者的配置文件,文件内含写者ID及其下COM组件的逻辑全路径名
     
           全量恢复SQL Server
             betest.exe /v /r /s backupfull.xml  /d f:\backupfull  /c SQLWriter.xml
                /r -- 恢复
                其它选项说明同上,下同 
    
         2. 差异备份SQL Server
            betest.exe /v /b /t DIFFERENTIAL /s backupdiff.xml /pre backupfull.xml /d f:\backupdiff /c SQLWriter.xml
               /pre -- 表示前次基准的全量备份生成的组件XML格式文档
    
           差异恢复SQL Server 
              a) betest.exe /v /r /AdditionalRestores /s backupfull.xml /d f:\backupfull /c SQLWriter.xml
                     /AdditionRestores -- 用于差异恢复的选项,表示全量后面需要紧跟差异恢复才能完成数据库恢复
              b) betest.exe /v /r /s backupdiff.xml /d f:\backupdiff /c SQLWriter.xml 
                     注意,此时/s跟的是差异备份生成的backupdiff.xml文件,/d跟的是差异备份目录

         3. SQL Writer配置
             xml格式说明
               writer节点
                  id属性                                 ---  写者唯一ID
                  server_name属性                 ---  SQLServer服务名
                  stop_restore_start属性(可选) --- 表示恢复时是否先停止数据库服务再启动,yes表示先停再启,no则反之,这个用于恢复系统数据库master,因为master不支持在线恢复
                  component节点 
                     pathname属性                  --- 逻辑路径名
                     file节点
                        src_path节点                 --- SQL Server文件所在路径的匹配模式
                        alternate_path节点        --- 恢复时的备选路径,用于合成差异增量
    
             示例
                <?xml version="1.0" encoding="utf-8"?>
                <betest>
                   <writer id="{a65faa63-5ea8-4ebc-9dbd-a0c4db26912a}"  service_name="MSSQLSERVER" stop_restore_start="no">   
                      <component pathname="DESKTOP-JUP320L\master">                                                 
                         <file>
                            <src_path>E:\*...</src_path>
                            <alternate_path>f:\sqlserver\</alternate_path>              
                         </file>
                     </component>
                     <component pathname="DESKTOP-JUP320L\model">
                        <!--file>
                           <src_path>E:\*...</src_path>
                           <alternate_path>f:\sqlserver\</alternate_path>
                        </file-->
                     </component>    
                     <component pathname="DESKTOP-JUP320L\test">
                        <!--file>
                           <src_path>E:\*...</src_path>
                           <alternate_path>f:\sqlserver\</alternate_path>
                        </file-->
                     </component>
                   </writer>
                 </betest>
posted on 2020-05-02 16:31 春秋十二月 阅读(1375) 评论(0)  编辑 收藏 引用 所属分类: Database

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理