Cách sử dụng Volume Shadow Copy để tạo bản sao lưu


11

Kế hoạch là tạo ra một bản sao bóng của một khối lượng I / O-heavy khá lớn. Đó là 350GB, chứa chỉ mục fulltext dựa trên hệ thống tệp được tổ chức trong hàng trăm thư mục và hàng trăm nghìn tệp nhỏ cần ở trạng thái nhất quán để khôi phục thành công.

Hiện tại bộ chỉ mục bị dừng, tác vụ sao lưu chạy và sau đó bộ chỉ mục được khởi động lại. Điều này dẫn đến chỉ mục không có sẵn trong nhiều giờ trong quá trình sao lưu. Tôi muốn tạo các bản sao lưu nhất quán thông qua bản sao bóng, lý tưởng mà không bao giờ phải dừng trình chỉ mục.

Vì vậy, tôi đã bật Shadow Copy cho âm lượng đó và định cấu hình nó để tạo ảnh chụp nhanh một lần mỗi đêm, sang một âm lượng khác.

Bây giờ tôi hơi thua lỗ - làm thế nào tôi có thể truy cập toàn bộ bản sao bóng để tôi có thể tạo bản sao lưu? Tôi hình dung một ổ đĩa chỉ đọc có chứa các tệp như lúc chúng chụp, nhưng có lẽ mọi thứ hoạt động hoàn toàn khác.

HĐH là Windows Server 2003 SP2, phần mềm sao lưu là CommVault Galaxy 7.0.


EDIT : Lưu ý rằng - trong lúc này - hai câu trả lời đã được tạo để thực hiện các chức năng cần thiết dưới dạng tập lệnh:


Không phải thiên hà đã sử dụng VSS để tạo bản sao lưu? Tôi mơ hồ nhớ rằng commvault là một trong những nhà cung cấp đầu tiên áp dụng giải pháp sao lưu dựa trên VSS
Jim B

@Jim: Có, nhưng chỉ với các tệp bị khóa trên cơ sở tệp này sang tệp khác. Những gì tôi cần là tất cả các tập tin trên ổ đĩa trong một trạng thái nhất quán. Nhưng điều này sẽ không xảy ra trừ khi a) người lập chỉ mục không chạy hoặc b) Tôi có một bản sao chụp nhanh, giống như những gì VSS có thể tạo ra.
Tomalak

VSS không hoạt động như thế - đó là bản sao bóng tối. Nếu nó sử dụng VSS, sự khác biệt duy nhất là không giống như phần mềm sao lưu snaps liên tục của bạn sử dụng snaps tạm thời. Tôi cho rằng một ứng dụng có thể xóa ảnh chụp nhanh trên cơ sở mỗi tệp nhưng không chỉ các bản sao lưu của bạn không nhất quán mà thời gian để sao lưu ngay cả cài đặt windows mặc định sẽ theo thứ tự ngày. Xem msdn.microsoft.com/en-us/l Library / aa384589 (VS85) .aspx để biết sơ đồ về cách xử lý VSS hoạt động. Tôi sẽ liên hệ với commvault và xem họ có thể đảm bảo cấu hình sao lưu của bạn là chính xác không.
Jim B

Câu trả lời:


10

Vì vậy, trong tinh thần sáng tạo lại bánh xe, tôi trình bày cho bạn kịch bản xuất sắc của Tomalak (xem ở trên) nhưng được viết lại hoàn toàn trong Powershell !!! Lý do chính tôi đã làm điều này là để truyền giáo cho sức mạnh tuyệt vời của Powershell, nhưng cũng vì tôi coi thường vbscript với toàn bộ con người tôi.

Nó chủ yếu là tính năng giống hệt nhau, nhưng tôi đã thực hiện một số điều hơi khác nhau vì nhiều lý do. Đầu ra gỡ lỗi chắc chắn dài dòng hơn.

Một điều rất quan trọng cần lưu ý là phiên bản này phát hiện phiên bản HĐH và bitness và gọi phiên bản phù hợp của vshadow.exe. Tôi đã bao gồm một biểu đồ bên dưới để hiển thị phiên bản nào của vshadow.exe sẽ sử dụng, nơi nhận chúng và đặt tên cho chúng.


Đây là thông tin sử dụng:

VssSnapshot.ps1

Description:
  Create, mount or delete a Volume Shadow Copy Service (VSS) Shadow Copy (snapshot)

Usage:
  VssSnapshot.ps1 Create -Target <Path> -Volume <Volume> [-Debug]
  VssSnapshot.ps1 Delete -Target <Path> [-Debug]

Paremeters:
  Create  - Create a snapshot for the specified volume and mount it at the specified target
  Delete  - Unmount and delete the snapshot mounted at the specified target
  -Target - The path (quoted string) of the snapshot mount point
  -Volume - The volume (drive letter) to snapshot
  -Debug  - Enable debug output (optional)

Examples:
  VssSnapshot.ps1 Create -Target D:\Backup\DriveC -Volume C
  - Create a snapshot of volume C and mount it at "D:\Backup\DriveC"

  VssSnapshot.ps1 Delete -Target D:\Backup\DriveC
  - Unmount and delete a snapshot mounted at "D:\Backup\DriveC"

Advanced:
  VssSnapshot.ps1 create -t "c:\vss mount\c" -v C -d
  - Create a snapshot of volume C and mount it at "C:\Vss Mount\C"
  - example mounts snapshot on source volume (C: --> C:)
  - example uses shortform parameter names
  - example uses quoted paths with whitespace
  - example includes debug output

Đây là kịch bản:

# VssSnapshot.ps1
# http://serverfault.com/questions/119120/how-to-use-a-volume-shadow-copy-to-make-backups/119592#119592

Param ([String]$Action, [String]$Target, [String]$Volume, [Switch]$Debug)
$ScriptCommandLine = $MyInvocation.Line
$vshadowPath = "."

# Functions
Function Check-Environment {
  Write-Dbg "Checking environment..."

  $UsageMsg = @'
VssSnapshot

Description:
  Create, mount or delete a Volume Shadow Copy Service (VSS) Shadow Copy (snapshot)

Usage:
  VssSnapshot.ps1 Create -Target <Path> -Volume <Volume> [-Debug]
  VssSnapshot.ps1 Delete -Target <Path> [-Debug]

Paremeters:
  Create  - Create a snapshot for the specified volume and mount it at the specified target
  Delete  - Unmount and delete the snapshot mounted at the specified target
  -Target - The path (quoted string) of the snapshot mount point
  -Volume - The volume (drive letter) to snapshot
  -Debug  - Enable debug output (optional)

Examples:
  VssSnapshot.ps1 Create -Target D:\Backup\DriveC -Volume C
  - Create a snapshot of volume C and mount it at "D:\Backup\DriveC"

  VssSnapshot.ps1 Delete -Target D:\Backup\DriveC
  - Unmount and delete a snapshot mounted at "D:\Backup\DriveC"

Advanced:
  VssSnapshot.ps1 create -t "c:\vss mount\c" -v C -d
  - Create a snapshot of volume C and mount it at "C:\Vss Mount\C"
  - example mounts snapshot on source volume (C: --> C:)
  - example uses shortform parameter names
  - example uses quoted paths with whitespace
  - example includes debug output
'@

  If ($Action -eq "Create" -And ($Target -And $Volume)) {
    $Script:Volume = (Get-PSDrive | Where-Object {$_.Name -eq ($Volume).Substring(0,1)}).Root
    If ($Volume -ne "") {
      Write-Dbg "Verified volume: $Volume"
    } Else {
      Write-Dbg "Cannot find the specified volume"
      Exit-Script "Cannot find the specified volume"
    }
    Write-Dbg "Argument check passed"
  } ElseIf ($Action -eq "Delete" -And $Target ) {
    Write-Dbg "Argument check passed"
  } Else {
    Write-Dbg "Invalid arguments: $ScriptCommandLine"
    Exit-Script "Invalid arguments`n`n$UsageMsg"
  }


  $WinVer = ((Get-WmiObject Win32_OperatingSystem).Version).Substring(0,3)
    Switch ($WinVer) {
    "5.2" {
      $vshadowExe = "vshadow_2003"
      $WinBit = ((Get-WmiObject Win32_Processor)[0]).AddressWidth
    }
    "6.0" {
      $vshadowExe = "vshadow_2008"
      $WinBit = (Get-WmiObject Win32_OperatingSystem).OSArchitecture
    }
    "6.1" {
      $vshadowExe = "vshadow_2008R2"
      $WinBit = (Get-WmiObject Win32_OperatingSystem).OSArchitecture
    }
    Default {
      Write-Dbg "Unable to determine OS version"
      Exit-Script "Unable to determine OS version"
    }
  }

  Switch ($WinBit) {
    {($_ -eq "32") -or ($_ -eq "32-bit")} {$vshadowExe += "_x86.exe"}
    {($_ -eq "64") -or ($_ -eq "64-bit")} {$vshadowExe += "_x64.exe"}
    Default {
      Write-Dbg "Unable to determine OS bitness"
      Exit-Script "Unable to determine OS bitness"
    }
  }

  $Script:vshadowExePath = Join-Path $vshadowPath $vshadowExe
  If (Test-Path $vshadowExePath) {
    Write-Dbg "Verified vshadow.exe: $vshadowExePath"
  } Else {
    Write-Dbg "Cannot find vshadow.exe: $vshadowExePath"
    Exit-Script "Cannot find vshadow.exe"
  }

  Write-Dbg "Environment ready"
}

Function Prepare-Target {
  Write-Log "Preparing target..."
  Write-Dbg "Preparing target $Target"


  If (!(Test-Path (Split-Path $Target -Parent))) {
  Write-Dbg "Target parent does not exist"
  Exit-Script "Invalid target $Target"
  }
  If ((Test-Path $Target)) {
    Write-Dbg "Target already exists"
    If (@(Get-ChildItem $Target).Count -eq 0) {
      Write-Dbg "Target is empty"
    } Else {
      Write-Dbg "Target is not empty"
      Exit-Script "Target contains files/folders"
    }
  } Else {
    Write-Dbg "Target does not exist. Prompting user..."
    $PromptYes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Create target folder"
    $PromptNo = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Do not create target folder"
    $PromptOptions = [System.Management.Automation.Host.ChoiceDescription[]]($PromptYes, $PromptNo)
    $PromptResult = $Host.UI.PromptForChoice("Create folder", "The target folder `"$target`" does not exist.`nWould you like to create the folder?", $PromptOptions, 0) 
    Switch ($PromptResult) {
      0 {
        Write-Dbg "User Accepted. Creating target..."
        $Null = New-Item -Path (Split-Path $Target -Parent) -Name (Split-Path $Target -Leaf) -ItemType "Directory"
      }
      1 {
        Write-Dbg "User declined. Exiting..."
        Exit-Script "Target does not exist"
      }
    }
  }
  Write-Log "Target ""$Target"" ready"
  Write-Dbg """$Target"" ready"
}

Function Create-Snapshot {
  Write-Log "Creating snapshot..."
  Write-Dbg "Creating snapshot of $Volume"
  $Cmd = "$vshadowExePath -p $Volume"
  $CmdResult = Run-Command $Cmd -AsString

  Write-Dbg "Snapshot created successfully"

  $SnapshotID = $CmdResult -Match 'SNAPSHOT ID = (\{[^}]{36}\})'
  If ($SnapshotID) {
    $SnapshotID = $Matches[1]
    Write-Dbg "SnapshotID: $SnapshotID"
    Write-Log "Snapshot $SnapshotID created"
  } Else {
    Write-Dbg "Unable to determine SnapshotID"
    Exit-Script "Unable to determine SnapshotID"
  }

  Return $SnapshotID
}

Function Mount-Snapshot ($SnapshotID) {
  Write-Log "Mounting snapshot..."
  Write-Dbg "Mounting $SnapshotID at ""$Target"""

  $Cmd = "$vshadowExePath `"-el=$SnapshotId,$Target`"" #Must use escaped quotes because Invoke-Expression gets all weird about curly braces
  $CmdResult = Run-Command $Cmd

  Write-Log "Snapshot $SnapshotID mounted at target ""$Target"""
  Write-Dbg "$SnapshotID mounted at ""$Target"""
}

Function Delete-Snapshot {
  Write-Log "Deleting snapshot..."
  Write-Dbg "Deleting snapshot at target ""$Target"""

  $SnapshotID = Get-SnapshotIdbyTarget

  $Cmd = "$vshadowExePath `"-ds=$SnapshotId`""
  $CmdResult = Run-Command $Cmd

  Write-Log "Snapshot $SnapshotID deleted at target ""$Target"""
  Write-Dbg "$SnapshotID deleted at ""$Target"""
}

Function Get-SnapshotIdbyTarget {
  Write-Dbg "Finding SnapshotID for $Target"

  $Cmd = "$vshadowExePath -q"
  $CmdResult = Run-Command $Cmd -AsString

  $TargetRegEx = '(?i)' + $Target.Replace('\','\\') + '\\?\r'
  $Snapshots = ($CmdResult.Split('*')) -Match $TargetRegEx | Out-String

  If ($Snapshots) {
    $Null = $Snapshots -Match '(\{[^}]{36}\})'
    $SnapshotID = $Matches[0]
  } Else {
    Write-Dbg "Unable to determine SnapshotID for target $Target"
    Exit-Script "Unable to determine SnapshotID"
  }  

  Write-Dbg "SnapshotID: $SnapshotID"

  Return $SnapshotID
}

Function Run-Command ([String]$Cmd, [Switch]$AsString=$False, [Switch]$AsArray=$False) {
  Write-Dbg "Running: $Cmd"

  $CmdOutputArray = Invoke-Expression $Cmd
  $CmdOutputString = $CmdOutputArray | Out-String
  $CmdErrorCode = $LASTEXITCODE

  If ($CmdErrorCode -eq 0 ) {
    Write-Dbg "Command successful. Exit code: $CmdErrorCode"
    Write-Dbg $CmdOutputString
  } Else {
    Write-Dbg "Command failed. Exit code: $CmdErrorCode"
    Write-Dbg $CmdOutputString
    Exit-Script "Command failed. Exit code: $CmdErrorCode"
  }

  If (!($AsString -or $AsArray)) {
    Return $CmdErrorCode
  } ElseIf ($AsString) {
    Return $CmdOutputString
  } ElseIf ($AsArray) {
    Return $CmdOutputArray
  }
}

Function Write-Msg ([String]$Message) {
  If ($Message -ne "") {
    Write-Host $Message
  }
}

Function Write-Log ([String]$Message) {
  Write-Msg "[$(Get-Date -Format G)] $Message"
}

Function Write-Dbg ([String]$Message) {
  If ($Debug) {
    Write-Msg ("-" * 80)
    Write-Msg "[DEBUG] $Message"
    Write-Msg ("-" * 80)
  }
}

Function Exit-Script ([String]$Message) {
  If ($Message -ne "") {
    Write-Msg "`n[FATAL ERROR] $Message`n"
  }
  Exit 1
}

# Main
Write-Log "VssSnapshot started"
Check-Environment

Switch ($Action) {
  "Create" {
    Prepare-Target
    $SnapshotID = Create-Snapshot
    Mount-Snapshot $SnapshotID
  }
  "Delete" {
    Delete-Snapshot
  }
}

Write-Log "VssSnapshot finished"

Dưới đây là các phiên bản vshadow.exe để sử dụng:

  1. Windows 2003 / 2003R2
    • Dịch vụ sao chép khối lượng SDK 7.2
    • x86: C: \ Tệp chương trình \ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ release-server \ vshadow.exe
      • Đổi tên thành: vshadow_2003_x86.exe
    • x64: Tôi chưa thể tìm thấy phiên bản x64 của vshadow.exe cho Windows 2003 x64
  2. Windows 2008
    • SDK Windows cho Windows Server 2008 và .NET Framework 3.5
    • x86: C: \ Tệp chương trình \ Microsoft SDKs \ Windows \ v6.1 \ Bin \ vsstools \ vshadow.exe
      • Đổi tên thành: vshadow_2008_x86.exe
    • x64: C: \ Tệp chương trình \ Microsoft SDKs \ Windows \ v6.1 \ Bin \ x64 \ vsstools \ vshadow.exe
      • Đổi tên thành: vshadow_2008_x64.exe
  3. Windows 2008R2
    • Microsoft Windows SDK cho Windows 7 và .NET Framework 4
    • x86: C: \ Tệp chương trình (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ vsstools \ vshadow.exe
      • Đổi tên thành: vshadow_2008R2_x86.exe
    • x64: C: \ Tệp chương trình (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64 \ vsstools \ vshadow.exe
      • Đổi tên thành: vshadow_2008R2_x64.exe

2
btw ... Tôi đã có thể thực hiện điều này như một phần của giải pháp sao lưu của chúng tôi bằng cách sử dụng Arcserve như một bản sao lưu tệp mở của một người nghèo. Tốt hơn là trả $ 800 mỗi máy chủ cho giấy phép đại lý. Nếu ai quan tâm, tôi sẽ đăng ở đây.
John Homer

+1 Điều này khá tuyệt vời. Cảm ơn bạn đã dành thời gian để chuyển bản này sang ps (mặc dù bạn rất ghét VBS) và đã chia sẻ nó ở đây. Tôi hy vọng nhiều người sẽ thấy nó hữu ích, vì điều này chắc chắn xứng đáng với nhiều hơn một phiếu bầu.
Tomalak

9

Vì vậy, tôi đã làm việc với một VBScript nhỏ có thể:

  • chụp ảnh nhanh VSS liên tục
  • gắn kết chúng vào một thư mục (từ đó bạn có thể sao lưu các tập tin)
  • chụp nhanh VSS

Nó dựa vào vshadow.exe( tài liệu ), một phần của Volume Shadow Copy Service SDK 7.2 có sẵn từ Microsoft. Tôi đã làm việc với phiên bản này: " VSHADOW.EXE 2.2 - Máy khách mẫu Volume Shadow Copy, Bản quyền (C) 2005 Microsoft Corporation. "

Về cơ bản, nó là một trình bao bọc nhỏ gọn xung quanh bốn lệnh vshadow này:

vshadow.exe -q - Liệt kê tất cả các bản sao bóng trong hệ thống
vshadow.exe -p {danh sách âm lượng} - Quản lý các bản sao bóng liên tục
vshadow.exe -el = {SnapID}, dir - Hiển thị bản sao bóng dưới dạng điểm gắn kết
vshadow.exe -ds = {SnapID} - Xóa bản sao bóng này

Đây là màn hình trợ giúp của nó:

Công cụ tạo / gắn ảnh chụp nhanh VSS

Sử dụng:
cscript / nologo VssSnapshot.vbs / target: path {/ volume: X | / unmount} [/ gỡ lỗi]

/ volume - ký tự ổ đĩa của âm lượng để chụp nhanh
/ target - đường dẫn (tuyệt đối hoặc tương đối) để gắn ảnh chụp nhanh vào
/ debug - swich trên đầu ra gỡ lỗi

Ví dụ:
cscript / nologo VssSnapshot.vbs / target: C: \ Backup \ DriveD / volume: D
cscript / nologo VssSnapshot.vbs / target: C: \ Backup \ DriveD / unmount

Gợi ý: Không cần ngắt kết nối trước khi chụp ảnh mới.

Ở đây một số đầu ra mẫu:

C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / volume: E
05/03/2010 17:13:04 chuẩn bị điểm gắn kết VSS ...
05/03/2010 17:13:04 điểm gắn kết được chuẩn bị tại: C: \ VssSnapshot \ MountPoints \ E
05/03/2010 17:13:04 tạo ảnh chụp nhanh VSS cho âm lượng: E
05/03/2010 17:13:08 ảnh chụp nhanh được tạo bằng ID: {4ed3a907-c66f-4b20-bda0-9dcda3b667ec}
05/03/2010 17:13:08 Ảnh chụp nhanh VSS được gắn kết thành công
05/03/2010 17:13:08 đã hoàn thành

C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / unmount
05/03/2010 17:13:35 chuẩn bị điểm gắn VSS ...
05/03/2010 17:13:36 không có gì khác để làm
05/03/2010 17:13:36 đã hoàn thành

Và đây là kịch bản chính nó. Tuyên bố từ chối trách nhiệm thông thường được áp dụng: Phần mềm được cung cấp như là, tôi không bảo đảm, sử dụng rủi ro của riêng bạn, nếu một cái gì đó phá vỡ người duy nhất để đổ lỗi là chính bạn. Tôi đã kiểm tra nó khá kỹ lưỡng, mặc dù và nó hoạt động tốt với tôi. Hãy thông báo cho tôi về bất kỳ lỗi nào thông qua các ý kiến ​​dưới đây.

''# VssSnapshot.vbs
''# http://serverfault.com/questions/119120/how-to-use-a-volume-shadow-copy-to-make-backups/119592#119592
Option Explicit

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")

''# -- MAIN SCRIPT -------------------------------------------
Dim args, snapshotId, targetPath, success
Set args = WScript.Arguments.Named
CheckEnvironment

Log "preparing VSS mount point..."
targetPath = PrepareVssMountPoint(args("target"))

If args.Exists("unmount") Then
  Log "nothing else to do"
ElseIf targetPath <> vbEmpty Then
  Log "mount point prepared at: " & targetPath
  Log "creating VSS snapshot for volume: " & args("volume")
  snapshotId = CreateVssSnapshot(args("volume"))

  If snapshotId <> vbEmpty Then
    Log "snapshot created with ID: " & snapshotId
    success = MountVssSnapshot(snapshotId, targetPath)
    If success Then
      Log "VSS snapshot mounted sucessfully"
    Else
      Die "failed to mount snapshot"
    End If
  Else
    Die "failed to create snapshot"
  End If
Else
  Die "failed to prepare mount point"
End If

Log "finished"

''# -- FUNCTIONS ---------------------------------------------
Function PrepareVssMountPoint(target) ''# As String
  Dim cmd, result, outArray
  Dim path, snapshot, snapshotId
  Dim re, matches, match

  PrepareVssMountPoint = VbEmpty
  target = fso.GetAbsolutePathName(target)

  If Not fso.FolderExists(fso.GetParentFolderName(target)) Then 
    Die "Invalid mount point: " & target
  End If

  ''# create or unmount (=delete existing snapshot) mountpoint
  If Not fso.FolderExists(target) Then
    If Not args.Exists("unmount") Then fso.CreateFolder target
  Else
    Set re = New RegExp
    re.MultiLine = False
    re.Pattern = "- Exposed locally as: ([^\r\n]*)"

    cmd = "vshadow -q"
    result = RunCommand(cmd, false)
    outarray = Split(result, "*")

    For Each snapshot In outArray
      snapshotId = ParseSnapshotId(snapshot)
      If snapshotId <> vbEmpty Then
        Set matches = re.Execute(snapshot)
        If matches.Count = 1 Then
          path = Trim(matches(0).SubMatches(0))
          If fso.GetAbsolutePathName(path) = target Then
            cmd = "vshadow -ds=" & snapshotId
            RunCommand cmd, true
            Exit For
          End If
        End If
      End If
    Next

    If args.Exists("unmount") Then fso.DeleteFolder target
  End If

  PrepareVssMountPoint = target
End Function

Function CreateVssSnapshot(volume) ''# As String
  Dim cmd, result

  If Not fso.DriveExists(volume) Then
    Die "Drive " & volume & " does not exist."
  End If

  cmd = "vshadow -p " & Replace(UCase(volume), ":", "") & ":"
  result = RunCommand(cmd, false)
  CreateVssSnapshot = ParseSnapshotId(result)
End Function

Function MountVssSnapshot(snapshotId, target) ''# As Boolean
  Dim cmd, result

  If fso.FolderExists(targetPath) Then
    cmd = "vshadow -el=" & snapshotId & "," & targetPath
    result = RunCommand(cmd, true)
  Else
    Die "Mountpoint does not exist: " & target
  End If

  MountVssSnapshot = (result = "0")
End Function

Function ParseSnapshotId(output) ''# As String
  Dim re, matches, match

  Set re = New RegExp
  re.Pattern = "SNAPSHOT ID = (\{[^}]{36}\})"
  Set matches = re.Execute(output)

  If matches.Count = 1 Then
    ParseSnapshotId = matches(0).SubMatches(0)
  Else
    ParseSnapshotId = vbEmpty
  End If
End Function

Function RunCommand(cmd, exitCodeOnly) ''# As String
  Dim shell, process, output

  Dbg "Running: " & cmd

  Set shell = CreateObject("WScript.Shell")

  On Error Resume Next
  Set process = Shell.Exec(cmd)
  If Err.Number <> 0 Then
    Die Hex(Err.Number) & " - " & Err.Description
  End If
  On Error GoTo 0

  Do While process.Status = 0
    WScript.Sleep 100
  Loop
  output = Process.StdOut.ReadAll

  If process.ExitCode = 0 Then 
    Dbg "OK"
    Dbg output
  Else
    Dbg "Failed with ERRORLEVEL " & process.ExitCode
    Dbg output
    If Not process.StdErr.AtEndOfStream Then 
      Dbg process.StdErr.ReadAll
    End If
  End If  

  If exitCodeOnly Then
    Runcommand = process.ExitCode
  Else
    RunCommand = output
  End If
End Function

Sub CheckEnvironment
  Dim argsOk

  If LCase(fso.GetFileName(WScript.FullName)) <> "cscript.exe" Then
    Say "Please execute me on the command line via cscript.exe!"
    Die ""
  End If

  argsOk = args.Exists("target")
  argsOk = argsOk And (args.Exists("volume") Or args.Exists("unmount"))

  If Not argsOk Then
    Say "VSS Snapshot Create/Mount Tool" & vbNewLine & _
        vbNewLine & _
        "Usage: " & vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:path { /volume:X | /unmount } [/debug]" & _
        vbNewLine & vbNewLine & _
        "/volume  - drive letter of the volume to snapshot" & _
        vbNewLine & _
        "/target  - the path (absolute or relative) to mount the snapshot to" & _
        vbNewLine & _
        "/debug   - swich on debug output" & _
        vbNewLine & vbNewLine & _
        "Examples: " & vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:C:\Backup\DriveD /volume:D" &  vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:C:\Backup\DriveD /unmount" & _
        vbNewLine & vbNewLine & _
        "Hint: No need to unmount before taking a new snapshot." & vbNewLine

    Die ""
  End If
End Sub

Sub Say(message)
  If message <> "" Then WScript.Echo message
End Sub

Sub Log(message)
  Say FormatDateTime(Now()) & " " & message
End Sub

Sub Dbg(message)
  If args.Exists("debug") Then 
    Say String(75, "-")
    Say "DEBUG: " & message
  End If
End Sub

Sub Die(message)
  If message <> "" Then Say "FATAL ERROR: " & message
  WScript.Quit 1
End Sub

Tôi hi vọng nó sẽ giúp ích cho mọi người. Hãy sử dụng nó theo cc-by-sa . Tất cả tôi yêu cầu là bạn để lại liên kết nguyên vẹn mà chỉ trở lại ở đây.


Và bạn đã thực hiện khôi phục hoàn toàn thảm họa dữ liệu từ việc này lên một hệ thống mới chưa? Lấy một bản sao lưu là dễ dàng. Khôi phục từ nó đôi khi không quá nhiều.
Rob Moir

@Robert: Điều này đúng với phương pháp này cũng như đối với bất kỳ loại sao lưu nào khác. Tôi sẽ theo dõi ngay khi điều này được thông qua dàn dựng.
Tomalak

1
+1 vì không chấp nhận không có câu trả lời và cố gắng chứng minh rằng có một giải pháp khả thi ngoài kia rằng một số áp phích khác có thể được cung cấp thay vì trả lời rằng không thể thực hiện được.
Chris Magnuson

Điều này cuối cùng đã cung cấp một bản sao lưu đáng nhớ? Nó có thể được sử dụng với Robocopy?
Kev

1
@Kev: Có, nhưng bạn chắc chắn nên tự kiểm tra. Nếu bạn tìm thấy một vấn đề, xin vui lòng cho tôi biết ở đây. Bạn có thể sử dụng Robocopy hoặc bất kỳ công cụ nào khác mà bạn thích, âm lượng được gắn hoạt động như một ổ đĩa bình thường.
Tomalak

6
  1. Sử dụng lệnh vssadmin list shadowsđể liệt kê tất cả các bản sao bóng có sẵn. Bạn sẽ nhận được một đầu ra như thế này ...
C: \> vssadmin danh sách bóng
vssadmin 1.1 - Công cụ dòng lệnh quản trị Volume Shadow Copy Service
(C) Bản quyền 2001 Microsoft Corp

Nội dung của bộ bản sao bóng ID: {b6f6fb45-bedd-4b77-8f51-14292ee921f3}
   Chứa 1 bản sao bóng tại thời điểm tạo: 25/9/2016 12:14:23 PM
      ID bản sao bóng: {321930d4-0442-4cc6-b2aa-ec47f21d0eb1}
         Tập gốc: (C :) \\? \ Tập {ad1dd231-1200-11de-b1df-806e6f6e6963} \
         Khối lượng bản sao bóng tối: \\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy68
         Máy tạo: joshweb.josh.com
         Máy dịch vụ: joshweb.josh.com
         Nhà cung cấp: 'Nhà cung cấp Microsoft Software Shadow Copy 1.0'
         Loại: ClientAccessable
         Các thuộc tính: Liên tục, Khách hàng có thể truy cập, Không phát hành tự động, Không có người viết, Khác biệt

Nội dung của bộ bản sao bóng ID: {c4fd8646-57b3-4b39-be75-47dc8e7f881d}
   Chứa 1 bản sao bóng tại thời điểm tạo: 25/8/2016 7:00:18 AM
      ID bản sao bóng: {fa5da100-5d90-493c-89b1-5c27874a23c6}
         Tập gốc: (E :) \\? \ Tập {4ec17949-12b6-11de-8872-00235428b661} \
         Khối lượng bản sao bóng tối: \\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy3
         Máy tạo: joshweb.josh.com
         Máy dịch vụ: joshweb.josh.com
         Nhà cung cấp: 'Nhà cung cấp Microsoft Software Shadow Copy 1.0'
         Loại: ClientAccessable
         Các thuộc tính: Liên tục, Khách hàng có thể truy cập, Không phát hành tự động, Không có người viết, Khác biệt

C: \
  1. Lưu ý Shadow Copy Volumetên cho bản sao bóng bạn muốn (dễ nhất vào bảng tạm).

  2. Gắn bản sao bóng tối

Trên Windows 2003 ...

Bạn sẽ cần tải xuống các công cụ bộ tài nguyên cho năm 2003 nếu bạn chưa có nó.

Nhập lệnh ...

linkd c: \ bóng \? \ GLOBALROOT \ Thiết bị \ HarddiskVolumeShadowCopy69 \

... Đâu c:\shadowlà đường dẫn mà bạn muốn bản sao bóng xuất hiện và \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69là tên bạn đã sao chép ở trên. Lưu ý rằng bạn phải thêm dấu gạch chéo ngược ở cuối tên bản sao bóng!

Trên Windows 2008 trở lên ...

Nhập lệnh ...

mklink c: \ bóng \? \ GLOBALROOT \ Thiết bị \ HarddiskVolumeShadowCopy69 \

... Đâu c:\shadowlà đường dẫn mà bạn muốn bản sao bóng xuất hiện và \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69là tên bạn đã sao chép ở trên. Lưu ý rằng bạn phải thêm dấu gạch chéo ngược ở cuối tên bản sao bóng!

  1. Sử dụng bất kỳ công cụ nào bạn muốn (bao gồm cả windows explorer hoặc XCOPY) để truy cập các tệp từ đó c:\shadow.

Vậy ... để tự động hóa việc này, bạn cần phân tích đầu ra từ list shadowsđâu?
Kev

Tôi giống như câu trả lời này nhưng nó không hoàn toàn công việc cho tôi khi gắn \\ \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy_n_ Thay vào đó tôi đã sử dụng các tập tin và ảnh chụp thời gian tham chiếu từ phần gốc (C $ chẳng hạn)? Mklink / DD: \ TempMount \\ localhost \ C $ \ @ GMT-2011.01.01-06.00.08 - thật không may, đây có thể là một quy trình thủ công nhưng đối với trường hợp khẩn cấp, nó hoạt động.
Lewis

2

Bạn đang hiểu sai về cách VSS hoạt động với hệ thống tập tin (cách nó hoạt động với cơ sở dữ liệu là hoàn toàn khác nhau). Trên hệ thống tệp, VSS được sử dụng để triển khai tính năng "Phiên bản trước", chỉ được sử dụng để chụp nhanh thay đổi tệp và thư mục tại các điểm được xác định trước để phục hồi thông qua tab Phiên bản trước trong máy khách. Những thay đổi này sau đó được hợp nhất với dữ liệu trên ổ đĩa để xây dựng bộ khôi phục. Vì vậy, nó phụ thuộc vào âm lượng ban đầu vẫn còn đó để thực hiện khôi phục, nói cách khác là vô dụng cho mục đích sao lưu và khôi phục thích hợp.

Tôi nghĩ bạn cần lùi lại từ cách bạn muốn làm điều này và suy nghĩ lại về những gì bạn muốn làm.

350 GB dữ liệu thực sự không nhiều và tôi sẵn sàng đặt cược rằng tỷ lệ phần trăm được sử dụng tích cực hàng ngày là khá thấp. Bạn đã xem xét thực hiện sao lưu khác biệt hàng đêm với sao lưu đầy đủ chỉ vào cuối tuần? Hoặc sử dụng sao chép DFS theo lịch trình vào bộ lưu trữ thay thế để có được "ảnh chụp nhanh" (sau đó được sao lưu)?


Số lượng thay đổi là khoảng 60 GB mỗi ngày, về mặt sao lưu chênh lệch. Việc ngừng dịch vụ thường xuyên đủ lâu để gây khó chịu cho người dùng, có thể "giờ" hơi phóng đại. Quan điểm của tôi là - khi tôi sao lưu ảnh chụp nhanh VSS vào băng, sau đó tôi có mọi thứ tôi cần để khôi phục dữ liệu thành công. Tôi đang thực hiện một kịch bản làm những gì tôi cần hiện tại, nó trông khá hứa hẹn. Tôi sẽ đăng nó ở đây khi hoàn thành.
Tomalak

@mh: Tôi đã đăng kịch bản của mình. Nó đã trở nên lớn hơn một chút so với dự định của tôi, nhưng nó hoạt động tốt và thuận tiện để sử dụng. Có một cái nhìn! :)
Tomalak

1
-1 Bạn giải thích sai câu hỏi. Anh ta không cố gắng sử dụng VSS làm nguồn sao lưu, anh ta đang cố gắng sử dụng nó để tạo một ảnh chụp nhanh chỉ đọc thời gian của các tệp mà anh ta có thể chuyển vào ổ đĩa băng hoặc một phương tiện khác. Tôi không hiểu tại sao đây không phải là trường hợp sử dụng tuyệt vời cho công nghệ này?
Chris Magnuson

2

Hy vọng đây là những gì bạn muốn:

đĩa mềm -s vssbackup.cfg

vssbackup.cfg:

set context persistent
set metadata E:\backup\result.cab
set verbose on
begin backup
     add volume C: alias ConfigVolume
     create
     EXPOSE %ConfigVolume% Y:
     # Y is your VSS drive
     # run your backup script here
     delete shadows exposed Y:
end backup

đĩa mềm là Windows Server 2008, AFAIK.
Tomalak

@jackbean: Tôi đã tạo một tập lệnh thực hiện điều tương tự cho Windows 2003, vì cho đến nay tôi không tìm thấy điều gì thuyết phục trên Internet. Có một cái nhìn vào câu trả lời của tôi.
Tomalak

Tôi xin lỗi, tôi biết đó là năm 2008, nhưng bằng cách nào đó tôi đã có nó trong đầu, bạn có 2008 R2.
mít

0

Sử dụng API VSS, có thể chụp "ảnh chụp" âm lượng. Sau đó, bạn phải gắn ảnh chụp nhanh đó để sao chép từ nó. Tôi quen thuộc với một sản phẩm đã chết, sử dụng kỹ thuật này để sao chép dữ liệu mặc dù các tệp được mở độc quyền bởi các quy trình khác trong hệ thống tệp trực tiếp. Các câu hỏi hợp lệ có thể được nêu ra về việc các tệp trong ảnh chụp nhanh VSS có tự đồng nhất hay không nếu chúng được viết bởi các ứng dụng không được tích hợp với API VSS. Có thể có những sản phẩm khác cung cấp khả năng tương tự.


@Fred: Đó là những gì tôi đã làm, sử dụng VBScript và công cụ dòng lệnh của Microsoft. Xem câu trả lời của tôi.
Tomalak

-1

Câu trả lời ngắn gọn: Bạn không thể.

Câu trả lời dài hơn một chút: Dịch vụ sao chép bóng có thể được sử dụng theo chương trình thông qua API của nó để cho phép sao lưu các tệp đang mở nhưng dịch vụ không tạo ra các ảnh chụp nhanh hoàn chỉnh của hệ thống, chỉ có các ảnh chụp nhanh một phần.


2
Tôi từ chối tin rằng điều này là không thể. Tôi không cần "ảnh chụp nhanh hệ thống" hoàn chỉnh, chỉ cần một bản sao theo thời gian của một tập duy nhất. Tôi gần như nhận thức được cách thức sao chép bóng hoạt động bên trong và tôi biết rằng nó có thể được sử dụng để tạo bản sao lưu của các tệp đang sử dụng (ví dụ nổi bật trên mạng là cơ sở dữ liệu Exchange hoặc SQL).
Tomalak

1
@ John: Hóa ra là tôi có thể. Hãy nhìn vào câu trả lời của tôi!
Tomalak

Tôi thấy rằng bạn đang sử dụng API giống như phần mềm sao lưu. Vì vậy, trong khi bạn đang sử dụng dịch vụ VSS, nó hoàn toàn khác với việc sử dụng Volume Shadow Copy. Tuy nhiên, nếu nó làm những gì bạn muốn thì đó là tất cả những gì thực sự quan trọng. Làm tốt.
John Gardeniers

1
Câu trả lời ngắn và dài của bạn đều sai và thuật ngữ "Volume Shadow Copy" đã đủ để chỉ ra những gì người dùng đang tìm kiếm ngay cả khi thuật ngữ này hơi mơ hồ. vi.wikipedia.org/wiki/Shadow_Copy
Chris Magnuson

1
Có lẽ là quyền của bạn. Tôi không hiểu câu trả lời của bạn, "Bạn không thể" như thế nào là đúng khi OP tìm ra cách để làm những gì anh ấy mô tả. Câu trả lời dài của bạn không liên quan đến câu hỏi được hỏi vì mặc dù api chỉ cho phép "ảnh chụp nhanh một phần", bạn vẫn có thể gắn đại diện cho toàn bộ âm lượng tại một thời điểm và sao lưu nó như OP mong muốn. Nếu bạn có thể làm rõ ý của bạn trong bài viết gốc của mình để nó được chỉnh sửa để giải quyết những gì OP đã có thể thực hiện, tôi sẽ vui vẻ xóa bỏ phiếu bầu và thêm một thông báo nếu thông tin có liên quan.
Chris Magnuson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.