VSS是Windows系統(tǒng)的卷影像拷貝服務(wù),用于解決如下問(wèn)題:
◆ 許多備份工具涉及打開(kāi)文件
◆ 但是若一個(gè)應(yīng)用程序已經(jīng)以獨(dú)占方式打開(kāi)文件并進(jìn)行訪問(wèn)時(shí),備份工具則不能訪問(wèn)該文件
◆ 即使備份工具能夠訪問(wèn)已打開(kāi)的文件,也可能造成備份文件的不一致性
在實(shí)際數(shù)據(jù)災(zāi)備中,主流廠商實(shí)現(xiàn)SQL Server的熱備并不會(huì)使用數(shù)據(jù)庫(kù)自帶的backup database/backup log命令,因?yàn)檫@種方式在應(yīng)急容災(zāi)(此時(shí)源數(shù)據(jù)庫(kù)已宕機(jī))掛載數(shù)據(jù)時(shí)要先還原,而還原要連接數(shù)據(jù)庫(kù)運(yùn)行restore database/restore log命令,這樣就需要部署一臺(tái)機(jī)器裝上SQL Server專用于還原,不僅增大了成本而且延長(zhǎng)了RTO;而使用VSS,備份的就是SQL Server的數(shù)據(jù)文件及日志文件,在應(yīng)急容災(zāi)掛載時(shí)可直接打開(kāi)并用于增刪改查,無(wú)須還原,免去了機(jī)器成本并降低了RTO(只存在數(shù)據(jù)庫(kù)掛載時(shí)的事務(wù)恢復(fù)時(shí)間)。
VSS架構(gòu)
VSS包括Requestor、Writer、Provider和VSS核心模塊四部分,如下圖所示

Requestor在本文中表示熱備份應(yīng)用程序;Writer主要功能是保證數(shù)據(jù)的一致性,使得那些能夠感知影像拷貝的應(yīng)用程序能夠接收到凍結(jié)(freeze)和解凍(thaw)通知,以確保其文件的備份拷貝是內(nèi)在一致的,在本文中即指SQL Server自帶的SQL Writer;Provider主要功能是創(chuàng)建影像拷貝即打快照,允許將ISV特定的存儲(chǔ)方案與影像拷貝服務(wù)集成起來(lái),在本文中即volsnap.sys存儲(chǔ)過(guò)濾型驅(qū)動(dòng)程序,位于文件系統(tǒng)和卷管理器之間;VSS核心模塊即圖中的卷影像拷貝服務(wù),主要功能是協(xié)調(diào)各個(gè)模塊的協(xié)作運(yùn)行,并提供創(chuàng)建及管理卷影像拷貝的API接口。
VSS原理示例

無(wú)論何時(shí),當(dāng)卷影像拷貝驅(qū)動(dòng)程序看到一個(gè)針對(duì)原始卷的寫操作時(shí),它把將要被修改的扇區(qū)的內(nèi)容復(fù)制到一個(gè)與影像卷相關(guān)聯(lián)的、由頁(yè)面文件支持的內(nèi)存區(qū)中
◆ 對(duì)于已修改扇區(qū)的影像卷讀操作,從該內(nèi)存區(qū)中讀取數(shù)據(jù)
◆ 對(duì)于未修改扇區(qū)的影像卷讀操作,從原始卷中讀取
備份應(yīng)用程序、Provider和SQL Writer的局限
◆ 只能備份Windows系統(tǒng)支持的本地文件系統(tǒng)上的文件,不支持遠(yuǎn)程共享或交叉掛載的文件系統(tǒng)
◆ 對(duì)于系統(tǒng)提供者(Windows系統(tǒng)默認(rèn)自帶的Provider,使用寫時(shí)拷貝技術(shù)),被拷貝的源卷不必是NTFS卷,但影像卷必須是NTFS卷
◆ SQL Writer支持全量備份及恢復(fù)、支持差異備份及恢復(fù)和Copy Only備份,但不支持備份連續(xù)事務(wù)日志、文件和文件組,不支持頁(yè)恢復(fù)
怎樣使用VSS
微軟官網(wǎng)提供的VSS SDK 7.2(https://www.microsoft.com/en-us/download/details.aspx?id=23490)中自帶了vshadow和betest工具源碼,經(jīng)過(guò)筆者修正一些bug(win 10 + vs2010),并為了備份配置方便將原來(lái)的文本換成xml格式,成功地實(shí)現(xiàn)了SQL Server的全量熱備及恢復(fù)、差量熱備及恢復(fù)
vshadow用法
以管理員身份在ms-dos窗口下執(zhí)行vshadow.exe /?,可得到所有的幫助
示例
可用vshadow -wm獲取當(dāng)前系統(tǒng)所有寫者的元數(shù)據(jù),再?gòu)闹胁檎襍QL Server Writer的寫者ID及它下面COM組件的邏輯路徑和名稱
betest用法
以管理員身份在ms-dos窗口下執(zhí)行betest.exe /?,可得到所有的幫助
示例
1. 全量備份SQL Server
betest.exe /v /b /t FULL /s backupfull.xml /d f:\backupfull /c SQLWriter.xml
/v -- 輸出詳細(xì)信息,可選的
/b -- 備份
/t -- 備份類型
/s -- 備份/恢復(fù)組件XML格式文檔,內(nèi)含寫者及其下組件的元數(shù)據(jù)(非常重要)
/d -- 備份目錄
/c -- 相關(guān)寫者的配置文件,文件內(nèi)含寫者ID及其下COM組件的邏輯全路徑名
全量恢復(fù)SQL Server
betest.exe /v /r /s backupfull.xml /d f:\backupfull /c SQLWriter.xml
/r -- 恢復(fù)
其它選項(xiàng)說(shuō)明同上,下同
2. 差異備份SQL Server
betest.exe /v /b /t DIFFERENTIAL /s backupdiff.xml /pre backupfull.xml /d f:\backupdiff /c SQLWriter.xml
/pre -- 表示前次基準(zhǔn)的全量備份生成的組件XML格式文檔
差異恢復(fù)SQL Server
a) betest.exe /v /r /AdditionalRestores /s backupfull.xml /d f:\backupfull /c SQLWriter.xml
/AdditionRestores -- 用于差異恢復(fù)的選項(xiàng),表示全量后面需要緊跟差異恢復(fù)才能完成數(shù)據(jù)庫(kù)恢復(fù)
b) betest.exe /v /r /s backupdiff.xml /d f:\backupdiff /c SQLWriter.xml
注意,此時(shí)/s跟的是差異備份生成的backupdiff.xml文件,/d跟的是差異備份目錄
3. SQL Writer配置
xml格式說(shuō)明
writer節(jié)點(diǎn)
id屬性 --- 寫者唯一ID
server_name屬性 --- SQLServer服務(wù)名
stop_restore_start屬性(可選) --- 表示恢復(fù)時(shí)是否先停止數(shù)據(jù)庫(kù)服務(wù)再啟動(dòng),yes表示先停再啟,no則反之,這個(gè)用于恢復(fù)系統(tǒng)數(shù)據(jù)庫(kù)master,因?yàn)閙aster不支持在線恢復(fù)
component節(jié)點(diǎn)
pathname屬性 --- 邏輯路徑名
file節(jié)點(diǎn)
src_path節(jié)點(diǎn) --- SQL Server文件所在路徑的匹配模式
alternate_path節(jié)點(diǎn) --- 恢復(fù)時(shí)的備選路徑,用于合成差異增量
示例
<?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>