為什么用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)中自帶了
vshadow和
betest工具源碼,經過筆者修正一些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
春秋十二月 閱讀(1477)
評論(0) 編輯 收藏 引用 所屬分類:
Database