《2022年配置库的备份与恢复 .pdf》由会员分享,可在线阅读,更多相关《2022年配置库的备份与恢复 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1. 目的防止服务器硬件损坏造成数据丢失、防止人为的误操作导致数据被破坏2. SVN管理2.1 备份方式svnadmin dump:svnadmin dump 是官方推荐的备份方式,比较适合用于版本数较小时使用优点:比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。缺点:如果版本比较大,如版本数增长到数万、数十万,那么dump 的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。全备份: svnadmin dump 版本库路径及名称revision 导出的版本号 导出的命名增量备份: svnadmin dump 版本库路径及名称revision 上次导出的版本号:到本次要导
2、出到的版本号incremental 导出的命名压缩备份: svnadmin dump /home/workhome/svn/repository | gzip /repository-backup.gz 不压缩备份: svnadmin dump /home/workhome/svn/repository /repository-backup.svn svnadmin hotcopy:最常见和简单的备份就是直接使用拷贝命令,将版本库目录拷贝到备份目录上,就可以了但是这样不是很安全的方式,因为如果在copy 时版本库发生变化,将会造成备份的结果不够准确,备份丢失的后果,为此subversion 提
3、供了 svnadmin hotcopy 的命令,可以防止这种问题。优点:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn 服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。缺点:比较耗费硬盘, 需要有较大的硬盘支持。只能进行全量拷贝,不能进行增量备份。全备份: svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH svnsync :svnsync实际上是制作2 个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须 svn1.4 版本以上才支持这个功能。优点:当制作成2 个镜像库的时候起到双机实时备份的作用;缺点: 当作为 2 个镜
4、像库使用时,没办法做到 “想完全抛弃今天的修改恢复到昨晚的样子” ;而当作为普通备份机制每日备份时,操作又较前2 种方法麻烦。例如:同步版本库d:sourcecodeproject1 1) 新建一个空的版本库project2 运行命令:svnadmin create d:sourcecodeproject2 2) 为新的版本库创建pre-revprop-change 钩子脚本 (hook scr pt) 在 d:sourcecodeproject2hooks目录下新建一个空的pre-revprop-change.bat 文件3) 初始化版本库运行命令:svnsync init file:/d:
5、/sourcecode/project2 file:/d:/sourcecode/project1 4) 同步版本库运行命令:svnsync sync file:/d:/sourcecode/project2 5) 至此,版本库同步已经完成。在使用新的版本库之前,还需要根据需要对版本库的访问权限等进行配置。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 使用钩子脚本Hooks 实现自动同步:1) 建立 post-commit.
6、bat 文件,内容为:echo off set SVN_HOME=D:Subversion %SVN_HOME%binsvnsync sync -non-interactive svn:/localhost/project2 2) 把 post-commit.bat 文件放到版本库project1 下的 hooks 目录下, 这样 project1 每次提交,都会引起project2 的同步2.2 备份策略全备份:做的一个完整备份;差量备份:以上一次的全备份为基本做的备份;增量备份:以上一次全备份或增量备份为基本做的备份。方案举例:1)全备份 +增量备份方案:假如我们周一做全备份,周二做增量备
7、份是在周一的基础上做的,周三做增量备份是在周二基础上的,后面的类推。 。说明: 恢复的时候比较麻烦(需要依次恢复之前的每次增量备份直到全备份,比如说,恢复周四的备份,需要依次恢复周四的增量备份,周三的增量备份,周二的增量备份,周一的全备份) ,但节约空间;2)全备份 +差量备份方案:周一做全备份,周二做的差量备份是在周一的基础上做的,周三的差量备份是在周一的基础上做的,后面的类推。 。说明:恢复的时候比较方便(只需恢复当天的差量备份和周一的全备份),占空间稍大。*官方推荐的备份策略:备份机制备份频度备份地点备份文件验证全量备份每周六21:00 /home/backup/svn/ weekly_
8、fully_backup.yymmdd 每月末进行svnadmin load 恢复试验增量备份每周日到周五 21:00 /home/backup/svn/delta daily-incremental-backup 2.3 自动备份脚本2.3.1 Windows 操作系统全量备份1)simpleBackup.batecho 正在备份版本库%1. %SVN_HOME%binsvnadmin hotcopy %1 %BACKUP_DIRECTORY%2 echo 版本库 %1成功备份到了 %2 !2)svnbackup.batecho offrem Subversion的安装目录set SVN_H
9、OME=C:Program FilesSubversion rem 所有版本库的父目录set SVN_ROOT=D:svn rem 备份的目录set BACKUP_SVN_ROOT=F:backupsvnbackup 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%date:0,10% if exist %BACKUP_DIRECTORY% goto
10、checkBack echo 建立备份目录%BACKUP_DIRECTORY%SVN_ROOT%/backup.log mkdir %BACKUP_DIRECTORY% rem 验证目录是否为版本库,如果是则取出名称备份for /r %SVN_ROOT% %I in (.) do if exist %Iconfsvnserve.conf %SVN_ROOT%simpleBackup.bat %fI %nI goto end :checkBack echo 备份目录 %BACKUP_DIRECTORY%已经存在,请清空。goto end :end *最后将操作加入到系统的at 任务当中去,例如还
11、是上面的环境,为了安装at 务任,我们运行:at 1: 00 /every:M D:svnrootbackup.bat 或者从所有程序 - 附件-系统工具 - 任务计划里添加任务。增量备份svnadmin dump 命令进行增量的备份,使用方法是:svnadmin dump project1 -revision 15 -incremental dumpfile2 上面的命令实现了对修订版本15 进行增量的备份,其中的输出文件dumpfile2只保存了修订版本15 更改的内容。为了记录每次提交的结果使用post-commit钩子,这个钩子会在每次提交之后执行,为了实现我们的备份功能,我们在项目p
12、ro1 下的 hooks 里建立一个文件post-commit.bat,内容如下:1)post-commit.batecho off set SVN_HOME=C:Program FilesSubversion set SVN_ROOT=D:svn set UNIX_SVN_ROOT=D:/svn set DELTA_BACKUP_SVN_ROOT=F:backupsvnbackupdelta set LOG_FILE=%1deltaBackup.log echo backup revision %2 %LOG_FILE% for /r %SVN_ROOT% %I in (.) do if D
13、:svn%nI=%1 %SVN_ROOT%nIhooksdeltaBackup.bat %nI %2 goto end :end 通过这个脚本,可以实现D:svn下的版本库提交时自动增量备份F:backupsvnbackupdelta(确定这个目录存在)其中使用的deltaBackup.bat其实可以放在任何地方,只是对脚本的svnadmin dump的包装,内容如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 2)del
14、taBackup.batecho 正在备份版本库%1. %SVN_HOME%binsvnadmin dump %SVN_ROOT%1 -incremental -revision %2 %DELTA_BACKUP_SVN_ROOT%1-%date:0,10%.dump echo 版本库 %1成功备份到了 %2 !2.3.2 Linux操作系统1、svnadmin dump备份工具- 这是 subversion 官方推荐的备份方式。1)定义备份策略:备份频度:每周六进行一次全量备份,每周日到周五进行增量备份备份地点:备份存储路径到/home/backup/svn/ 备份命名:全量备份文件名为:w
15、eekly_fully_backup.yymmdd, 增量备份文件命名为:daily-incremental-backup.yymmdd 备份时间:每晚21 点开始备份检查:每月末进行svnadmin load 恢复试验。2)建立全量备份脚本:在/下建立一个perl 脚本文件, 名为 weekly_backup.pl ,执行全量备份, 并压缩备份文件,代码如下(本代码只针对一个库的备份,如果是多个库请做相应改动):weekly_backup.pl #!/usr/bin/perl -w my $svn_repos=/home/svn/repos/project1; my $backup_dir=
16、/home/backup/svn/; my $next_backup_file = weekly_fully_backup.date +%Y%m%d; $youngest=svnlook youngest $svn_repos; chomp $youngest; print Backing up to revision $youngestn; my $svnadmin_cmd=svnadmin dump -revision 0:$youngest $svn_repos $backup_dir/$next_backup_file; $svnadmin_cmd; open(LOG,$backup_
17、dir/last_backed_up); # 记录备份的版本号print LOG $youngest; close LOG; #如果想节约空间,则再执行下面的压缩脚本print Compressing dump file.n; print gzip -g $backup_dir/$next_backup_file; 3)建立增量备份脚本:在全量备份的基础上,进行增量备份: 在/下建立一个perl 脚本文件, 名为:daily_backup.pl ,代码如下:daily_backup.pl #!/usr/bin/perl -w my $svn_repos=/home/svn/repos/proj
18、ect1; my $backup_dir=/home/backup/svn/; my $next_backup_file = daily_incremental_backup.date +%Y%m%d; open(IN,$backup_dir/last_backed_up); $previous_youngest = ; chomp $previous_youngest; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - clo
19、se IN; $youngest=svnlook youngest $svn_repos; chomp $youngest; if ($youngest eq $previous_youngest) print No new revisions to backup.n; exit 0; my $first_rev = $previous_youngest + 1; print Backing up revisions $youngest .n; my $svnadmin_cmd = svnadmin dump -incremental -revision $first_rev:$younges
20、t $svn_repos $backup_dir/$next_backup_file; $svnadmin_cmd; open(LOG,$backup_dir/last_backed_up); # 记录备份的版本号print LOG $youngest; close LOG; #如果想节约空间,则再执行下面的压缩脚本print Compressing dump file.n; print gzip -g $backup_dir/$next_backup_file; 4)配置 /etc/crontab 文件配置 /etc/crontab 文件,指定每周六执行weekly_backup.pl ,指
21、定周一到周五执行daily_backup.pl; 具体步骤略 . 5)备份恢复检查在月底恢复检查中或者在灾难来临时,请按照如下步骤进行恢复:恢复顺序从低版本逐个恢复到高版本;即,先恢复最近的一次完整备份weekly_full_backup.071201 (举例),然后恢复紧挨着这个文件的增量备份daily_incremental_backup.071202 ,再恢复后一天的备份071203,依次类推。如下:user1mkdir newrepos user1svnadmin create newrepos user1svnadmin load newrepos svnadmin load new
22、repos svnadmin load newrepos zcat weekly_full_backup.071201 | svnadmin load newrepos user1zcat daily_incremental_backup.071202 | svnadmin load newrepos . (这部分内容很多参考了版本控制之道) 2、svnadmin hotcopy整库拷贝方式- svnadmin hotcopy 是将整个库都“热”拷贝一份出来,包括库的钩子脚本、配置文件等;任何时候运行这个脚本都得到一个版本库的安全拷贝,不管是否有其他进程正在使用版本库。1)定义备份策略备份频度
23、:每天进行一次全量备份,备份地点:备份目录以日期命名,备份路径到/home/backup/svn/$mmdd 备份保留时期:保留10 天到 15 天,超过15 天的进行删除。备份时间:每晚21 点开始名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 备份检查:备份完毕后自动运行检查脚本、自动发送报告。2)建立备份脚本在自己 home 目录/下创建一个文件,backup.sh:#!/bin/bash SRCPATH=/home/s
24、vn/repos/; #定义仓库parent 路径DISTPATH=/home/backup/svn/date +%m%d/ ; # 定义存放路径 ; if -d $DISTPATH then else mkdir $DISTPATH chmod g+s $DISTPATH fi echo $DISTPATH svnadmin hotcopy $SRCPATH/Project1 $DISTPATH/Project1 /home/backup/svn/cpreport.log 2&1; svnadmin hotcopy $SRCPATH/Project2 $DISTPATH/Project2 c
25、p $SRCPATH/access $DISTPATH; # 备份 access文件cp $SRCPATH/passwd $DISTPATH; # 备份 passwd 文件perl /home/backup/svn/backup_check.pl #运行检查脚本perl /home/backup/svn/deletDir.pl #运行删除脚本,对过期备份进行删除。3)建立检查脚本在上面指定的地方/home/backup/svn/下建立一个perl 脚本: backup_check.pl 备份完整性检查的思路是:对备份的库运行svnlook youngest ,如果能正确打印出最新的版本号,则表
26、明备份文件没有缺失;如果运行报错, 则说明备份不完整。我试过如果备份中断,则运行 svnlook youngest 会出错。backup_check.pl#! /usr/bin/perl use strict; use Carp; use Net:SMTP; # defined the var # my $smtp =Net:SMTP-new(, Timeout = 30, Debug = 0)| die cannt connect to n; my $bkrepos=/home/backup/svn/.&get_day;#定义备份路径my $ssrepos=http:/ my repos =
27、 (project1,project2); my $title=echo 如下是昨晚备份结果与真实库对比的情况,如果给出备份版本数,则表示备份成功;如果给报错信息或没有备份版本数,则表示备份失败: ./report; system $title | die exec failedn; foreach my $myrepos(repos) my $bkrepos1=$bkrepos./.$myrepos; my $ssrepos1=$ssrepos./.$myrepos; my $svnlookbk1 = echo $myrepos 昨晚备份的版本是:./report;svnlook young
28、est .$bkrepos1. ./report 2&1; my $svnlookss1 = echo $myrepos 真 实 库 中 的 最 新 版 本 及 最 后 修 改 时 间 是 :./report;svn log -rHEAD .$ssrepos1. ./report 2&1; system $svnlookbk1 | die exec failedn; system $svnlookss1 | die exec failedn; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
29、- 第 6 页,共 12 页 - - - - - - - - - my $body =echo = ./report; my $bottom =echo 备份 位 置 : 来 自http:/的.$bkrepos. ./report; system $body | die exec failedn; system $bottom | die exec failedn; # report the result # open(SESAME,./report)| die can not open ./report; my svnnews = ; close(SESAME); foreach my $l
30、ine1 (svnnews) print $line1.n; my email_addresses =(,); my $to = join(, , email_addresses); $smtp-mail(); $smtp-recipient(email_addresses); $smtp-data(); $smtp-datasend(To:$ton); $smtp-datasend(From: svnRn); $smtp-datasend(Subject:svn 备份检查报告.&get_today.n); $smtp-datasend(Reply-to:n); $smtp-datasend(
31、svnnews); $smtp-dataend(); $smtp-quit; # sub get_today my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() ); $year += 1900; $month+; my $today = sprintf( %04d%02d%02d, $year, $month, $day); return $today; sub get_day my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() ); $
32、year += 1900; $month+; my $today = sprintf( %02d%02d, $month, $day); return $today; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - 4)定义删除脚本由于是全量备份,所以备份不宜保留太多,只需要保留最近10 来天的即可,对于超过15 天历史的备份基本可以删除了。在/home/backup/svn/ 下建立一个脚本deletDir.pl delet
33、Dir.pl #!/usr/bin/perl #! /usr/bin/perl # Author:xuejiang # Site: http:/ #本单元:定期删除备份数据,并保证备份数据一直介于7 到 16 份之间,#适用:备份目录以mmdd 的日期格式命名。use Cwd; use File:Find; &main(); sub main() #取得当前时间,根据时间设置定期进行删除my $targetDir=/home/backup/svn/hotcopy2/; # 定义备份目录。my( $sec, $min, $hour, $day, $month, $year,$wday,$yday
34、 ) = localtime( time() ); $month+; my $today = sprintf( %02d, $day); if ($today ! /(01$|15$|25$|)/) exit(0); my $monthday= sprintf( %02d%02d, $month, $day); my $thismonth= sprintf(%02d,$month); my ($lastmonth,$passdate,$tempstr); #定义删除的目录数组,对每个目录调用函数deleteDir 进行删除。chdir($targetDir); my dir=; print d
35、ir; if($thismonth=/ 01/) $lastmonth=12; else $lastmonth=$thismonth - 1; foreach my $dir(dir) if ($dir = /0-9/) next; #每月 1 号删除上个月21 号之前所有数据if ($today=/01$/) $passdate=$lastmonth.21; if ($lastmonth = 12) $tempstr= substr($dir,0,2); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
36、 - - - - 第 8 页,共 12 页 - - - - - - - - - if ($tempstr ne 01)&($dir $passdate) &deleteDir($targetDir.$dir); else if ($dir $passdate) &deleteDir($targetDir.$dir); #每月 15 号删除上个月所有数据和本月8 号前的所有数据if ($today= /15$/) $passdate=$thismonth.08; if ($dir $passdate) &deleteDir($targetDir.$dir); if ($lastmonth = 1
37、2) $tempstr= substr($dir,0,2); if ($tempstr = 12) &deleteDir($targetDir.$dir); #每月 25 号删除本月19 号之前的所有数据。if ($today= /25$/) $passdate=$thismonth.19; if ($dir $passdate) &deleteDir($targetDir.$dir); if ($lastmonth = 12) $tempstr= substr($dir,0,2); if ($tempstr = 12) &deleteDir($targetDir.$dir); #递归遍历各目
38、录,遍历各个文件, 每个文件先进行chmod 777 filename 操作,再进行rm -rf filename 操作。sub deleteDir($) my ($dir)=_; print log in the dir:$dir n; my $handle; opendir($handle,$dir); while(defined(my $ndir=readdir($handle) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - -
39、- - if ($ndir eq .)|($ndir eq .) next; $ndir=$dir./.$ndir; if (-f $ndir) ls chmod 777 $ndir; # 如果需要此步。print file:$ndirn if unlink($ndir); else print Dir:$ndirn; deleteDir($ndir); closedir($handle); rmdir($dir); print now locate:$dirn; 5)修改 /etc/crontab 文件在该文件中指定每晚21 点执行“ backup.sh”脚本。3、svnsync备份- 参阅
40、: http:/ 使用 svnsync备份很简单,步骤如下:1)在备份机上创建一个空库:svnadmin create Project1 2)更改该库的钩子脚本pre-revprop-change (因为 svnsync 要改这个库的属性,也就是要将源库的属性备份到这个库,所以要启用这个脚本): cd SMP/hooks; cp pre-revprop-change.tmpl pre-revprop-change; chmod 755 pre-revprop-change; vi pre-revprop-change; 将该脚本后面的三句注释掉,或者干脆将它弄成一个空文件。3)初始化,此时还没
41、有备份任何数据:svnsync init file:/home/backup/svn/svnsync/Project1/ http:/ 语法是: svnsync init 你刚创建的库url 源库 url 注意本地url 是三个斜杠的:/ 4)开始备份(同步) :svnsync sync file:/home/backup/svn/svnsync/Project1 5)建立同步脚本备份完毕后,建立钩子脚本进行同步。在源库/hooks/ 下建立 /修改 post-commit脚本,在其中增加一行,内容如下:/usr/bin/svnsync sync -non-interactive file:/
42、home/backup/svn/svnsync/Project1 可通过将远程的备份机mount(请参阅mount 命令) 到 svn 服务器上来实现的,逻辑上看起来是本地备份,物理上实际是异地备份。2.4 还原全量备份还原直接把“F: backupsvnbackup2007-03-19XX项目资料库” 复制到“D:svnXX项目资料库”名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 增量备份还原svnadmin load
43、要恢复的版本库路径及名称 导出的命名示例: svnadmin load D:svnfxq_fxcjg dumpfile 例如 :C:Documents and SettingsAdministrator.LONTON-WDsvnadmin dump svndumpfilesres 2.5.2 拷贝 dump 文件到新服务器把 D:svnrese:svndumpfilesres文件拷贝到新SVN服务器的 F:dumpfiles 目录下2.5.3 远程到新 SVN服务器,新建一个同名版本库Svnadmin create D:svnres 2.5.4 导入新的版本库语法: svnadmin load
44、 REPOS_PATH 输入重定向: svnadmin load newrepos svnadmin load D:svnres svn info 路径 : . URL: http:/localhost:85 /svn/res/trunk 仓库根 : http:/localhost:85 /svn/res 仓库UUID: 948ac601-1767-a745-9587-952420bfe539 版本 : 7 节点种类 : 目录调度 : 正常最后修改的作者: lonton 最后修改的版本: 6 最后修改的时间: 2009-03-17 14:24:20 +0800 (星期二 , 17 三月2009
45、) / 第三步:切换客户端仓库根目录C:Documents and 桌面 trunk svn switch -relocate http:/localhost:85 /svn/res http:/192.168.1.120:85 /svn/res / 第四步:检查切换是否成功C:Documents and 桌面trunk svn info路径 : . URL: http:/192.168.1.120:85 /svn/res/trunk 仓库根 : http:/192.168.1.120:85 /svn/res 仓库UUID: 948ac601-1767-a745-9587-952420bfe5
46、39 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 版本 : 7 节点种类 : 目录调度 : 正常最后修改的作者: lonton 最后修改的版本: 6 最后修改的时间: 2009-03-17 14:24:20 +0800 (星期二 , 17 三月2009) 2.5.6 同步/对目标库初始化svnsync init http:/192.168.1.120:85 /svn/res http:/localhost:85 /svn
47、/res/ 钩子自动同步希望在每次提交时同步,则需要在源版本库增加post-commit脚本,内容如下:echo off set SVN_HOME=C:Program FilesSubversion %SVN_HOME%binsvnsync sync -non-interactive http:/192.168.1.120:85 /svn/res1svn switch -relocate http:/192.168.1.120:85 /svn/res http:/localhost:85/svn/res3. Bugzilla 管理1、MySQLl 提供了一个mysqldump 命令,我们可以用
48、它进行数据备份,下面假设要备份tm这个数据库:#mysqldump -u root -p tm tm_050519.sql 自动备份脚本bugzilla_backup.bat :mysqldump -hlocalhost -uroot -plonton -rF:backupbugzilla_bkbugs_%date:0,10%.sql bugs echo dump database bugs over! 按提示输入密码,这就把tm 数据库所有的表结构和数据备份到tm_050519.sql 了,因为要总进行备份工作,如果数据量大会占用很大空间,这时可以利用gzip 压缩数据,命令如下:#mysqldump -u root -p tm | gzip tm_050519.sql.gz 系统崩溃,重建系统时,可以这样恢复数据:#mysql -u root -p tm tm_050519.sql 从压缩文件直接恢复:#gzip tm_050519.sql.gz | mysql -u root -p tm 2、使用 phpMyAdmin 进行管理名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -