svnadmin hotcopy整库拷贝方式(转载)
svnadmin hotcopy是將整個庫都“熱”拷貝一份出來,包括庫的鉤子腳本、配置文件等;任何時候運行這個腳本都得到一個版本庫的安全拷貝,不管是否有其他進程正在使用版本庫。
因此這是俺青睞的備份方式。
1)定義備份策略
備份頻度:每天進行一次全量備份,
備份地點:備份目錄以日期命名,備份路徑到 /home/backup/svn/${mmdd}
備份保留時期:保留10天到15天,超過15天的進行刪除。
備份時間:每晚21點開始
備份檢查:備份完畢后自動運行檢查腳本、自動發送報告。
2)建立備份腳本
在自己home目錄 ~/下創建一個文件,backup.sh:
#!/bin/bash
SRCPATH=/home/svn/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
cp $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,如果能正確打印出最新的版本號,則表明備份文件沒有缺失;如果運行報錯,則說明備份不完整。我試過如果備份中斷,則運行svnlook youngest會出錯。
perl腳本代碼如下:
#! /usr/bin/perl
## Author:xuejiang
## 2007-11-10
## http://www.scmbbs.com
use strict;
use Carp;
use Net::SMTP;
#### defined the var #######
my $smtp =Net::SMTP->new('mail.scmbbs.com', Timeout => 30, Debug => 0)|| die "cann't connect to mail.scmbbs.comn";
my $bkrepos="/home/backup/svn/".&get_day;#定義備份路徑
my $ssrepos="http://www.scmbbs.com/repos";#定義倉庫url
my @repos = ("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 youngest ".$bkrepos1." >> ./report 2>&1";
my $svnlookss1 = "echo "$myrepos 真實庫中的最新版本及最后修改時間是:">>./report;svn log -r'HEAD' ".$ssrepos1." >> ./report 2>&1";
system $svnlookbk1 || die "exec failedn";
system $svnlookss1 || die "exec failedn";
}
my $body ???="echo "=========================================================================" >>./report";
my $bottom ????="echo "備份位置:來自http://www.scmbbs.com的".$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 $line1 (@svnnews)
{
print $line1."n";
}
my @email_addresses =("scm@list.scmbbs.com","leader1@scmbbs.com","leader2@scmbbs.com");
my $to ?????????????= join(', ', @email_addresses);
$smtp->mail("scm@scmbbs.com");
$smtp->recipient(@email_addresses);
$smtp->data();
$smtp->datasend("To:$to\n");?
$smtp->datasend("From: svnReport@scmbbs.comn");
$smtp->datasend("Subject:svn備份檢查報告".&get_today."n");
$smtp->datasend("Reply-to:scm@scmbbs.comn");
$smtp->datasend("@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() );
$year += 1900;
$month++;
my $today = sprintf( "%02d%02d", $month, $day);
return $today;
}
4)定義刪除腳本
由于是全量備份,所以備份不宜保留太多,只需要保留最近10來天的即可,對于超過15天歷史的備份基本可以刪除了。
在/home/backup/svn/下建立一個perl腳本:deletDir.pl
(注意,刪除svn備份庫可不像刪除普通文件那么簡單)
腳本代碼請參看我的另一個帖子:http://www.scmbbs.com/cn/systp/2007/12/systp6.php
5)修改/etc/crontab 文件
在該文件中指定每晚21點執行“backup.sh”腳本。
http://blog.chinaunix.net/uid-305417-id-2133668.html
=======================
因為有些svnadmin命令(例如svnadmin hotcopy?--incremental? ;svanadmin pack),只能用于FSFS格式庫文件。需要知道當前庫的文件格式是什么。
例如:Subversion(SVN)備份問題(用 svnadmin hotcopy 支持增量備份)?https://www.cnblogs.com/johnphan/p/9282662.html
使用?svnadmin info?命令可以查看庫文件的格式設置。
要注意的是,更新日志上說1.9.0版本才支持這個功能,
Version 1.9.0 (5 Aug 2015, from /branches/1.9.x) http://svn.apache.org/repos/asf/subversion/tags/1.9.0 * svnadmin info: new subcommand to print info about a repository使用例子:
E:\Repositories>svnadmin info aa
Path: aa
UUID: 7896e1b3-c25b-dc44-bc7b-5e1bd20f2010
Repository Format: 5
Compatible With Version: 1.8.0
Repository Capability: mergeinfo
Filesystem Type:?fsfs
Filesystem Format: 6
FSFS Sharded: yes
FSFS Shard Size: 1000
FSFS Shards Packed: 0/0
FSFS Logical Addressing: no
Configuration File: aa\db\fsfs.conf
(上面最后一行,提示不使用這個命令,在相應的目錄下,看到文件名: fsfs.conf,也可以做出判斷出來當前SVN庫的文件類型是fsfs。這也許是最原始的方法。)
=====================================================================
SVN備份方法:
- 直接備份SVN的Pepositories文件,應該是最不好的方法,需要停止Subversion服務。不然,可能出問題。
- 用命令svnadmin Dump&Load備份的方法,只能備份數據部分,無法備份SVN的權限設置、hook腳本等數據。但可以選擇備份數據庫的一部分數據,也實現可增量備份。
- 備份SVN 的最好方法,是用 svnadmin hotcopy 備份的方法,第一次要全部備份(耗時巨長);以后的每次備份,用?svnadmin hotcopy?--incremental?選項,每次增量備份,速度飛快。
但是,svnadmin hotcopy?這種備份方法無法備份?SVN?或 VisualSVN?的配置數據,包括:用戶信息、分組分組、用戶權限分配、用戶設置的密碼,這幾個文件還是手工備份一下吧!
注意:這個增量備份的選項,僅僅在庫文件是 FSFS 格式才可用。當然,一般SVN都是用這種格式。
參考資料:
查看已經創建的svn庫是 FSFS 還是 VDFS 的
網絡(中文)上許多地方都說 svnadmin hotcopy 不能增量備份!
查看Subversion的升級日志,早在2013年 svnadmin hotcopy 就支持增量備份了。
日志摘錄:
?Version 1.8.0
(18 Jun 2013, from /branches/1.8.x)
* new 'svnadmin hotcopy --incremental' support for FSFS (issue #3815)
https://svn.apache.org/repos/asf/subversion/trunk/CHANGES
?
網絡上有資料說,每次增量備份可以是這樣:
svnadmin verify %repopath%
svnadmin pack %repopath%
svnadmin hotcopy %repopath% %backupdir% --incremental
網摘一段參考文字:http://subversion.apache.org/docs/release-notes/1.8.html#incremental-hotcopy
the svnadmin hotcopy command now supports incremental operation, triggered by the?new --incremental option.
In prior releases of Subversion, svnadmin hotcopy refused to copy over an existing destination repository, and always copied the entire repository. For large repositories, performing a hotcopy could take several hours, preventing an efficient backup process.
In incremental hotcopy mode, revision data which has already been copied from the source to the destination repository will not be copied again. svnadmin hotcopy --incremental will only copy new revisions, and revisions which have changed in size or had their modification time stamp changed since the previous hotcopy operation.
Up to now, svnsync or svnadmin dump --incremental were the only alternatives for incremental repository backup. However, these commands need to perform additional processing while transforming revision data into an intermediate format before creating revision files in the destination repository. Performance of svnadmin hotcopy is only limited by disk I/O.
Incremental hotcopy is not supported for BDB repositories. See issue 4081 for more information.
總結
以上是生活随笔為你收集整理的svnadmin hotcopy整库拷贝方式(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 线程———详解
- 下一篇: MySQL 重置密码