AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 119120
Accepted
Tomalak
Tomalak
Asked: 2010-03-05 02:50:17 +0800 CST2010-03-05 02:50:17 +0800 CST 2010-03-05 02:50:17 +0800 CST

如何使用卷影复制进行备份

  • 772

计划是创建一个相当大的、I/O 繁重的卷的卷影副本。它是 350GB,包含一个基于文件系统的全文索引,该索引组织在数百个文件夹和数十万个需要处于一致状态才能成功还原的小文件中。

当前索引器停止,备份任务运行,然后索引器重新启动。这会导致索引在备份期间数小时不可用。我想通过卷影副本进行一致的备份,理想情况下根本不必停止索引器。

因此,我为该卷打开了卷影复制,并将其配置为每晚制作一次快照到不同的卷。

现在我有点不知所措 - 我怎样才能访问整个卷影副本,以便我可以进行备份?我设想一个只读驱动器包含上次快照时的文件,但也许事情完全不同。

操作系统为 Windows Server 2003 SP2,备份软件为 CommVault Galaxy 7.0。


编辑:请注意 - 同时 - 已经创建了两个答案,它们以脚本的形式实现了必要的功能:

  • VBScript(我自己)
  • PowerShell(约翰·荷马)
backup windows-server-2003 vss
  • 7 7 个回答
  • 34347 Views

7 个回答

  • Voted
  1. John Homer
    2012-02-01T09:10:33+08:002012-02-01T09:10:33+08:00

    因此,本着重新发明轮子的精神,我向您展示了 Tomalak 的出色脚本(见上文),但完全用Powershell重写!我这样做的主要原因是宣传 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. 视窗 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 的 x64 版本的 vshadow.exe
    2. 视窗 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. 视窗 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
    • 11
  2. Best Answer
    Tomalak
    2010-03-06T08:41:49+08:002010-03-06T08:41:49+08:00

    所以……我一直在研究一个小的 VBScript,它可以:

    • 拍摄持久的 VSS 快照
    • 将它们挂载到一个文件夹(然后您可以从中备份文件)
    • 卸载 VSS 快照

    它依赖于vshadow.exe(文档),它是Microsoft 提供的Volume Shadow Copy Service SDK 7.2的一部分。我一直在使用这个版本:“ VSHADOW.EXE 2.2 - 卷影复制示例客户端,版权所有 (C) 2005 Microsoft Corporation。 ”

    基本上,它是对这四个 vshadow 命令的一个简洁的包装:

    vshadow.exe -q - 列出系统中的所有卷影副本
    vshadow.exe -p {volume list} - 管理持久的卷影副本
    vshadow.exe -el={SnapID},dir - 将卷影副本公开为挂载点
    vshadow.exe -ds={SnapID} - 删除这个卷影副本
    

    这是它的帮助屏幕:

    VSS 快照创建/安装工具
    
    用法:
    cscript /nologo VssSnapshot.vbs /target:path { /volume:X | /卸载} [/调试]
    
    /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
    2010 年 5 月 3 日 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使用它。我只要求您保留指向此处的链接完好无损。

    • 9
  3. Will V
    2010-07-18T10:56:54+08:002010-07-18T10:56:54+08:00
    1. 使用该命令vssadmin list shadows列出所有可用的卷影副本。你会得到这样的输出......
    C:\> vssadmin 列表阴影
    vssadmin 1.1 - 卷影复制服务管理命令行工具
    (C) 版权所有 2001 微软公司。
    
    卷影副本集 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 软件卷影复制提供者 1.0”
             类型:客户端可访问
             属性:持久、客户端可访问、无自动发布、无写入器、差异化
    
    卷影副本集 ID 的内容:{c4fd8646-57b3-4b39-be75-47dc8e7f881d}
       创建时包含 1 个卷影副本:2016 年 8 月 25 日上午 7:00:18
          卷影副本 ID:{fa5da100-5d90-493c-89b1-5c27874a23c6}
             原始卷:(E:)\\?\Volume{4ec17949-12b6-11de-8872-00235428b661}\
             卷影复制卷:\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3
             发起机器:joshweb.josh.com
             服务机器:joshweb.josh.com
             提供者:“Microsoft 软件卷影复制提供者 1.0”
             类型:客户端可访问
             属性:持久、客户端可访问、无自动发布、无写入器、差异化
    
    C:\
    
    1. 记下Shadow Copy Volume您想要的卷影副本的名称(对剪贴板最简单)。

    2. 挂载卷影副本

    在 Windows 2003...

    如果您还没有2003 的资源工具包工具,则需要下载它。

    输入命令...

    链接 c:\shadow \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69\
    

    ... wherec:\shadow是您希望显示卷影副本的路径,并且\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69是您在上面复制的名称。请注意,您必须在卷影副本名称的末尾添加反斜杠!

    在 Windows 2008 及更高版本上...

    输入命令...

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

    ... wherec:\shadow是您希望显示卷影副本的路径,并且\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69是您在上面复制的名称。请注意,您必须在卷影副本名称的末尾添加反斜杠!

    1. 使用您想要的任何工具(包括 Windows 资源管理器或XCOPY)从c:\shadow.
    • 6
  4. Maximus Minimus
    2010-03-05T06:21:51+08:002010-03-05T06:21:51+08:00

    您误解了 VSS 如何与文件系统一起工作(它与数据库的工作方式完全不同)。在文件系统上,VSS 用于实现“以前的版本”功能,该功能仅用于在预定义的时间点对文件和文件夹的更改进行快照,以便通过客户端中的“以前的版本”选项卡进行恢复。然后,这些更改将与卷上的数据合并以构建恢复集。因此,它依赖于仍然存在的原始卷才能执行恢复,换句话说,这对于正确的备份和恢复是无用的。

    我认为你需要从你想要做的事情中退后一步,重新思考你想要做什么。

    350 GB 的数据实际上并不算多,我敢打赌,每天被积极使用的数据的百分比非常低。您是否考虑过仅在周末使用完整备份进行夜间差异备份?或者使用预定的 DFS 复制到备用存储以获得“快照”(然后备份)?

    • 2
  5. jackbean
    2010-03-05T12:45:48+08:002010-03-05T12:45:48+08:00

    希望这是你想要的:

    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
    
    • 2
  6. Fred
    2010-03-05T13:34:20+08:002010-03-05T13:34:20+08:00

    使用 VSS API,可以拍摄卷的“快照”。然后,您必须挂载该快照才能从中复制。我熟悉一个现在已经死掉的产品,它使用这种技术来复制数据,尽管文件是由实时文件系统中的其他进程专门打开的。如果 VSS 快照中的文件是由未与 VSS API 集成的应用程序编写的,则可能会提出有关 VSS 快照中的文件是否自洽的有效问题。可能还有其他产品提供类似的功能。

    • 0
  7. John Gardeniers
    2010-03-05T03:19:33+08:002010-03-05T03:19:33+08:00

    简短的回答:你不能。

    稍微长一点的答案:卷影复制服务可以通过其 API 以编程方式使用,以允许备份打开的文件,但该服务不会创建系统的完整快照,只会创建部分快照。

    • -1

相关问题

  • 总大小(磁盘)与总大小(媒体)

  • 社区对备份解决方案的意见

  • 无法读取不同 LTO-3 驱动器上的 LTO-3 磁带

  • 使用 TSM 备份时跳过硬链接

  • 使用 rsync 维护名称更改的目录的副本

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve