用于备份SQL,SVN的Powershell脚本

bsz*_*zom 6 sql svn backup powershell webdav

我正在尝试使用PowerShell创建一些备份,然后将这些备份复制到Web文件夹(或者换句话说,将它们上传到WebDAV共享).

起初我以为我会从PowerShell中做WebDAV的东西,但似乎这仍然需要相当数量的"手工劳动",即:构建HTTP请求.然后我决定从脚本创建一个Web文件夹,让Windows处理WebDAV的东西.似乎一切都需要创建一个Web文件夹创建一个标准快捷,描述在这里.

我无法弄清楚的是如何将文件实际复制到快捷方式的目标..?也许我会以错误的方式解决这个问题.

如果我能以某种方式加密脚本中的WebDAV凭据,然后让它创建Web文件夹,分流文件,再次删除Web文件夹,那将是理想的选择.或者甚至更好,根本不使用网络文件夹.第三种选择是手动创建Web文件夹并将其留在那里,但我宁愿不这样做.

任何想法/指针/提示?:)

Dav*_*tin 7

如果您使用powershell使用svnadmin dump备份SVN存储库,请注意对文件的管道将无声地损坏您的备份.

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
Run Code Online (Sandbox Code Playgroud)

请注意,输出重定向上的反引号需要停止PowerShell解析它.

  • 输出重定向上的反引号提示+1. (2认同)

bsz*_*zom 5

好吧,与此同时,我拼凑了另一个解决方案.也许它会对某人有用..

[Run.cmd] - 可能需要更改powershell路径

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nologo -noninteractive -command "C:\Scripts\RunBackup.ps1"
Run Code Online (Sandbox Code Playgroud)

[RunBackup.ps1] - Out-File没有达到预期的效果,也许有人可以找出原因?

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"
Run Code Online (Sandbox Code Playgroud)

[SqlBackup.ps1] - 您可能需要修改加载的SMO程序集,具体取决于您的SQL Server版本.不要忘记设置$ 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)
     } 
}
Run Code Online (Sandbox Code Playgroud)

[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
Run Code Online (Sandbox Code Playgroud)

[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
Run Code Online (Sandbox Code Playgroud)

我使用GoodSync备份到WebDAV并安排了两个任务来运行.cmd文件,然后在异地同步/备份.