Yedekler oluşturmak için Birim Gölge Kopyası nasıl kullanılır


11

Plan, oldukça büyük, I / O-ağır birimin gölge bir kopyasını oluşturmaktır. Başarılı bir geri yükleme için tutarlı bir durumda olması gereken yüzlerce klasörde ve yüz binlerce küçük dosyada düzenlenmiş dosya sistemi tabanlı bir tam metin dizini içeren 350 GB.

Şu anda dizin oluşturucu durdurulur, yedekleme görevi çalışır ve ardından dizin oluşturucu yeniden başlatılır. Bu, dizinin yedekleme sırasında saatlerce kullanılamamasına neden olur. İdeal olarak dizinleyiciyi hiç durdurmak zorunda kalmadan, gölge kopya ile tutarlı yedeklemeler yapmak istiyorum.

Böylece, bu birim için Gölge Kopya'yı açtım ve her gece bir kez farklı bir birime anlık görüntü yapacak şekilde yapılandırdım.

Şimdi biraz kayboldum - gölge kopyaya bir bütün olarak nasıl erişebilirim, böylece bir yedekleme yapabilirim? Dosyaları, son anlık görüntü anında olduğu gibi içeren salt okunur bir sürücü öngörüyorum, ancak belki de işler tamamen farklı çalışıyor.

İşletim sistemi Windows Server 2003 SP2, yedekleme yazılımı CommVault Galaxy 7.0.


DÜZENLEME : Bu arada, gerekli işlevselliği bir komut dosyası biçiminde uygulayan iki yanıt oluşturulduğunu unutmayın:


Commvault galaxy yedeklemeyi oluşturmak için zaten VSS kullanmıyor mu? Belirgin bir VSS tabanlı yedekleme çözümü uygulayan ilk satıcılardan biri olduğunu hatırlıyorum
Jim B

@Jim: Evet, ancak sadece dosyadan dosyaya kilitli dosyalar için. İhtiyacım olan , sürücüdeki tüm dosyaların tutarlı bir durumda olması. Ancak bu olmazsa a) Dizin oluşturucu çalışmaz veya b) VSS'nin yapabileceği gibi bir anlık görüntü kopyam var.
Tomalak

VSS böyle çalışmaz - bu bir VOLUME gölge kopyasıdır. VSS kullanıyorsa, kalıcı snaps aksine tek fark theat olduğunu yedekleme yazılımı geçici snaps kullanır. Bir uygulamanın dosya başına anlık görüntü silme yapabileceğini, ancak yedeklemelerinizin tutarsız olmasını değil, varsayılan bir Windows yüklemesini bile yedekleme zamanının gün sırasına göre olacağını varsayalım. VSS işlemenin nasıl çalıştığına dair bir diyagram için bkz. Msdn.microsoft.com/en-us/library/aa384589(VS.85).aspx . Commvault ile iletişime geçerek yedekleme yapılandırmanızın doğru olup olmadığını görebilirim.
Jim B

Yanıtlar:


10

Bu yüzden tekerleği yeniden icat etme ruhuyla, size Tomalak'ın mükemmel senaryosunu (yukarıya bakın) sunuyorum ama tamamen Powershell'de yeniden yazılmış !!! Bunu yapmamın ana nedeni, Powershell'in müthiş güçlerini evangelize etmekti, ama aynı zamanda vbscript'i tüm varlığımla hor gördüğüm için.

Çoğunlukla özdeş olma özelliğine sahiptir, ancak çeşitli nedenlerle bazı şeyleri biraz farklı uyguladım. Hata ayıklama çıktısı kesinlikle daha ayrıntılıdır.

Dikkat edilmesi gereken çok önemli bir şey, bu sürümün işletim sistemi sürümünü ve bitini algılaması ve vshadow.exe dosyasının uygun sürümünü çağırmasıdır. Hangi vshadow.exe sürümlerinin kullanılacağını, nereden alınacağını ve ne adlandırılacağını gösteren bir grafik ekledim.


Kullanım bilgileri:

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

İşte senaryo:

# 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"

Kullanmak için vshadow.exe sürümleri şunlardır:

  1. Windows 2003 / 2003R2
    • Birim Gölge Kopyası Hizmeti SDK 7.2
    • x86: C: \ Program Dosyaları \ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ release-server \ vshadow.exe
      • Yeniden adlandır: vshadow_2003_x86.exe
    • x64: Windows 2003 x64 için vshadow.exe dosyasının x64 sürümünü bulamadım
  2. Windows 2008
    • Windows Server 2008 ve .NET Framework 3.5 için Windows SDK'sı
    • x86: C: \ Program Dosyaları \ Microsoft SDKs \ Windows \ v6.1 \ Bin \ vsstools \ vshadow.exe
      • Yeniden adlandır: vshadow_2008_x86.exe
    • x64: C: \ Program Dosyaları \ Microsoft SDKs \ Windows \ v6.1 \ Bin \ x64 \ vsstools \ vshadow.exe
      • Yeniden adlandır: vshadow_2008_x64.exe
  3. Windows 2008R2
    • Windows 7 ve .NET Framework 4 için Microsoft Windows SDK'sı
    • x86: C: \ Program Dosyaları (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ vsstools \ vshadow.exe
      • Yeniden adlandır: vshadow_2008R2_x86.exe
    • x64: C: \ Program Dosyaları (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64 \ vsstools \ vshadow.exe
      • Yeniden adlandır: vshadow_2008R2_x64.exe

2
btw ... Arcserve'i fakir bir adamın açık dosya yedeklemesi olarak kullanarak yedekleme çözümümüzün bir parçası olarak bunu başardım. Ajan lisansı için sunucu başına 800 $ ödemekten daha iyidir. Eğer ilgilenen varsa, buraya göndereceğim.
John Homer

+1 Bu oldukça şaşırtıcı. Bunu ps'ye taşımak için zaman ayırdığınız (VBS nefretinize rağmen) ve burada paylaştığınız için teşekkür ederiz. Umarım daha fazla insan bunu faydalı bulur, çünkü bu kesinlikle birden fazla oylamayı hak eder.
Tomalak

9

Yani… Ben yapabilir bir küçük VBScript üzerinde çalışıyorum:

  • kalıcı VSS anlık görüntüleri alın
  • onları bir klasöre bağlayın (daha sonra dosyaları yedekleyebilirsiniz)
  • VSS anlık görüntülerinin bağlantısını kes

Microsoft'tan edinilebileceği gibi Birim Gölge Kopyası Hizmeti SDK 7.2'nin bir parçası olan vshadow.exe( belgeler ) temeline dayanır . Bu sürümle çalışıyorum: " VSHADOW.EXE 2.2 - Birim Gölge Kopya örnek istemcisi, Telif Hakkı (C) 2005 Microsoft Corporation. "

Temel olarak, bu dört vshadow komutu etrafında düzgün bir küçük sarıcıdır:

vshadow.exe -q - Sistemdeki tüm gölge kopyaları listele
vshadow.exe -p {cilt listesi} - Kalıcı gölge kopyaları yönetir
vshadow.exe -el = {SnapID}, dir - Gölge kopyayı bağlama noktası olarak göster
vshadow.exe -ds = {SnapID} - Bu gölge kopyayı siler

İşte yardım ekranı:

VSS Anlık Görüntü Oluşturma / Montaj Aracı

Kullanımı:
cscript / nologo VssSnapshot.vbs / target: yol {/ birim: X | / unmount} [/ debug]

/ volume - anlık görüntüye birimin sürücü harfi
/ target - anlık görüntüyü bağlayacağınız yol (mutlak veya göreli)
/ debug - hata ayıklama çıktısında swich

Örnekler:
cscript / nologo VssSnapshot.vbs / target: C: \ Yedekleme \ DriveD / birim: D
cscript / nologo VssSnapshot.vbs / target: C: \ Yedekleme \ DriveD / bağlantısını kes

İpucu: Yeni bir fotoğraf çekmeden önce bağlantısını kesmenize gerek yoktur.

İşte bazı örnek çıktı:

C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / birim: E
05/03/2010 17:13:04 VSS bağlama noktası hazırlanıyor ...
05/03/2010 17:13:04 montaj noktası şu konumda hazırlandı: C: ​​\ VssSnapshot \ MountPoints \ E
05/03/2010 17:13:04 cilt için VSS anlık görüntüsü oluşturma: E
05/03/2010 17:13:08 ID ile oluşturulan anlık görüntü: {4ed3a907-c66f-4b20-bda0-9dcda3b667ec}
05/03/2010 17:13:08 VSS anlık görüntüsü başarıyla monte edildi
05/03/2010 17:13:08 bitti

C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / bağlantısını kes
05/03/2010 17:13:35 VSS bağlama noktası hazırlanıyor ...
05/03/2010 17:13:36 yapacak başka bir şey yok
05/03/2010 17:13:36 bitti

Ve işte senaryonun kendisi. Her zamanki yasal uyarı geçerlidir: Yazılım olduğu gibi sağlanmıştır, hiçbir garanti vermem, kendi sorumluluğunuzdadır, eğer bir şey kırılırsa suçlanacak tek kişi kendinizdir. Yine de oldukça kapsamlı bir şekilde test ettim ve benim için iyi çalışıyor. Aşağıdaki yorumlar aracılığıyla herhangi bir hatayı bana bildirmekten çekinmeyin.

''# 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

Umarım bu birine yardımcı olur. Cc-by-sa'ya göre kullanmaktan çekinmeyin . Tek istediğim, buraya işaret eden bağlantıyı olduğu gibi bırakmanız.


Ve bundan yeni bir sisteme verinin tamamen felaket kurtarmasını yaptınız mı? Yedek almak kolaydır. Ondan geri yükleme bazen çok fazla değil.
Rob Moir

@Robert: Bu, bu yaklaşım için diğer her türlü yedekleme için olduğu kadar doğrudur. Sahneleme yoluyla olur olmaz takip edeceğim.
Tomalak

1
Cevap için hayır kabul etmemek ve diğer posterlerin bazılarının yapamayacağını cevaplamak yerine sunabileceğini kanıtlayan bir çözüm olduğunu kanıtlamak için + 1'leyin.
Chris Magnuson

Bu, geri yüklenebilir bir yedekleme sağladı mı? Robocopy ile kullanılabilir mi?
Kev

1
@Kev: Evet öyle, ama kesinlikle kendiniz test etmelisiniz. Bir sorun bulursanız, lütfen bana buradan bildirin. Robocopy veya tercih ettiğiniz başka bir araç kullanabilirsiniz, monte edilen birim normal bir sürücü gibi davranır.
Tomalak

6
  1. Kullanılabilir vssadmin list shadowstüm gölge kopyaları listelemek için komutu kullanın . Bunun gibi bir çıktı alacaksınız ...
C: \> vssadmin listesi gölgeleri
vssadmin 1.1 - Birim Gölge Kopyası Hizmeti yönetim komut satırı aracı
(C) Telif Hakkı 2001 Microsoft Corp.

Gölge kopya kümesi kimliğinin içeriği: {b6f6fb45-bedd-4b77-8f51-14292ee921f3}
   Oluşturma zamanında 1 gölge kopya bulunur: 25.09.2016 12:14:23
      Gölge Kopya Kimliği: {321930d4-0442-4cc6-b2aa-ec47f21d0eb1}
         Orijinal Cilt: (C:) \\? \ Cilt {ad1dd231-1200-11de-b1df-806e6f6e6963} \
         Gölge Kopya Birimi: \\? \ GLOBALROOT \ Aygıt \ HarddiskVolumeShadowCopy68
         Kaynak Makine: joshweb.josh.com
         Servis Makinesi: joshweb.josh.com
         Sağlayıcı: 'Microsoft Software Shadow Copy sağlayıcı 1.0'
         Tür: İstemci Erişilebilir
         Öznitelikler: Kalıcı, İstemciye erişilebilir, Otomatik yayın yok, Yazar yok, Diferansiyel

Gölge kopya kümesi kimliğinin içeriği: {c4fd8646-57b3-4b39-be75-47dc8e7f881d}
   Oluşturma zamanında 1 gölge kopya bulunur: 25.08.2016 07:00:18
      Gölge Kopya Kimliği: {fa5da100-5d90-493c-89b1-5c27874a23c6}
         Orijinal Cilt: (E:) \\? \ Cilt {4ec17949-12b6-11de-8872-00235428b661} \
         Gölge Kopya Birimi: \\? \ GLOBALROOT \ Aygıt \ HarddiskVolumeShadowCopy3
         Kaynak Makine: joshweb.josh.com
         Servis Makinesi: joshweb.josh.com
         Sağlayıcı: 'Microsoft Software Shadow Copy sağlayıcı 1.0'
         Tür: İstemci Erişilebilir
         Öznitelikler: Kalıcı, İstemciye erişilebilir, Otomatik yayın yok, Yazar yok, Diferansiyel

C: \
  1. Shadow Copy Volumeİstediğiniz gölge kopyanın adını not edin (panoya en kolay olanı).

  2. Gölge Kopyayı Bağlama

Windows 2003'te ...

Henüz sahip değilseniz , 2003 için kaynak kiti araçlarını indirmeniz gerekir.

Komutu girin ...

linkd c: \ shadow \\? \ GLOBALROOT \ Aygıt \ HarddiskVolumeShadowCopy69 \

... c:\shadowgölge kopyanın görünmesini istediğiniz yoldur ve \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69yukarıda kopyaladığınız addır. Gölge kopya adının sonuna ters eğik çizgi eklemeniz gerektiğini unutmayın !

Windows 2008 ve sonraki sürümlerde ...

Komutu girin ...

mklink c: \ shadow \\? \ GLOBALROOT \ Aygıt \ HarddiskVolumeShadowCopy69 \

... c:\shadowgölge kopyanın görünmesini istediğiniz yoldur ve \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69yukarıda kopyaladığınız addır. Gölge kopya adının sonuna ters eğik çizgi eklemeniz gerektiğini unutmayın !

  1. XCOPYDosyalara erişmek için istediğiniz aracı (windows explorer veya dahil ) kullanın c:\shadow.

Yani ... bunu otomatikleştirmek için çıktıyı ayrıştırmanız gerekir list shadowsmi?
Kev

Bu yanıtı beğendim ama \\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy_n_ monte ederken benim için oldukça işe yaramadı Bunun yerine kök dosyadan (örneğin C $) referans alınan dosyayı ve anlık görüntüyü kullandım mklink / DD: \ TempMount \\ localhost \ C $ \ @ GMT-2011.01.01-06.00.08 - ne yazık ki bu manuel bir süreç olabilir, ancak acil durumlar için işe yarıyor.
Lewis

2

VSS'nin dosya sistemiyle nasıl çalıştığını yanlış anlamıyorsunuz (veritabanlarıyla nasıl çalıştığı tamamen farklı). Dosya sisteminde VSS, istemcilerdeki Önceki Sürümler sekmesi aracılığıyla kurtarma için yalnızca önceden tanımlanmış noktalarda dosya ve klasörlerde yapılan değişikliklerin anlık görüntüsünü almak için kullanılan "Önceki Sürümler" özelliğini uygulamak için kullanılır . Bu değişiklikler daha sonra kurtarma kümesini oluşturmak için birimdeki verilerle birleştirilir. Bu nedenle, kurtarma işlemini gerçekleştirmek için hala orada bulunan orijinal birime bağlıdır, bu da uygun yedekleme ve geri yükleme amacıyla işe yaramaz.

Bunu nasıl yapmak istediğinizden geri adım atmanız ve ne yapmak istediğinizi tekrar düşünmeniz gerektiğini düşünüyorum.

350 GB veri çok fazla değildir ve günlük bazda aktif olarak kullanılanların yüzdesinin oldukça düşük olduğuna bahse girmeye hazırım. Yalnızca hafta sonları tam yedeklemeli gece diferansiyel yedeklemeleri yapmayı düşündünüz mü? Veya "anlık görüntü" (daha sonra yedeklenir) almak için alternatif depolama birimine programlı DFS çoğaltması mı kullanıyorsunuz?


Değişiklik miktarı, diferansiyel yedekleme açısından günde 60GB civarındadır. Düzenli servis kesintisi bazen kullanıcıları rahatsız edecek kadar uzun, belki "saatler" biraz abartılıydı. Demek istediğim, VSS anlık görüntüsünü banda yedeklediğimde, verileri başarıyla geri yüklemek için ihtiyacım olan her şeye sahibim. Şu anda ihtiyacım olanı yapan bir senaryo üzerinde çalışıyorum, oldukça umut verici görünüyor. Tamamlandığında buraya göndereceğim.
Tomalak

@mh: Senaryomu gönderdim. İstediğimden biraz daha büyük oldu, ancak iyi çalışıyor ve kullanımı uygun. Bir bak! :)
Tomalak

1
-1 Soruyu yanlış yorumladınız. Bir yedekleme kaynağı olarak VSS kullanmaya çalışmıyor, daha sonra bir teyp sürücüsüne veya başka bir ortama aktarabileceği dosyalarının salt okunur bir anlık görüntüsünü oluşturmak için kullanmaya çalışıyor. Bunun neden bu teknoloji için büyük bir kullanım örneği olmadığını anlamıyorum?
Chris Magnuson

2

Umarım istediğin budur:

diskshadow -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

diskshadow, Windows Server 2008, AFAIK'dir.
Tomalak

@jackbean: Şimdiye kadar internette ikna edici bir şey bulamadığım için Windows 2003 için benzer bir şey yapan bir senaryo oluşturdum. Cevabıma bir göz atın.
Tomalak

özür dilerim, bunun 2008 için olduğunun farkındayım, ama bir şekilde kafamda 2008 R2 var.
jackbean

0

VSS API'sini kullanarak, birimin "anlık görüntüsünü" almak mümkündür. Sonra kopyalamak için o anlık görüntüyü bağlamanız gerekir. Canlı dosya sistemindeki diğer işlemler tarafından özel olarak açılmış dosyalara rağmen verileri çoğaltmak için bu tekniği kullanan artık ölü bir ürüne aşinayım. VSS anlık görüntülerindeki dosyaların VSS API'leriyle tümleşik olmayan uygulamalar tarafından yazılıyorsa kendiliğinden tutarlı olup olmadıkları hakkında geçerli sorular sorulabilir. Benzer yetenekler sunan başka ürünler de olabilir.


@Fred: Bir VBScript ve bir Microsoft komut satırı aracı kullanarak bunu yaptım. Cevabımı gör.
Tomalak

-1

Kısa cevap: Yapamazsınız.

Biraz daha uzun yanıt: Gölge kopya hizmeti, açık dosyaların yedeklenmesine izin vermek için API'si aracılığıyla programlı olarak kullanılabilir, ancak hizmet sistemin tam anlık görüntülerini oluşturmaz, yalnızca kısmi anlık görüntüler oluşturur.


2
Bunun imkansız olduğuna inanmayı reddediyorum. Tam bir "sistem anlık görüntüsüne" ihtiyacım yok, sadece tek bir birimin zaman içinde bir kopyası. Ben gölge kopya uygulamanın nasıl çalıştığı kabaca farkındayım ve bunu farkındayım olabilir kullanımdaki dosyalarının yedeklerini (net belirgin örnekler Değişim veya SQL veritabanları) yapmak için kullanılabilir.
Tomalak

1
@John: Olabilirim. Cevabıma bir göz atın!
Tomalak

API'yı yedekleme yazılımı ile aynı şekilde kullandığınızı görüyorum. Bu nedenle, VSS hizmetini kullanırken Birim Gölge Kopyasını kullanmak oldukça farklıdır. Yine de, eğer istediğinizi yaparsa, gerçekten önemli olan budur. Aferin.
John Gardeniers

1
Kısa ve uzun yanıtınız yanlıştır ve "Birim Gölge Kopyası" terimi, bu terim biraz belirsiz olsa bile kullanıcının ne aradığını belirtmek için yeterli olmalıdır. en.wikipedia.org/wiki/Shadow_Copy
Chris Magnuson

1
Belki senin hakkın. OP tarif ettiği şeyi yapmanın bir yolunu bulduğunda cevabınızın “Sen yapamazsın” nasıl doğru olduğunu anlamıyorum. Uzun cevabınız sorulan soru ile ilgili değildir, çünkü api yalnızca "kısmi anlık görüntüler" e izin verse de, tüm birimin bir temsilini zaman içinde bir noktaya monte edebilir ve OP'yi istediğiniz gibi yedekleyebilirsiniz. Orijinal postanızda ne demek istediğinizi açıklığa kavuşturabilirseniz, OP'nin neyi başardığını ele alacak şekilde düzenlenirse, aşağı oyu memnuniyetle kaldıracağım ve bilgiler uygunsa bir destek ekleyeceğim.
Chris Magnuson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.