계획은 상당히 큰 I / O가 많은 볼륨의 섀도 복사본을 만드는 것입니다. 350GB이며, 수백 개의 폴더와 수백 개의 작은 파일로 구성된 파일 시스템 기반 전체 텍스트 인덱스를 포함하며 복원이 성공하려면 일관된 상태에 있어야합니다.
현재 인덱서가 중지되고 백업 작업이 실행 된 다음 인덱서가 다시 시작됩니다. 이로 인해 백업 중에 몇 시간 동안 인덱스를 사용할 수 없습니다. 인덱서를 전혀 중지하지 않고 섀도 복사본을 통해 일관된 백업을 만들고 싶습니다.
따라서 해당 볼륨에 대한 섀도 복사본을 켜고 매일 밤마다 다른 볼륨으로 스냅 샷을 만들도록 구성했습니다.
이제 약간의 손실이 발생했습니다. 섀도 복사본에 전체적으로 액세스하여 백업을 만들 수있는 방법은 무엇입니까? 마지막 스냅 샷 당시의 파일이 포함 된 읽기 전용 드라이브를 구상했지만 완전히 다른 방식으로 작동 할 수 있습니다.
OS는 Windows Server 2003 SP2이고 백업 소프트웨어는 CommVault Galaxy 7.0입니다.
편집 : 그 동안 스크립트 형태로 필요한 기능을 구현하는 두 가지 답변이 작성되었습니다.
- VBScript (직접)
- PowerShell ( John Homer 작성 )
답변
그래서 바퀴를 재발 명하는 정신으로, 나는 당신에게 Tomalak의 훌륭한 대본 (위 참조)을 제시하지만 Powershell로 완전히 다시 작성되었습니다 ! 내가이 일을 한 주된 이유는 Powershell의 놀라운 힘을 복음화하기 위해서 였지만, 내 존재 전체와 함께 vbscript를 멸시했기 때문입니다.
대부분 동일한 기능을 제공하는 기능이지만 여러 가지 이유로 약간 다르게 구현했습니다. 디버깅 출력은 확실히 더 장황합니다.
주의해야 할 중요한 사항 중 하나는이 버전이 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 버전은 다음과 같습니다.
- 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 버전을 찾을 수 없습니다
- 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로 이름을 바꿉니다.
- 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로 이름을 바꿉니다.
답변
그래서 … 나는 할 수있는 작은 VBScript를 연구하고 있습니다.
- 지속적인 VSS 스냅 샷 생성
- 파일을 폴더에 마운트 한 다음 파일을 백업 할 수 있습니다.
- VSS 스냅 샷 마운트 해제
Microsoft에서 제공 하는 Volume Shadow Copy Service SDK 7.2의 일부인 vshadow.exe
( documentation ) 에 의존합니다 . 이 버전으로 작업했습니다 : ” VSHADOW.EXE 2.2-볼륨 섀도 복사본 샘플 클라이언트, Copyright (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 | / unmount} [/ debug] / volume-스냅 샷 할 볼륨의 드라이브 문자 / target-스냅 샷을 마운트 할 경로 (절대 또는 상대) / debug-디버그 출력에 참여 예 : cscript / nologo VssSnapshot.vbs / target : C : \ Backup \ DriveD / 볼륨 : D cscript / nologo VssSnapshot.vbs / target : C : \ Backup \ DriveD / unmount 힌트 : 새 스냅 샷을 만들기 전에 마운트를 해제 할 필요가 없습니다.
다음은 샘플 출력입니다.
C : \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target : MountPoints \ E / 볼륨 : 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 ID : {4ed3a907-c66f-4b20-bda0-9dcda3b667ec}으로 생성 된 2010 년 5 월 3 일 17:13:08 스냅 샷 05/03/2010 17:13:08 VSS 스냅 샷이 성공적으로 마운트되었습니다 05/03/2010 17:13:08 완료 C : \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target : MountPoints \ E / 마운트 해제 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 에 따라 자유롭게 사용하십시오 . 내가 묻는 것은 여기에있는 링크를 그대로 두는 것입니다.
답변
- 사용
vssadmin list shadows
가능한 모든 섀도 복사본을 나열 하려면 명령 을 사용하십시오 . 다음과 같은 결과가 나옵니다.
C : \> vssadmin 목록 그림자 vssadmin 1.1-볼륨 섀도 복사본 서비스 관리 명령 줄 도구 (C) 저작권 2001 Microsoft Corp. 쉐도우 복사본 세트 ID의 내용 : {b6f6fb45-bedd-4b77-8f51-14292ee921f3} 생성시 섀도 복사본 1 개 포함 : 2016 년 9 월 25 일 오후 12:14:23 섀도 복사본 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 공급자 1.0' 유형 : ClientAccessible 속성 : 영구, 클라이언트 액세스 가능, 자동 릴리스 없음, 작성자 없음, 차이 쉐도우 복사본 세트 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 Software Shadow Copy 공급자 1.0' 유형 : ClientAccessible 속성 : 영구, 클라이언트 액세스 가능, 자동 릴리스 없음, 작성자 없음, 차이 씨:\
-
Shadow Copy Volume
원하는 섀도 복사본 의 이름 (클립 보드에 가장 쉬운 이름)을 기록해 두십시오. -
쉐도우 복사본 마운트
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
위에서 복사 한 이름입니다. 쉐도우 복사본 이름 끝에 백 슬래시를 추가 해야합니다 !
- Windows 탐색기 또는를 포함하여 원하는 도구를 사용하여
XCOPY
에서 파일에 액세스하십시오c:\shadow
.
답변
VSS가 파일 시스템과 작동하는 방식을 이해하고 있습니다 (데이터베이스와의 작동 방식은 완전히 다릅니다). 파일 시스템에서 VSS는 “이전 버전”기능을 구현하는 데 사용됩니다.이 기능 은 클라이언트의 이전 버전 탭을 통해 복구를 위해 미리 정의 된 시점에 파일 및 폴더의 변경 사항 을 스냅 샷하는 데만 사용됩니다 . 그런 다음 이러한 변경 사항은 복구 세트를 작성하기위한 볼륨의 데이터와 병합됩니다. 따라서 복구를 수행하기 위해 여전히 존재하는 원래 볼륨에 의존합니다. 다시 말해서 적절한 백업 및 복원을 위해 쓸모가 없습니다.
나는 당신이 이것을하고 싶은 방법에서 물러서 고 당신이하고 싶은 일에 대해 다시 생각해야한다고 생각합니다.
350GB의 데이터는 실제로 그리 많지 않으며 매일 적극적으로 사용되는 데이터의 비율이 상당히 낮습니다. 주말에만 전체 백업으로 야간 차등 백업을 수행 한 적이 있습니까? 아니면 “스냅 샷”을 얻기 위해 예약 된 DFS 복제를 대체 스토리지에 사용 하는가 (이는 백업됩니까)?
답변
이것이 당신이 원하는 것이기를 바랍니다.
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
답변
VSS API를 사용하면 볼륨의 “스냅 샷”을 만들 수 있습니다. 그런 다음 해당 스냅 샷을 마운트하려면 해당 스냅 샷을 마운트해야합니다. 라이브 파일 시스템의 다른 프로세스에서 파일을 독점적으로 열었음에도 불구 하고이 기술을 사용하여 데이터를 복제하는 데 사용되는 제품에 익숙합니다. VSS 스냅 샷의 파일이 VSS API와 통합되지 않은 앱에서 작성하는 경우 자체 일관성인지에 대한 유효한 질문이 제기 될 수 있습니다. 유사한 기능을 제공하는 다른 제품이있을 수 있습니다.
답변
짧은 대답 : 할 수 없습니다.
약간 더 긴 답변 : 섀도 복사 서비스는 API를 통해 프로그래밍 방식으로 사용하여 열린 파일을 백업 할 수 있지만 서비스는 시스템의 전체 스냅 샷을 생성하지 않고 부분 스냅 샷 만 생성합니다.