`
facfuture
  • 浏览: 592 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

SVN备份

阅读更多
最近研究Windows svn的备份机制,结合网上的文章,分享下完成的svn dump的备份脚本,记录一下svnsync的使用方法。
1.svnadmin dump本地备份脚本
不多说了,直接贴脚本。


@echo off
rem SVN库父目录
set SVN_BASE=
rem SVN库名
set SVN_REPOSITORY=
rem 备份方式 full:全量;inc:增量
set DUMP_MOD=full
rem 备份文件
set DUMP_TARGET=
rem 是否压缩备份文件
set COMPRESS_DUMP_FILE=1

rem 存放本程序生成的中间信息的文件夹
set DUMP_HISTORY_INFO_DIR=info
rem 存放最后一次备份时的版本信息
set DUMP_LAST_LOG=last.info
rem 存放所有备份的日志
set DUMP_LOG=dump.log
set cmd_svnadmin=svnadmin
set VALID_ARG=1

goto :main

:usage
echo Usage:
echo     backup -base SVN_PATH -rep REPOSITORY [-full^|-inc] -target PATH
echo Warning:
echo     Any path with blank will make an unkown result.
goto :eof

:main
rem 解析参数
call :parseArg
if "%VALID_ARG%" equ "0" (
     call :usage
     set ERRORLEVEL=1
     goto :eof
)

rem 以下是程序使用的变量,勿随便更改
rem 开始和结束版本
set REV_START=
set REV_END=
set LAST_DUMP_DATE=
set LAST_DUMP_COMMENT=

rem 备份文件(自动生成)、临时信息文件夹、日志文件等
set DUMP_FILE=
set DUMP_INFO_DIR=%DUMP_TARGET%\%SVN_REPOSITORY%\%DUMP_HISTORY_INFO_DIR%
set DUMP_LAST_LOG_FILE=%DUMP_INFO_DIR%\%DUMP_LAST_LOG%
set DUMP_LOG_FILE=%DUMP_LAST_LOG_FILE%\%DUMP_LOG%
set SVN_PATH=%SVN_BASE%\%SVN_REPOSITORY%

rem 确定备份文件名
call :FORMAT_DUMP_FILE
echo Using dump file "%DUMP_FILE%".
rem 确定备份版本
call :parseRev
echo Dump from %REV_START% to %REV_END%
rem 开始备份
call :dobackup
goto :eof

:FORMAT_DUMP_FILE
call :getDate "" "" date time
set DUMP_FILE=%SVN_REPOSITORY%_%date%_%time%.dump
goto :eof

:getDate
set DATE_SEPERATOR="%~1"
set TIME_SEPERATOR="%~2"
>"%temp%/now.vbs" echo currenttime=now
>>"%temp%/now.vbs" echo curdate=right(year(currenttime),4)^&%DATE_SEPERATOR%^&right("0"^&month(currenttime),2)^&%DATE_SEPERATOR%^&right("0"^&day(currenttime),2)
>>"%temp%/now.vbs" echo curtime=right("0"^&hour(currenttime),2)^&%TIME_SEPERATOR%^&right("0"^&minute(currenttime),2)^&%TIME_SEPERATOR%^&right("0"^&second(currenttime),2)
>>"%temp%/now.vbs" echo wscript.echo curdate^&" "^&curtime
for /f "tokens=1,2 delims= " %%a in ('cscript /nologo "%temp%/now.vbs"') do (
     set "today=%%a"
     set "curtime=%%b"
)
if not "%3" == "" set "%~3=%today%"
if not "%4" == "" set "%~4=%curtime%"
goto :eof

:parseRev
for /f %%a in ('svnlook youngest %SVN_PATH%') do set REV_END=%%a
if "%DUMP_MOD%" equ "full" (
     REV_START=0
     goto :eof
)
for /f %%a in ("%DUMP_LAST_LOG_FILE%") do call :parseRev1 "REV_START" "LAST_DUMP_DATE" "LAST_DUMP_COMMENT"
if "REV_START" equ "" (
     set REV_START=0
     set LAST_DUMP_DATE=
     set LAST_DUMP_COMMENT=
)
goto :eof

rem parseRev1 line last date comment
:parseRev1
set line=%~1
if /i "%line:~0,4%" equ "last" set "%~2=%line:~5%"
if /i "%line:~0,4%" equ "date" set "%~3=%line:~5%"
if /i "%line:~0,6%" equ "comment" set "%~4=%line:~7%"
goto :eof

:parseArg
:parseArgStart
if "%1" equ "" goto :parseArgEnd
if /i "-base" equ "%~1" (
     set SVN_BASE=%~2
     shift
     shift
)
if /i "-rep" equ "%~1" (
     set SVN_REPOSITORY=%~2
     shift
     shift
)
if /i "-full" equ "%~1" (
     set DUMP_MOD=full
     shift
)
if /i "-inc" equ "%~1" (
     set DUMP_MOD=inc
     shift
)
if /i "-target" equ "%~1" (
     set DUMP_TARGET=%~2
     shift
     shift
)
goto :parseArgStart
:parseArgEnd
call :blankAndHelp "SVN_BASE"
call :blankAndHelp "SVN_REPOSITORY"
call :blankAndHelp "DUMP_TARGET"
goto :eof

:blankAndHelp
set _WORD_=%~1
call set _VALUE_=%%%_WORD_%%%
if "%_VALUE_%" equ "" (
     set VALID_ARG=0
)
goto :eof

:dobackup
>>%DUMP_LOG_FILE% echo [%today% %curtime%] Trying backup respository "%SVN_PATH%" to "%DUMP_FILE%".
if "REV_START" equ "REV_END" (
     >>%DUMP_LOG_FILE% echo [%today% %curtime%] Respository "%SVN_PATH%" has no changes. The youngest revision is %REV_END%.
     >%DUMP_LAST_LOG_FILE% echo comment:[%today% %curtime%] Respository "%SVN_PATH%" has no changes. The youngest revision is %REV_END%.
     >>%DUMP_LAST_LOG_FILE% echo last:%REV_END%.
     >>%DUMP_LAST_LOG_FILE% echo date:%today% %curtime%].
) else (
     1>>%DUMP_LOG_FILE% 2>&1 %cmd_svnadmin% dump --revision %REV_START%:%REV_END% %SVN_PATH%>%DUMP_FILE%
     if ERRORLEVEL 1 (
          >>%DUMP_LOG_FILE% echo [%today% %curtime%] Dump repository "%SVN_PATH%" failed with returen value %ERRORLEVEL%. The youngest dumped revision is %REV_START%.
          >%DUMP_LAST_LOG_FILE% echo comment:[%today% %curtime%] Dump repository "%SVN_PATH%" failed with returen value %ERRORLEVEL%. The youngest dumped revision is %REV_START%.
          >>%DUMP_LAST_LOG_FILE% echo last:%REV_START%.
          >>%DUMP_LAST_LOG_FILE% echo date:%today% %curtime%].
          del /Q "%DUMP_FILE%"
     ) else (
          if "COMPRESS_DUMP_FILE" equ "1" makecab %DUMP_FILE% %DUMP_FILE%.zip
     )
)
>>%DUMP_LOG_FILE% echo [%today% %curtime%] Dump respository "%SVN_PATH%" has finished. The youngest revision is %REV_END%.
goto :eof



2.svnsync异地备份记录
这里先说一下svnsync的用法,在讲一下备份搭建过程,本文中省略部分建库和建用户的具体步骤。
svnsync init --trust-server-cert --source-username ARG --source-password ARG --sync-username ARG --sync-password ARG DEST_URL SOURCE_URL
svnsync sync --trust-server-cert --non-interactive --source-username ARG --source-password ARG --sync-username ARG --sync-password ARG DEST_UR
注:如果svnsync版本不支持source-username、sync-username分别设置两个库的用户和口令,可以用--username、--password设置源库和备份库的用户和口令,但是两个库的用户和口令必须相同。
--trust-server-cert 信任服务器证书(如https自签名证书)
--source-username 源库用户名
--sync-username 镜像库用户名
ARG DEST_URL、SOURCE_URL 镜像库地址,源库地址
--non-interactive 非交互模式

下面是搭建过程
源  库:https://192.168.1.2:443/svn/lsgl
       服务器路径 e:\svn\lsgl    
       同步用户 syncuser:passwd
镜像库:https://192.168.1.3:443/svn/lsgl    
       服务器路径 d:\svn\lsgl    
       同步用户 syncuser:passwd
1)如果源库不存在,请新建源库,这里不做介绍了,然后新建用户syncuser,并授予读取权限。
以下在镜像服务器:
2)新建一个新库
     mkdir d:\svn\lsgl
     cd d:\svn\lsgl
     svnadmin create
3)在镜像库新建用户syncuser,并授予读写权限。
4)新建文件d:\svn\lsgl\hooks\pre-revprop-change.bat,只允许同步用户修改镜像库属性,内容如下:
IF "%3" == "syncuser" exit 0
echo"Only syncuser may change revision properties">&2
exit 1

5)新建d:\svn\lsgl\hooks\start-commit.bat,只允许同步用户提交新版本,内容如下:
IF "%3" == "syncuser" exit 0
echo"Only syncuser may commit new revisions">&2
exit 1

6)执行命令
svnsync init --username syncuser --password passwd https://192.168.1.3:443/svn/lsgl https://192.168.1.2:443/svn/lsgl
以下在源库服务器执行:
7)新建e:\svn\lsgl\hooks\post-commit.bat,实时备份数据,内容如下。
svnsync --trust-server-cert --non-interactive --username syncuser --password passwd  sync https://192.168.1.3:443/svn/lsgl
至此完成。

还有些话要说,在搭建备份库的时候,新建库后直接开启同步,从r0同步至head;在网上看到新建库后,load数据再进行同步,将方法记录在下面,笔者并没有验证。
先准备源库的dump文件。
svnadmin dump  e:\svn\lsgl > source-lsgl.dump
将上面的第6)步提换如下:
svnadmin load d:\svn\lsgl < source-lsgl.dump
然后手动设置镜像库的属性
svn propset --revprop -r0 svn:sync-from-uuid 源库的UUID
svn propset --revprop -r0 svn:sync-last-merged-rev dump文件的最新版本 https://192.168.1.3:443/svn/lsgl
svn propset --revprop -r0 svn:sync-from-url https://192.168.1.3:443/svn/lsgl。

还有话要说,如何切换备库:
这个简单,讲备库上的bat文件删除,设置好用户和权限后就可以访问了。

最后还有话要说,操作的时候由于命令行用户名输入错误,在提示输入口令时ctrl+c强退了,导致镜像库锁定,出现“Failed to get lock on destination repos currently held by 。。。”的错误,使用下面的命令处理错误。
svn propdel svn:sync-lock --revprop -r0 https://10.204.3.11/svn/lsgl/
分享到:
评论

相关推荐

    SvnBackupApp,Visual SVN Server 备份,Visual SVN 备份,SVN 备份

    Visual SVN Server 备份工具,Visual SVN 备份工具,SVN 备份工具,按天,周,月定时备份,备份文件可加密存储,过期文件可以自动删除。Visual SVN Server 企业版才能用的定时备份任务,SvnBackupApp工具即可办到。...

    SVN备份操作(包括完全备份,增量备份和同步版本库)

    ### SVN备份操作详解 #### 一、概述 版本控制系统的核心目标之一是确保数据的安全性和可靠性。对于企业级项目管理而言,任何因硬件故障或软件错误导致的数据丢失都是无法接受的。因此,制定全面且可靠的备份策略...

    SVN 备份脚本

    通过创建SVN备份脚本,我们可以确保在开发过程中对代码库进行安全保护,避免数据丢失。以下将详细介绍如何实现SVN的增量备份和全量备份。 1. **全量备份** 全量备份是指获取SVN仓库中的所有文件和版本历史的完整...

    SVN备份还原清理BAT

    对网上的SVN备份、还原、清理几天之前的备份进行了测试与修改。 全量备份:fullbackup.bat(使用前先修改目录)、hotcopy.bat 增量备份:svndump.bat(使用前先修改目录)、dump.bat、projectlist.conf(使用前先修改svn...

    SVN备份方案

    ### SVN备份方案详解 #### 一、备份与恢复机制 在IT行业中,版本控制系统是确保项目稳定性和可追溯性的重要工具之一。对于Subversion (SVN) 这样的集中式版本控制系统来说,确保数据的安全性至关重要。本文将详细...

    svn 备份 bat

    通过以上步骤,你就创建了一个自定义的SVN备份bat脚本,实现了自动化SVN仓库的备份。这个脚本可以根据具体需求进行调整,例如增加加密备份、压缩备份等高级功能。记得定期检查并更新脚本,确保它与你的SVN服务器配置...

    Svn最强大的Windows下实现自动全量增量备份和异地备份,一切自动化完成

    1.SVN备份内容 SVN在Windows下的自动备份实现,包括: 1)SVN目录的全备份(1周或1个月备份1次,由windows计划来调度执行); 2)SVN增量备份(每日备份1次,由windows计划来调度执行)。 2. SVN备份流程 上述2类...

    svn备份还原方法

    ### SVN备份与还原详解 #### 一、SVN简介 Subversion(简称SVN)是一种分布式版本控制系统,广泛应用于软件开发和其他需要版本控制的场景。它允许团队成员在一个中心存储库中保存工作副本,并能够记录每次更改的...

    SVN_BackUp.rar_svn 自动备份_svn备份

    【SVN自动备份与双服务器备份策略】 ...总结,通过SVN的自动备份、双服务器备份和云存储服务的结合使用,我们可以构建一个高效且安全的SVN备份系统,确保在任何突发情况下都能迅速恢复数据,保证团队的正常开发工作。

    Windows下SVN备份脚本

    post-commit.bat和deltaBackup.bat用的svnadmin dump命令,可以增量备份。 请注意,back.bat 、simplebackup.bat、post-commit.bat这三个文件放在文件版本库父目录(一般是X:\Repositories下面),deltaBackup.bat...

    一段进行SVN备份的脚本

    这段描述提到的“一段进行SVN备份的脚本”就是为了解决这一需求,它允许用户通过Windows计划任务自动化执行备份过程,以防止意外数据丢失。 首先,我们需要理解SVN备份的基本原理。SVN仓库通常存储在服务器上,包含...

    windows下svn异地备份与还原

    在Windows环境下,Subversion(简称svn)作为一款广泛使用的版本控制系统,对于团队协作和项目管理起着至关重要的作用。...文件"svn备份与还原.txt"很可能是详细的操作步骤和指南,建议仔细阅读并按照指导进行实践。

    svn备份方案补充

    本篇文章将详细探讨“svn备份方案补充”,主要聚焦于如何在Linux环境下实现svn版本库的自动全量备份。 首先,理解svn的核心概念至关重要。svn是一个分布式版本控制系统,它允许团队成员对同一份代码进行协作编辑,...

    SVNBackUp.rar_SVNBackup _svn_svn 自动备份_svn备份

    在压缩包中的“SVN备份程序”,可能包含以下文件和文件夹: - 安装程序或可执行文件:用于安装和运行`SVNBackup`。 - 配置文件:包含备份计划和参数设置。 - 备份脚本:可能使用bash、批处理或其他脚本语言编写,...

    linux下\svn备份与同步

    总的来说,Linux下的svn备份与同步涉及到仓库的创建、权限配置、同步管理以及数据备份与恢复。理解和掌握这些操作对于维护稳定的版本控制环境至关重要。通过定期备份和同步,可以确保在出现意外情况时能够迅速恢复...

    SVN备份脚本.rar

    本压缩包"SVN备份脚本.rar"包含了实现SVN仓库自动备份的脚本,下面将详细介绍SVN备份脚本的使用、重要性以及如何进行定制。 1. SVN备份脚本的作用: SVN备份脚本的主要目的是定期备份SVN仓库,防止数据丢失。这在...

    windows&linux svn自动化全备份&增量备份脚本

    - **linux下-SVN全量和增量备份脚本.docx**:这份文档可能包含了详细的Linux环境下编写SVN备份脚本的步骤和示例代码。 - **svnBackupBat.rar**:这是一个Windows批处理脚本的压缩包,可能包含全备份和增量备份的bat...

    svnsync.sh svnhotcopy_daily.sh svn 备份

    结合描述,我们可以看出这是一个完整的SVN备份策略:每当源仓库有新的提交或更新时,`svnsync.sh`会将这些变更同步到备份服务器;同时,`svnhotcopy_daily.sh`会在每天的某个固定时间点创建一个热备份,以防万一同步...

    svn备份、还原与迁移操作手册.docx

    SVN 备份、还原与迁移操作手册 SVN(Subversion)是一种版本控制系统,用于管理软件开发过程中的代码变更。备份、还原和迁移是 SVN 中三项非常重要的操作,以下是关于 SVN 备份、还原与迁移的知识点总结: 一、SVN...

    SVN 备份及还原包括逻辑和物理备份

    SVN备份及还原策略应包括逻辑和物理备份,以应对各种可能的风险。通过定期执行备份计划,并结合本地和远程备份,可以最大程度地减少数据丢失的可能性。提供的bat脚本和相关文档可能提供了实现这些策略的具体步骤和...

Global site tag (gtag.js) - Google Analytics