【问题标题】:Powershell scripts to backup SQL, SVN用于备份 SQL、SVN 的 Powershell 脚本
【发布时间】:2010-12-15 03:32:29
【问题描述】:

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

起初我以为我会在 PowerShell 中完成 WebDAV 的工作,但似乎这仍然需要相当多的“体力劳动”,即:构建 HTTP 请求。然后我决定从脚本创建一个 web 文件夹并让 Windows 处理 WebDAV 的东西。似乎创建 Web 文件夹所需要做的就是创建一个标准快捷方式,如 here 所述。

我想不通的是如何将文件实际复制到快捷方式的目标..?也许我的做法是错误的。

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

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

【问题讨论】:

    标签: sql svn powershell backup webdav


    【解决方案1】:

    如果您使用 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
    

    请注意,输出重定向上的反引号是停止 powershell 解析它所必需的。

    【讨论】:

      【解决方案2】:

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

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

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

      [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"
      

      [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] --修改repo和备份路径

      #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 文件,然后在异地同步/备份。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-31
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多