subversion의 db 깨지는 현상에 대해서

ssggkim의 이미지

업무 관련 파일들과 개인 파일들을 subversion을 이용하여 관리하고 있습니다.
며칠전 perky님의 blog에서 다음과 같은 내용을 보았는데요.

perky wrote:

http://openlook.org/blog/opensource/0409DangerousSubversion

sub·ver·sion [sbvn/-n]
[명] 전복, 타도; 파괴; 파멸(의 원인); 전복시키는[파괴하는] 것.
아으아. 최근엔 빠른 속도와 파일 이동이 가능하다는 점 때문에 회사에서 subversion을 쓰고 있습니다. 그런데, 이놈이 소문대로 워낙에 잘 깨져서, 5명이 쓰는 중 거의 1명이 하루에 한번씩은 복구해야할 정도로 DB관리가 정말 허술합니다. 그래도, 뭐 recover를 해 주면 영영 데이터를 잃어버리는 것은 아니기에 그래도 고맙게 쓰고 있었는데, 어제는 그야말로 일이 터졌습니다. DB가 깨졌길래 복구하려고 했더니만, 복구 프로세스가 족족 모두 행 돼버리는 것이었습니다. 게다가 프로세스를 죽여도 좀비가 돼버리고 --; 이런.. 이거 프로젝트도 바쁜데 버전 관리 시스템까지 문제냐~ 참.. 우흐..

그래서, 우선은 침착하게 DB를 다른 디렉토리로 복사해서 복구를 해 보니까 행은 안 되고 그런대로 복구는 되는군요. 아무래도 한번 깨진 DB는 계속 깨질 것 같아서. 덤프한 뒤에 다시 로드했습니다. (리비전이 900가까이 돼서, 복구하는데만 20분 -ㅇ-) 흐흐.. 근데 자세히 살펴보니까 마지막 리비전 하나가 날아갔더군요.. 이런! 그동안은 그래도 깨졌다고 마크만 되고 실제로 날아가지는 않았는데 이제는 ㅠ.ㅠ subversion 앞으로 fsfs가 나온다고 하니 기대는 해 보지만.. 이제는 무서워서 더 못 쓰겠네요 흑흑~

요즘 python-dev 메일링에서도 subversion얘기가 굉장히 많습니다. 역시나 다들 엄청나게 깨지는 버클리DB얘기를 하고 있는데, perforce는 다 DB에 넣는데도 탄탄한데 왜 subversion은 이모양 이꼴이냐 뭐 이런쪽 얘기가 역시 주를 이루는 듯 합니다. 어서 subversion이 perforce 반이라도 따라가길 --;

저는 2명이 공동작업을 하고 총 쓰는 인원은 5명이지만 한번도 db가 깨진 적이 없습니다. ( 쓴지는 6개월정도 되었습니다. )
제가 운이 좋은걸까요? :?
다른 분들의 의견은 어떠신지 궁금합니다.

ps. 1.1이 빨리 나왔으면 좋겠군요. :)

pyrasis의 이미지

DB가 깨지는 현상이 있는건 사실입니만 크게 걱정하실 필요 없습니다..

DB가 깨지더라도 svnadmin recover 명령으로 별탈없이 복구 할 수 있습니다.

저는 모든 프로젝트를 Subversion으로 쓰고 있고 저장소는 리눅스에 있는데
한번도 DB가 깨진적이 없습니다.

Subversion 1.1에서는 버클리 DB를 사용하지 않는 fsfs 저장소가 추가된다고 하니 이걸 사용하면 DB관련 문제는 없을 듯 합니다.

chpjy의 이미지

저도 지금까지 1년 정도 사용해 왔지만 한번도 깨진적은 없었습니다.

DB쪽은 문제가 없는 것 같고.. 다른 요인이 있지 않을 까요? 저도 잘은 모르겠습니다.

freezm7의 이미지

저도 오늘 디비 깨졌습니다.
svnadmin recover 로도 복구가 안되더군요.

지금은 tortoise svn 1.1 RC2 를 받아서 fsfs 로 쓰고 있구요.
fsfs에선 문제가 없어야 할 텐데..

지금까지 커밋한 기록은 다 못쓰게 되었네요.

즐겁게 살아 볼까나~*

perky의 이미지

svnadmin recover로도 복구가 안 될 때에는 우선 DB가 저장되는 디렉토리를
한 벌 더 복사하시고 그 복사한 디렉토리에서 recover한 뒤에 dump뜨고
load하면 됩니다. 맨 마지막 리비전 몇개는 손실될 수도 있습니다.

svn에서 DB가 깨지는 현상은 보통 다음 중 하나입니다.

  • 다른 사람이 작업하는 도중에 또 다른 사람이 접근했을 때: 이 경우에는 아마도 svn의 버그로 보여지는데, lock이 완전하지 못해서 거의 여러명이 접근하면 항상 깨집니다. viewcvs를 올려놓고 돌아다니면서 커밋해보면 금방금방 깨지는 것을 알 수 있습니다.
  • svn이 죽어버렸을 때: svn이 여전히 버그가 많은지 리비전이 500이 넘으면 log, blame등의 명령에 옵션을 좀 복잡하게 주면 10번에 1번 정도는 랜덤하게 실행하다가 죽어버립니다. 이때 DB를 닫고 죽지 못하기 ㅤㄸㅒㅤ문에 DB가 깨진 걸로 표시가 됩니다. 이 때에는 공동작업할 때 그룹 퍼미션까지도 날아가기 때문에 상당히 골치가 아픕니다.

그래서 저는 복구 스크립트를 만들어서 깨먹은 사람이 복구할 수 있도록 하고 있습니다.

#!/bin/sh
if [ ! "$1" ]; then
        exit 0;
fi
svnadmin recover $1
if [ "$?" != "0" ]; then
        echo "============================================================"
        echo "The other person seems to have broken the repository."
        BREAKER=`ls -l $1/db | grep -v -- '-rw-rw-r--' | awk '{print $3}'|sort|uniq|xargs echo -n`
        echo "Please tell [$BREAKER] to recover by himself."
        exit 0;
fi
find $1 -type f|xargs -n20 chmod 664
find $1 -type d|xargs -n20 chmod 775
chown -R $USER:devel $1
[/]

You need Python

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.