2009-11-10 2 views
4

Я пытаюсь использовать PowerShell для создания некоторых резервных копий, а затем для их копирования в веб-папку (или, другими словами, для их загрузки в общий ресурс WebDAV).Скрипты Powershell для резервного копирования SQL, SVN

Сначала мне показалось, что я буду делать вещи WebDAV из PowerShell, но, похоже, это все еще требует значительного количества «ручного труда», т. Е. Построения HTTP-запросов. Затем я решил создать веб-папку из сценария и позволить Windows обрабатывать вещи WebDAV. Кажется, что все, что требуется для создания веб-папки, - это создать стандартный ярлык, как описано here.

Я не могу понять, как на самом деле скопировать файлы в цель ярлыка ..? Возможно, я ошибаюсь.

Было бы идеально, если бы я мог каким-то образом зашифровать учетные данные для WebDAV в скрипте, затем создать веб-папку, обмануть файлы и снова удалить веб-папку. Или даже лучше, не используйте веб-папку вообще. Третьим вариантом было бы просто создать веб-папку вручную и оставить его там, хотя я бы предпочел не делать этого.

Любые идеи/указатели/подсказки? :)

ответ

3

Ну, тем временем я собрал другое решение. Может быть, это будет полезно для кого-то ..

[Run.cmd] --May необходимо изменить путь Powershell

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nologo -noninteractive -command "C:\Scripts\RunBackup.ps1" 

[RunBackup.ps1] --out-файла не имеющего желаемого эффекта, может быть, кто-то может понять, почему?

C:\Scripts\SqlBackup.ps1 | Out-File "C:\Scripts\log.txt" 
C:\Scripts\SVNBackup.ps1 | Out-File "C:\Scripts\log.txt" 
C:\Scripts\Zip.ps1 | Out-File "C:\Scripts\log.txt" 

[SqlBackup.ps1] --Вы может потребоваться изменить которые SMO сборки загружаются, в зависимости от версии сервера SQL . Не забудьте установить $ instance и $ bkdir.

#http://www.mssqltips.com/tip.asp?tip=1862&home 

$instance = ".\SQLEXPRESS" 


[System.Reflection.Assembly]::LoadFrom("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SMO.dll") | out-null 

[System.Reflection.Assembly]::LoadFrom("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SMOExtended.dll") | out-null 

$s = new-object ("Microsoft.SqlServer.Management.Smo.Server") $instance 

$bkdir = "c:\Backups" #We define the folder path as a variable 
$dbs = $s.Databases 
foreach ($db in $dbs) 
{ 
    if($db.Name -ne "tempdb") #We don't want to backup the tempdb database 
    { 
    $dbname = $db.Name 
    $dt = get-date -format yyyyMMddHHmm #We use this to create a file name based on the timestamp 
    $dbBackup = new-object ("Microsoft.SqlServer.Management.Smo.Backup") 
    $dbBackup.Action = "Database" 
    $dbBackup.Database = $dbname 
    $dbBackup.Devices.AddDevice($bkdir + "\" + $dbname + "_db_" + $dt + ".bak", "File") 
    $dbBackup.SqlBackup($s) 
    } 

    if($db.RecoveryModel -ne 3) #Don't issue Log backups for DBs with RecoveryModel=3 or SIMPLE 
    { 
    $dbname = $db.Name 
    $dt = get-date -format yyyyMMddHHmm #Create a file name based on the timestamp 
    $dbBackup = new-object ("Microsoft.SqlServer.Management.Smo.Backup") 
    $dbBackup.Action = "Log" 
    $dbBackup.Database = $dbname 
    $dbBackup.Devices.AddDevice($bkdir + "\" + $dbname + "_log_" + $dt + ".trn", "File") 
    $dbBackup.SqlBackup($s) 
    } 
} 

[SVNBackup.ps1] --Modify репо и резервный путь

#set alias to svnadmin exe 
set-alias svnadmin "C:\Program Files (x86)\CollabNet Subversion Server\svnadmin.exe" 

#create dump 
cmd.exe /c svnadmin dump "C:\Repo" `> "C:\Backups\svn.dmp" 

#remove alias 
remove-item alias:svnadmin 

[Zip.ps1] --потребность иметь 7zip установлено, изменить 7z.exe пути при необходимости

#set alias to command line version of 7zip 
set-alias sevenz "c:\program files\7-zip\7z.exe" 

#Backups location 
cd 'C:\Backups' 

#rar the contents of the directory 
$dt = get-date -format yyyyMMddHHmm #We use this to create a file name based on the timestamp 
$outputFileName = "SQLSVNBackup$dt.7z" 
$exclude1 = "-x!*.rar" 
$exclude2 = "-x!*.7z" 
sevenz a -t7z "$outputFileName" *.* "$exclude1" "$exclude2" 

#find all .bak files in the immediate directory 
dir '*.bak' | foreach-object{ 

#remove the bak file 
remove-item $_.name 

} 


#find all .dmp files in the immediate directory 
dir '*.dmp' | foreach-object{ 

#remove the dmp file 
remove-item $_.name 

} 

#find all .trn files in the immediate directory 
dir '*.trn' | foreach-object{ 

#remove the trn file 
remove-item $_.name 

} 

#remove 7zip alias 
remove-item alias:sevenz 

Я использовал GoodSync для резервного копирования в WebDAV и запланировал две задачи для запуска .cmd-файла, а затем для синхронизации/резервного копирования.

6

Если вы используете powershell для резервного копирования репозиториев SVN с помощью svnadmin dump, тогда имейте в виду, что соединение с файлом будет автоматически повреждать ваши резервные копии.

Powershell любит менять вещи на UTF-16 при прокладке труб, он также изменяет разрывы линий Unix на окна. Это вернется, чтобы преследовать вас, когда вы пытаетесь восстановить.

проблема хорошо описана здесь:

http://thoughtfulcode.wordpress.com/2010/01/29/powershells-object-pipeline-corrupts-piped-binary-data/

Решение здесь:

http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.windows.powershell&tid=e4cd89e9-427b-407d-a94f-c24be3f1e36f&cat=&lang=&cr=&sloc=&p=1

В общем, используйте CMD.Exe вместо PowerShell:

cmd.exe /c svnadmin dump ... `> dumpfile.dump 

Обратите внимание, что кавычка на перенаправлении вывода требуется, чтобы остановить его разбор PowerShell.

+0

Спасибо за информацию! – bszom

+2

+1 для подсказки обратной связи при перенаправлении вывода. –

Смежные вопросы