質問の最初の部分は、SVNリポジトリの増分バックアップを作成する方法を教えてください。これを行うコマンドは何ですか.......そしてこれを自動的に行う方法(OS + UNIX)
自分で実行する場合は、「svnlookyoungest」コマンドと「svnadmindump --incremental -r $ {STARTREV}:$ {ENDREV}」コマンドを調べてください。
SVNリポジトリの完全ダンプと増分ダンプを作成するために使用するスクリプトを下に貼り付けました。スクリプトは、最後のバックアップのリビジョンと日付を/ home/svn/varのサブディレクトリに保存します。最初にフルダンプを作成し、次に必要な数のインクリメンタルダンプを作成します。
完全なSVNダンプスクリプト:
#!/bin/sh
# Full dump of all Subversion repositories
# make sure to get the Subversion environment variables
. /etc/profile.d/Subversion.sh
# path to Subversion binaries
SVN_BINPATH=${SVN_HOME}/bin
# path to parent of all repositories to be dumped
SVN_REPPATH=/opt/svn/repositories
# destination directory for backup files
DUMP_DIR=/backup/svn
# status directory
SVN_VAR=/home/svn/var
DATETIME=`date +%Y%m%d`
for rep in ${SVN_REPPATH}/*;
do
TSTAMP=`date +%s`
CURR_REV=`${SVN_BINPATH}/svnlook youngest ${rep}`
REP_BASE=`basename $rep`
echo "**********************************************************"
echo "`date --rfc-2822` - Full back up - ${rep} : "
echo " current revision ${CURR_REV}"
echo
DUMPFILE=${DUMP_DIR}/${REP_BASE}-${DATETIME}.dmp
${SVN_BINPATH}/svnadmin --quiet dump $rep > ${DUMPFILE}
echo ${TSTAMP} > ${SVN_VAR}/status/dates/${REP_BASE}.dt
echo ${CURR_REV} > ${SVN_VAR}/status/revisions/${REP_BASE}.rev
bzip2 --compress --best ${DUMPFILE}
done
echo
echo `ls -hl ${DUMP_DIR}/*.bz2`
インクリメンタルSVNダンプスクリプト:
#!/bin/sh
# Incremental dump of all Subversion repositories
# make sure to get the Subversion environment variables
. /etc/profile.d/Subversion.sh
# path to Subversion binaries
SVN_BINPATH=${SVN_HOME}/bin
# path to parent of all repositories to be dumped
SVN_REPPATH=/opt/svn/repositories
# destination directory for backup files
DUMP_DIR=/backup/svn
# status directory
SVN_VAR=/home/svn/var
DATETIME=`date +%Y%m%d`
for rep in ${SVN_REPPATH}/*;
do
TSTAMP=`date +%s`
CURR_REV=`${SVN_BINPATH}/svnlook youngest ${rep}`
REP_BASE=`basename $rep`
if [ -e ${SVN_VAR}/status/dates/${REP_BASE}.dt ] ; then
REP_LAST_BK_TSTAMP=`cat ${SVN_VAR}/status/dates/${REP_BASE}.dt`
REP_LAST_BK_REV=`cat ${SVN_VAR}/status/revisions/${REP_BASE}.rev`
else
REP_LAST_BK_TSTAMP=0
REP_LAST_BK_REV=0
fi
if [ ${CURR_REV} -gt ${REP_LAST_BK_REV} ] ; then
echo "**********************************************************"
echo "`date --rfc-2822` - Incremental back up ${rep} : "
echo " oldest revision ${REP_LAST_BK_REV} - newest revision ${CURR_REV}"
echo
DUMPFILE=${DUMP_DIR}/${REP_BASE}-${DATETIME}-${REP_LAST_BK_REV}-${CURR_REV}.dmp
${SVN_BINPATH}/svnadmin --quiet dump $rep --incremental -r${REP_LAST_BK_REV}:${CURR_REV}> ${DUMPFILE}
echo ${TSTAMP} > ${SVN_VAR}/status/dates/${REP_BASE}.dt
echo ${CURR_REV} > ${SVN_VAR}/status/revisions/${REP_BASE}.rev
bzip2 --compress --best ${DUMPFILE}
fi
done
echo
echo `ls -hl ${DUMP_DIR}/*.bz2`
お役に立てれば。
レピュテーションのため、上記についてコメントすることはできませんが、示されているスクリプトにはbugがあります。各増分バックアップの最後のリビジョンも次のリビジョンの最初のリビジョンとしてダンプされます。つまり、1つ重複しています。例えば、
repository-20171115-1-3.dmp # initial dump, contains rev. 1-3
repository-20171116-3-8.dmp # second dump, contains 3-8 (should be 4-8!)
repository-20171116-8-15.dmp # third dump, contains 8-15 (should be 9-15!)
これは、「svnload」コマンドを使用してダンプがリポジトリにロードバックされるときに奇妙な問題を引き起こします-同じリビジョンを2回ロードしようとします(ほとんど検出されませんが、ファイルが追加または削除されている場合は失敗します。svnはその後再びアクション)。これらのダンプをロードすることはできますが、各増分ダンプの最初のリビジョンを省略するには、リビジョン範囲を明示的に指定する必要があります。