Як використовувати Volume Shadow Copy для створення резервних копій


11

План полягає в тому, щоб створити тіньову копію досить великого обсягу вводу / виводу. Це 350 Гб, що містить індекс повного тексту на основі файлової системи, організований в сотні папок і сто тисяч крихітних файлів, які повинні бути в послідовному стані для успішного відновлення.

В даний час індексатор зупиняється, виконується завдання резервного копіювання, після чого індексатор перезапускається. Це призводить до того, що індекс не буде доступний протягом години під час резервного копіювання. Я хотів би зробити послідовні резервні копії за допомогою тіньової копії, в ідеалі, без того, щоб взагалі зупиняти індексатор.

Отже, я ввімкнув Shadow Copy для цього тома і налаштував його для того, щоб робити знімок раз на вечір, в інший обсяг.

Зараз я трохи втрачений - як я можу отримати доступ до тіньової копії в цілому, щоб зробити резервну копію? Я маю на увазі диск, доступний лише для читання, який містить файли, як вони були під час останнього знімка, але, можливо, все працює зовсім інакше.

ОС - це Windows Server 2003 SP2, програмне забезпечення для резервного копіювання - CommVault Galaxy 7.0.


EDIT : Зауважте, що - тим часом - створено дві відповіді, які реалізують необхідну функціональність у вигляді сценарію:


Чи не використовує галактика commvault вже використовує VSS для створення резервної копії? Я смутно пам'ятаю, що commvault був одним з перших постачальників, який застосував резервне рішення на основі VSS
Джим Б

@Jim: Так, але це стосується лише заблокованих файлів на основі файлу. Що мені потрібно - це всі файли на диску на постійному рівні. Але це не відбудеться, якщо а) індексатор не працює або б) у мене є копія знімка, як ті, що може зробити VSS.
Томалак

VSS не працює так - це тіньова копія VOLUME. Якщо він використовує VSS, єдиною відмінністю є теат, на відміну від ваших постійних знімків програмне забезпечення для резервного копіювання використовує тимчасові знімки. Я припускаю, що програма може робити знімки знімків на основі файлу, але не тільки, що ваші резервні копії будуть невідповідними, але час для резервного копіювання навіть встановлення за замовчуванням Windows буде за порядком днів. Див. Msdn.microsoft.com/en-us/library/aa384589(VS.85).aspx для діаграми того, як працює обробка VSS. Я б зв’язався з commvault і перевірив, чи зможуть вони переконатися в правильності налаштування резервного копіювання.
Джим Б

Відповіді:


10

Отож, в дусі винаходити колесо, я представляю вам чудовий сценарій Томалака (див. Вище), але повністю переписаний у Powershell !!! Основна причина, яку я зробив це, - це євангелізація дивовижних сил Пауершелла, але також тому, що я зневажаю vbscript усією істотою.

Це, головним чином, функція показувати однакові, але я реалізував деякі речі трохи інакше з різних причин. Вихід з налагодження, безумовно, більш багатослівний.

Важливо відзначити, що ця версія виявляє версію та біт ОС та викликає відповідну версію 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: \ програмні файли \ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ release-server \ vshadow.exe
      • Перейменуйте на: vshadow_2003_x86.exe
    • x64: мені не вдалося знайти версію x64 vshadow.exe для Windows 2003 x64
  2. Windows 2008
    • Windows SDK для Windows Server 2008 та .NET Framework 3.5
    • x86: C: \ Програмні файли \ Microsoft SDKs \ Windows \ v6.1 \ Bin \ vsstools \ vshadow.exe
      • Перейменуйте на: vshadow_2008_x86.exe
    • x64: C: \ Програмні файли \ Microsoft SDKs \ Windows \ v6.1 \ Bin \ x64 \ vsstools \ vshadow.exe
      • Перейменуйте на: vshadow_2008_x64.exe
  3. Windows 2008R2
    • Microsoft Windows SDK для Windows 7 та .NET Framework 4
    • x86: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ vsstools \ vshadow.exe
      • Перейменуйте на: vshadow_2008R2_x86.exe
    • x64: C: \ програмні файли (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin \ x64 \ vsstools \ vshadow.exe
      • Перейменуйте на: vshadow_2008R2_x64.exe

2
btw ... Мені вдалося реалізувати це як частину нашого резервного рішення, використовуючи Arcserve як резервну копію відкритого файлу бідної людини. Це краще, ніж платити 800 доларів за один сервер за ліцензію агента. Якщо когось цікавить, я опублікую тут.
Джон Гомер

+1 Це досить дивовижно. Дякуємо, що знайшли час, щоб перенести це на ps (незважаючи на вашу ненависть до VBS) і за те, що ви поділилися цим тут. Я сподіваюся, що більшість людей знайдуть це корисним, оскільки це, безумовно, заслуговує більше одного голосу.
Томалак

9

Отже ... я працюю над невеликим VBScript, який може:

  • робити стійкі знімки VSS
  • змонтуйте їх у папку (з якої потім можна створити резервну копію файлів)
  • відключити знімки VSS

Він покладається на vshadow.exe( документацію ), частину пакету SDK 7.2 Volume Shadow Copy Service , доступний у Microsoft. Я працював з цією версією: " VSHADOW.EXE 2.2 - зразковий клієнт-копіювальна тіньова копія, Copyright (C) 2005 Microsoft Corporation. "

В основному, це акуратний маленький обгортку навколо цих чотирьох команд vshadow:

vshadow.exe -q - Список усіх тіньових копій у системі
vshadow.exe -p {том списку} - Керує стійкими тіньовими копіями
vshadow.exe -el = {SnapID}, реж. - Розкрийте тіньову копію як точки монтажу
vshadow.exe -ds = {SnapID} - видаляє цю тіньову копію

Ось його довідковий екран:

Інструмент створення та монтажу VSS

Використання:
cscript / nologo VssSnapshot.vbs / target: шлях {/ том: X | / unmount} [/ debug]

/ том - літер диска обсягу на знімок
/ target - шлях (абсолютний або відносний) для монтажу знімка
/ debug - swich на виході з налагодження

Приклади:
cscript / nologo VssSnapshot.vbs / target: C: \ Резервне копіювання \ DriveD / об'єм: D
cscript / nologo VssSnapshot.vbs / target: C: \ Резервне копіювання \ DriveD / відключення

Підказка: перед тим, як робити новий знімок, знімати його не потрібно.

Ось кілька вибіркових результатів:

C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / том: E
03.03.2010 17:13:04 підготовка точки монтажу VSS ...
03.05.2010 17:13:04 Точка монтажу підготовлена ​​за адресою: C: \ VssSnapshot \ MountPoints \ E
03.03.2010 17:13:04 створення знімків VSS для гучності: E
03.05.2010 17:13:08 Зроблено знімок із ідентифікатором: {4ed3a907-c66f-4b20-bda0-9dcda3b667ec}
03.03.2010 17:13:08 Знімок VSS вдало встановлено
03.05.2010 17:13:08 завершено

C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / unmount
03.03.2010 17:13:35 підготовка точки монтажу VSS ...
03.03.2010 17:13:36 більше нічого робити
03.05.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 за те, що не прийняв відповідь "ні", і пробуючи довести, що існує життєздатне рішення, яке могли запропонувати деякі інші афіші, а не відповідати, що цього зробити не можна.
Кріс Магнусон

Чи це в кінцевому підсумку забезпечило відновлення резервного копіювання? Чи можна його використовувати з роботокопією?
Кев

1
@Kev: Так, але це обов'язково потрібно перевірити самостійно. Якщо ви знайшли проблему, будь ласка, скажіть мені тут. Ви можете використовувати Robocopy або будь-який інший інструмент, який ви віддаєте перевагу, встановлений об'єм поводиться як звичайний привід.
Томалак

6
  1. За допомогою команди vssadmin list shadowsперелічіть усі наявні тіньові копії. Ви отримаєте такий вихід ...
C: \> vssadmin список тіней
vssadmin 1.1 - Інструмент командного рядка адміністратора сервісу Volume Shadow Copy
(C) Авторські права 2001 Microsoft Corp.

Зміст набору копій для тіні ID: {b6f6fb45-bedd-4b77-8f51-14292ee921f3}
   Вміщено 1 тіньових примірників під час створення: 25.09.2016 12:14:23
      Ідентифікатор тіньової копії: {321930d4-0442-4cc6-b2aa-ec47f21d0eb1}
         Оригінальний том: (C:) \\? \ Том {ad1dd231-1200-11de-b1df-806e6f6e6963} \
         Об'єм тіньової копії: \\? \ GLOBALROOT \ Пристрій \ HarddiskVolumeShadowCopy68
         Виробнича машина: joshweb.josh.com
         Сервісна машина: joshweb.josh.com
         Постачальник: "Програмне забезпечення Microsoft Shadow Copy Provider 1.0"
         Тип: ClientAccessible
         Атрибути: Постійний, доступний для клієнтів, Без автоматичного випуску, Без авторів, Диференціальний

Зміст набору копій тіні: {c4fd8646-57b3-4b39-be75-47dc8e7f881d}
   Вміщено 1 тіньових примірників під час створення: 25.08.2016 7:00:18
      Ідентифікатор тіньової копії: {fa5da100-5d90-493c-89b1-5c27874a23c6}
         Оригінальний том: (E:) \\? \ Том {4ec17949-12b6-11de-8872-00235428b661} \
         Об'єм тіньової копії: \\? \ GLOBALROOT \ Пристрій \ HarddiskVolumeShadowCopy3
         Виробнича машина: joshweb.josh.com
         Сервісна машина: joshweb.josh.com
         Постачальник: "Програмне забезпечення Microsoft Shadow Copy Provider 1.0"
         Тип: ClientAccessible
         Атрибути: Постійний, доступний для клієнтів, Без автоматичного випуску, Без авторів, Диференціальний

C: \
  1. Відзначте Shadow Copy Volumeназву потрібної тіньової копії (найпростіше у буфер обміну).

  2. Змонтуйте тіньову копію

У Windows 2003 ...

Вам потрібно буде завантажити інструментарій набору ресурсів на 2003 рік, якщо у вас його ще немає.

Введіть команду ...

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

... де c:\shadowзнаходиться шлях, де ви хочете, щоб з'явилася тіньова копія, і \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69це ім'я, яке ви скопіювали вище. Зауважте, що ви повинні додати зворотну косу риску в кінці назви копії тіні!

У Windows 2008 і новіших версіях ...

Введіть команду ...

mklink c: \ тінь \\? \ GLOBALROOT \ Пристрій \ 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 ГБ даних - це не дуже багато справді, і я готовий зробити ставку на те, що відсоток того, що активно використовується щодня, є досить низьким. Чи розглядали ви робити нічні диференціальні резервні копії з повними резервними копіями лише у вихідні дні? Або використовувати заплановану реплікацію DFS на альтернативне сховище, щоб отримати "знімок" (який потім створюється резервна копія)?


Обсяг змін становить близько 60 ГБ на день, з точки зору диференціального резервного копіювання. Регулярний відключення послуг досить довгий, щоб час від часу дратувати користувачів, можливо, "години" були трохи перебільшеними. Моя думка - коли я створю резервну копію знімка 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.
jackbean

0

За допомогою API VSS можна зробити «знімок» обсягу. Тоді вам доведеться встановити цей знімок, щоб скопіювати з нього. Я знайомий із уже мертвим продуктом, який використовував цю техніку для копіювання даних, незважаючи на те, що файли відкриваються виключно іншими процесами в живій файловій системі. Можна поставити справжні запитання щодо того, чи файли на знімку VSS самостійні, якщо вони записуються програмами, які не інтегровані з API VSS. Можуть бути й інші продукти, які пропонують подібні можливості.


@Fred: Це я зробив, використовуючи VBScript та інструмент командного рядка Microsoft. Дивіться мою відповідь.
Томалак

-1

Коротка відповідь: Ви не можете.

Трохи довший відповідь: Служба тіньової копії може використовуватися програмно за допомогою API, щоб дозволяти створювати резервні копії відкритих файлів, але сервіс не створює повних знімків системи, а лише часткові знімки.


2
Я відмовляюся вірити, що це неможливо. Мені не потрібен повний "знімок системи", лише конкретна копія одного тома. Я приблизно знаю, як тіньова копія працює всередині, і я усвідомлюю, що її можна використовувати для створення резервних копій файлів, що використовуються (відомі приклади в мережі - бази даних Exchange або SQL).
Томалак

1
@John: Виявляється, я можу. Подивіться на мою відповідь!
Томалак

Я бачу, що ви використовуєте API так само, як і програмне забезпечення для резервного копіювання. Отже, якщо ви використовуєте послугу VSS, це зовсім інше, ніж використання Volume Shadow Copy. Тим не менш, якщо це робить те, що ти хочеш, це все, що насправді має значення. Молодці.
Джон Гарденєр

1
Ваша коротка та довга відповідь є помилковою, і термін "Копія тіньової копії" повинен був бути достатнім, щоб вказати, що користувач шукав, навіть якщо цей термін є дещо неоднозначним. en.wikipedia.org/wiki/Shadow_Copy
Кріс Магнусон

1
Можливо, ваше право. Я не розумію, наскільки ваша відповідь "Ти не можеш" правильна, коли ОП знайшов спосіб зробити те, що описав. Ваша довга відповідь не стосується поставленого запитання, оскільки, хоча api дозволяє лише "часткові знімки", ви все одно можете встановити подання всього обсягу в певний момент часу і створити резервну копію, як бажано в ОП. Якщо ви зможете уточнити, що ви маєте на увазі у своєму первісному дописі, щоб він був відредагований у відповідь на те, що ОП змогла виконати, я із задоволенням видалю голосування за відмову і додаю підсумок, якщо інформація актуальна.
Кріс Магнусон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.