ボリュームシャドウコピーを使用してバックアップを作成する方法


11

計画では、非常に大きなI / Oの多いボリュームのシャドウコピーを作成します。350GBの容量があり、ファイルシステムベースのフルテキストインデックスが数百のフォルダーと数千の小さなファイルで構成されており、復元を成功させるには一貫した状態にする必要があります。

現在、インデクサーが停止され、バックアップタスクが実行されてから、インデクサーが再起動されます。これにより、バックアップ中にインデックスが数時間利用できなくなります。理想的にはインデクサーを停止することなく、シャドウコピーを使用して一貫したバックアップを作成したいと思います。

そのため、そのボリュームに対してシャドウコピーをオンにし、毎晩別のボリュームにスナップショットを作成するように構成しました。

今、私は少し迷っています-どうすればバックアップを作成できるように、シャドウコピー全体にアクセスできますか?最後のスナップショットの時点でのファイルを含む読み取り専用ドライブを想定していますが、動作がまったく異なる場合があります。

OSはWindows Server 2003 SP2、バックアップソフトウェアはCommVault Galaxy 7.0です。


編集:その間に-スクリプトの形で必要な機能を実装する2つの答えが作成されていることに注意してください:


commvault galaxyは既にVSSを使用してバックアップを作成していませんか?私は漠然とそれのCommVaultは、VSSベースのバックアップソリューションimpleentした最初のベンダーの1社だった覚えている
ジム・B

@Jim:はい。ただし、ファイルごとにロックされたファイルに対してのみです。必要なのは、ドライブ上のすべてのファイルが一貫した状態にあることです。ただし、a)インデクサーが実行されないか、b)VSSで作成できるスナップショットコピーがない限り、これは発生しません。
トマラック

VSSはそのようには機能しません。これはボリュームシャドウコピーです。VSSを使用する場合、永続スナップバックアップソフトウェアが一時スナップを使用するのとは異なり、唯一の違いがあります。アプリケーションは、ファイルごとにスナップショットを削除できますが、バックアップの一貫性が失われるだけでなく、デフォルトのWindowsインストールでもバックアップにかかる時間は数日になると思います。VSS処理の仕組みの図については、msdn.microsoft.com / en-us / library / aa384589(VS.85).aspxを参照してください。commvaultに連絡し、バックアップ構成が正しいことを確認できるかどうかを確認します。
ジムB

回答:


10

だから、車輪の再発明の精神で、私はTomalakの優れたスクリプトを完全に書き直さなく、(上記参照)あなたに提示PowerShellの !!! 私がこれを行った主な理由は、Powershellの素晴らしい力を伝道することでしたが、vbscriptを私の存在全体に軽deしているためでもありました。

ほぼ同じ機能を提供する機能ですが、さまざまな理由で実装方法が少し異なりました。デバッグ出力は間違いなくより冗長です。

注意すべき非常に重要なことの1つは、このバージョンがOSのバージョンとビット数を検出し、vshadow.exeの適切なバージョンを呼び出すことです。使用するvshadow.exeのバージョン、入手先、および名前の付け方を示すグラフを以下に示しました。


使用情報は次のとおりです。

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

スクリプトは次のとおりです。

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

使用するvshadow.exeのバージョンは次のとおりです。

  1. Windows 2003 / 2003R2
    • ボリュームシャドウコピーサービスSDK 7.2
    • x86:C:\ Program Files \ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ release-server \ vshadow.exe
      • 名前の変更:vshadow_2003_x86.exe
    • x64:Windows 2003 x64用のvshadow.exeのx64バージョンを見つけることができませんでした
  2. Windows 2008
    • Windows Server 2008および.NET Framework 3.5用のWindows SDK
    • x86:C:\ Program Files \ Microsoft SDKs \ Windows \ v6.1 \ Bin \ vsstools \ vshadow.exe
      • 名前の変更:vshadow_2008_x86.exe
    • x64:C:\ Program Files \ Microsoft SDKs \ Windows \ v6.1 \ Bin \ x64 \ vsstools \ vshadow.exe
      • 名前の変更:vshadow_2008_x64.exe
  3. Windows 2008R2
    • Windows 7および.NET Framework 4用のMicrosoft Windows SDK
    • x86:C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin \ vsstools \ vshadow.exe
      • 名前の変更:vshadow_2008R2_x86.exe
    • x64:C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64 \ vsstools \ vshadow.exe
      • 名前の変更:vshadow_2008R2_x64.exe

2
ところで...私は、Arcserveを貧しい人のオープンファイルバックアップとして使用するバックアップソリューションの一部としてこれを実装することができました。エージェントライセンスに対してサーバーあたり800ドルを支払うよりもましです。興味がある人はここに投稿します。
ジョン・ホーマー

+1これはかなり素晴らしいです。これをpsに移植するために時間を割いていただき(VBSへの憎しみにもかかわらず)、ここで共有していただきありがとうございます。これが間違いなく複数の賛成に値するので、より多くの人々がそれを役に立つと思うことを望みます。
トマラック

9

だから…私はできる小さなVBScriptに取り組んできました。

  • 永続的なVSSスナップショットを撮ります
  • それらをフォルダにマウントします(そこからファイルをバックアップできます)
  • VSSスナップショットのマウント解除

Microsoftから入手可能なVolume Shadow Copy Service SDK 7.2の一部vshadow.exedocumentation)に依存しています。私はこのバージョンで作業してきました: " VSHADOW.EXE 2.2-ボリュームシャドウコピーサンプルクライアント、Copyright(C)2005 Microsoft Corporation。 "

基本的には、これらの4つのvshadowコマンドに対するきちんとした小さなラッパーです。

vshadow.exe -q-システム内のすべてのシャドウコピーを一覧表示します
vshadow.exe -p {ボリュームリスト}-永続的なシャドウコピーを管理します
vshadow.exe -el = {SnapID}、dir-シャドウコピーをマウントポイントとして公開する
vshadow.exe -ds = {SnapID}-このシャドウコピーを削除します

ヘルプ画面は次のとおりです。

VSSスナップショット作成/マウントツール

使用法:
cscript / nologo VssSnapshot.vbs / target:path {/ volume:X | / unmount} [/ debug]

/ volume-スナップショットするボリュームのドライブ文字
/ target-スナップショットをマウントするパス(絶対または相対)
/ debug-デバッグ出力の切り替え

例:
cscript / nologo VssSnapshot.vbs / target:C:\ Backup \ DriveD / volume:D
cscript / nologo VssSnapshot.vbs / target:C:\ Backup \ DriveD / unmount

ヒント:新しいスナップショットを作成する前にアンマウントする必要はありません。

ここにいくつかのサンプル出力:

C:\ VssSnapshot> cscript / nologo VssSnapshot.vbs / target:MountPoints \ E / volume:E
05/03/2010 17:13:04 VSSマウントポイントの準備...
05/03/2010 17:13:04マウントポイントはC:\ VssSnapshot \ MountPoints \ Eに準備されています
05/03/2010 17:13:04ボリュームのVSSスナップショットの作成:E
05/03/2010 17:13:08 IDで作成されたスナップショット:{4ed3a907-c66f-4b20-bda0-9dcda3b667ec}
05/03/2010 17:13:08 VSSスナップショットが正常にマウントされました
05/03/2010 17:13:08終了

C:\ VssSnapshot> cscript / nologo VssSnapshot.vbs / target:MountPoints \ E / unmount
05/03/2010 17:13:35 VSSマウントポイントの準備...
05/03/2010 17:13:36他にやることはありません
05/03/2010 17:13:36終了

そして、ここにスクリプト自体があります。通常の免責事項が適用されます。ソフトウェアは現状のまま提供されます。責任を負わないのは自分自身である場合は、自己責任で使用してください。しかし、私はそれを非常に徹底的にテストしました。以下のコメントを使用して、バグをいつでもお知らせください。

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

これが誰かの助けになることを願っています。cc-by-saに従って自由に使用してください。ここでポイントしているリンクはそのままにしておいてください。


そして、これから新しいシステムへのデータの完全な災害復旧を行いましたか?バックアップを取るのは簡単です。それから復元することは、それほど多くありません。
ロブモアー

@Robert:これは、他の種類のバックアップと同様に、このアプローチにも当てはまります。ステージングが完了したらすぐにフォローアップします。
トマラック

1
+1は、答えにノーを受け入れず、他のポスターのいくつかがそれができないと答える代わりに提供することができる実行可能な解決策があることを証明するために押し通します。
クリスマグナソン

これで復元可能なバックアップが提供されましたか?Robocopyで使用できますか?
ケブ

1
@Kev:はい、できますが、必ず自分でテストする必要があります。問題を見つけたら、ここで教えてください。Robocopyまたは任意の他のツールを使用できます。マウントされたボリュームは通常のドライブのように動作します。
トマラック

6
  1. コマンドvssadmin list shadowsを使用して、使用可能なすべてのシャドウコピーを一覧表示します。このような出力が得られます...
C:\> vssadminリストのシャドウ
vssadmin 1.1-ボリュームシャドウコピーサービス管理コマンドラインツール
(C)Copyright 2001 Microsoft Corp.

シャドウコピーセットIDの内容:{b6f6fb45-bedd-4b77-8f51-14292ee921f3}
   作成時に1つのシャドウコピーが含まれていました:9/25/2016 12:14:23 PM
      シャドウコピーID:{321930d4-0442-4cc6-b2aa-ec47f21d0eb1}
         元のボリューム:(C:)\\?\ Volume {ad1dd231-1200-11de-b1df-806e6f6e6963} \
         シャドウコピーボリューム:\\?\ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy68
         元のマシン:joshweb.josh.com
         サービスマシン:joshweb.josh.com
         プロバイダー:「Microsoft Software Shadow Copy provider 1.0」
         タイプ:ClientAccessible
         属性:永続的、クライアントアクセス可能、自動リリースなし、ライターなし、差分

シャドウコピーセットIDの内容:{c4fd8646-57b3-4b39-be75-47dc8e7f881d}
   作成時に1つのシャドウコピーが含まれていた:2016年8月25日7:00:18 AM
      シャドウコピーID:{fa5da100-5d90-493c-89b1-5c27874a23c6}
         元のボリューム:(E:)\\?\ Volume {4ec17949-12b6-11de-8872-00235428b661} \
         シャドウコピーボリューム:\\?\ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy3
         元のマシン:joshweb.josh.com
         サービスマシン:joshweb.josh.com
         プロバイダー:「Microsoft Software Shadow Copy provider 1.0」
         タイプ:ClientAccessible
         属性:永続的、クライアントアクセス可能、自動リリースなし、ライターなし、差分

C:\
  1. Shadow Copy Volume必要なシャドウコピーの名前をメモします(クリップボードに最も簡単です)。

  2. シャドウコピーをマウントする

Windows 2003の場合...

2003のリソースキットツールをまだお持ちでない場合は、ダウンロードする必要があります。

コマンドを入力してください...

リンクされたc:\ shadow \\?\ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy69 \

...ここでc:\shadow、シャドウコピーを表示するパス\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69と、上記でコピーした名前です。シャドウコピー名の最後にバックスラッシュを追加する必要があることに注意してください

Windows 2008以降の場合...

コマンドを入力してください...

mklink c:\ shadow \\?\ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy69 \

...ここでc:\shadow、シャドウコピーを表示するパス\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69と、上記でコピーした名前です。シャドウコピー名の最後にバックスラッシュを追加する必要があることに注意してください

  1. 必要なツール(windows explorerやを含むXCOPY)を使用して、からファイルにアクセスしますc:\shadow

だから...これを自動化するには、からの出力を解析する必要がありlist shadowsますか?
ケフ

私はこの答えが好きですが、\\?\ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy_n_をマウントするときはうまくいきませんでした。代わりに、ルート共有(C $など)から参照ファイルとスナップショット時間を使用しましたmklink / DD:\ TempMount \\ localhost \ C $ \ @ GMT-2011.01.01-06.00.08-残念ながら、これは手動のプロセスである可能性が高いですが、緊急時には機能します。
ルイス

2

VSSがファイルシステムでどのように機能するかを誤解しています(データベースでの動作はまったく異なります)。ファイルシステムでは、VSSを使用して「以前のバージョン」機能を実装します。これは、クライアントの「以前のバージョン」タブを使用して、事前定義された時点でファイルおよびフォルダーの変更のスナップショットを作成するためにのみ使用されます。これらの変更は、復旧セットを構築するためにボリューム上のデータとマージされます。したがって、リカバリを実行するために元のボリュームがまだ存在していることに依存しています。つまり、適切なバックアップとリストアの目的には役に立たないのです。

これをどのようにしたいのかを振り返り、やりたいことをもう一度考える必要があると思います。

350 GBのデータはそれほど多くないので、日々積極的に使用されるデータの割合はかなり低いと確信しています。週末のみフルバックアップで夜間の差分バックアップを行うことを検討しましたか?または、「スナップショット」を取得するために代替ストレージへのスケジュールされたDFSレプリケーションを使用します(これはバックアップされます)。


変更の量は、差分バックアップの観点から、1日あたり約60GBです。定期的なサービスの停止は、ユーザーをときどき悩ませるほど長く、「時間」は少し誇張されていたかもしれません。私のポイントは-VSSスナップショットをテープにバックアップすると、データを正常に復元するために必要なものがすべて揃うことです。現在必要なことを実行するスクリプトを作成していますが、非常に有望です。完了したら、ここに投稿します。
トマラック

@mh:スクリプトを投稿しました。私が意図したよりも少し大きくなりましたが、うまく機能し、使いやすいです。ご覧ください!:)
トマラック

1
-1質問を誤って解釈した。彼は、VSSをバックアップのソースとして使用するのではなく、それを使用してファイルの読み取り専用の特定時点のスナップショットを作成し、テープドライブまたは他のメディアに転送しようとしています。これがこのテクノロジーの優れたユースケースではない理由がわかりませんか?
クリスマグナソン

2

これがあなたが望むものであることを願っています:

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です。
トマラック

@jackbean:Windows 2003に似たようなことをするスクリプトを作成しました。これまでのところ、インターネット上で説得力のあるものは見つからなかったからです。私の答えを見てください。
トマラック

申し訳ありませんが、それは2008年のものであることは承知していますが、どういうわけか私の頭の中に2008 R2があります。
ジャックビーン

0

VSS APIを使用すると、ボリュームの「スナップショット」を取得できます。その後、スナップショットからコピーするには、そのスナップショットをマウントする必要があります。私は、ファイルがライブファイルシステムの他のプロセスによって排他的に開かれているにもかかわらず、この手法を使用してデータをレプリケートするようになった今では死んだ製品に精通しています。VSS APIに統合されていないアプリによって書き込まれている場合、VSSスナップショット内のファイルが一貫性があるかどうかについて、有効な質問を提起できます。同様の機能を提供する他の製品があるかもしれません。


@Fred:VBScriptとMicrosoftコマンドラインツールを使用して、それを実現しました。私の答えをご覧ください。
トマラック

-1

簡単な答え:できません。

少し長い回答:シャドウコピーサービスはAPIを介してプログラムで使用して、開いているファイルのバックアップを許可できますが、サービスはシステムの完全なスナップショットを作成せず、部分的なスナップショットのみを作成します。


2
これが不可能だとは信じません。完全な「システムのスナップショット」は必要なく、単一のボリュームの特定の時点のコピーだけが必要です。私はシャドウコピーが内部的にどのように機能するかを大まかに認識しており、使用中のファイルのバックアップに使用できることを認識しています(ネット上の顕著な例はExchangeまたはSQLデータベースです)。
トマラック

1
@ジョン:私ができることが判明した。私の答えを見てください!
トマラック

バックアップソフトウェアとほぼ同じAPIを使用していることがわかります。そのため、VSSサービスを使用しているときは、ボリュームシャドウコピーを使用するのとはまったく異なります。それにもかかわらず、それがあなたが望むことをするなら、それは本当に重要なことです。よくやった。
ジョンガーデニアーズ

1
あなたの短い答えと長い答えはどちらも間違っており、「ボリュームシャドウコピー」という用語は、この用語がわずかに曖昧であっても、ユーザーが探していたものを示すのに十分なはずです。en.wikipedia.org/wiki/Shadow_Copy
クリスマグナソン

1
たぶんあなたの権利。OPが彼が説明したことを行う方法を見つけたとき、「あなたはできない」というあなたの答えがどのように正しいかわかりません。長い答えは質問された質問には関係ありません。なぜなら、APIは「部分的なスナップショット」しか許可していないにもかかわらず、ある時点でボリューム全体の表現をマウントし、OPが望むようにバックアップできるからです。元の投稿の意味を明確にして、OPが達成できたことに対処するように編集できるようになった場合、喜んで反対票を削除し、情報が関連する場合は賛成票を追加します。
クリスマグナソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.