Скрипты Powershell для резервного копирования SQL, SVN - PullRequest
6 голосов
/ 10 ноября 2009

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

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

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

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

Есть идеи / указатели / советы? :)

Ответы [ 2 ]

7 голосов
/ 23 марта 2010

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

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

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

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.

5 голосов
/ 21 ноября 2009

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

[Run.cmd] - возможно, потребуется изменить путь powershell

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

[RunBackup.ps1] - Выходной файл не имеет желаемого эффекта, может быть, кто-то может выяснить, почему?

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] - Модифицировать пути репозитория и резервного копирования

#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, а затем для синхронизации / резервного копирования вне сайта.

...