Git에서 MySQL 데이터베이스를 백업하는 것이 좋은 생각입니까?


57

내 응용 프로그램의 백업 상황을 개선하려고합니다. Django 응용 프로그램과 MySQL 데이터베이스가 있습니다. Git에서 데이터베이스 백업을 제안하는 기사를 읽었습니다.

한편으로는 데이터와 코드의 사본을 동기화하여 유지하기 때문에 마음에 듭니다.

그러나 Git은 데이터가 아닌 코드를 위해 설계되었습니다. 따라서 커밋마다 MySQL 덤프를 비교하는 많은 추가 작업을 수행하므로 실제로는 필요하지 않습니다. 파일을 저장하기 전에 압축해도 git은 여전히 ​​파일을 비교합니까?

(덤프 파일은 압축되지 않은 상태에서 현재 100MB, 압축되지 않은 경우 5.7MB입니다.)

편집 : 코드 및 데이터베이스 스키마 정의는 이미 Git에 있으며 실제로 백업에 관심이있는 데이터입니다.


13
회사에 IT 부서가있는 경우이를 처리해야합니다.
마이클 햄튼

1
응용 프로그램의 데이터 부분입니까, 아니면 응용 프로그램을 통해 생성 된 것입니까?
Winston Ewert

1
힘내 실행할 때 모든 파일 diff를 시도합니다 git gc(또는 기본 것을 git repack, 자식은 구성 기본적으로, 때때로 자동으로 실행됩니다). 또한 항상 수축 시키므로 압축되지 않은 상태로 저장하는 것이 좋습니다.
Jan Hudec

1
어떤 종류의 데이터베이스입니까? 프로덕션 또는 개발 데이터베이스입니까?
el.pescado

6
viget.com/extend/backup-your-database-in-git 는 "고급 개발자"입니다.
wobbily_col

답변:


101

데이터를 잃기 전에이 질문에 대해 sysadmin 관점을 소개하겠습니다.

일이 잘못되면대로 복원하는 것을 가능하게하기 : 우리는 백업을 만들 단 하나의 이유가 변함없이 뜻. 따라서 적절한 백업 시스템에는 git이 합리적으로 처리 할 수있는 것 이상의 요구 사항 이 있습니다.

다음은 git에서 데이터베이스를 백업하려고 할 때 예상 할 수있는 몇 가지 문제입니다.

  • 리포지토리는 모든 "백업"마다 크게 증가합니다. 때문에 자식 매장 전체 오브젝트 후 (압축이기는하지만)하고 (예를 들어, 당신이 실행할 때 나중에 차이점 git gc) , 역사를 유지 영원히 , 당신은 당신이 실제로 필요하지 않은 또는 원하는 저장된 데이터의 매우 큰 금액을해야합니다. 디스크 공간을 절약하기 위해 또는 법적 이유로 백업의 양 또는 보존 기간을 제한해야 할 수도 있지만 , 많은 부수적 손상없이 git repo에서 이전 개정제거하는 것은 어렵 습니다.
  • 복원은 저장소에 저장 한 시점으로 제한되며 데이터가 너무 커서 사소한 시간 이상으로 되돌아가는 것이 느려질 수 있습니다. 이를 위해 설계된 백업 시스템은 저장되는 데이터의 양을 제한하면서 더 세분성을 제공 할 수 있으며보다 빠른 복원을 제공하여 재해 발생시 다운 타임을 줄입니다. 데이터베이스 인식 백업 솔루션 ( )은 지속적인 백업을 제공 하여 단일 트랜잭션이 손실되지 않도록합니다.
  • 커밋도 느리고 데이터베이스가 커질수록 느려질 수 있습니다. git은 기본적 으로 파일 시스템에 매핑 된 키-값 데이터 저장소 이므로 기본 파일 시스템의 성능 특성에 종속됩니다. 이 시간이 결국 백업 간격을 초과 할 수 있으며이 시점에서 더 이상 SLA를 충족시킬 수 없습니다. 또한 적절한 백업 시스템은 데이터가 증가함에 따라 백업 시간이 오래 걸리지 만 구성 할 보존 정책에 따라 자체 크기를 자동으로 관리하기 때문에 그다지 극적이지는 않습니다.

데이터베이스 덤프를 git에 넣으면 데이터베이스 덤프로 할 수있는 흥미로운 일 이 몇 가지 있다는 사실에도 불구하고 전반적으로 백업을 유지하기 위해 권장 할 수는 없습니다. 특히 백업 시스템은 광범위하게 사용 가능하며 (또한 많은 오픈 소스) 데이터를 안전하게 유지하고 가능한 한 빨리 복구 할 수 있도록 훨씬 잘 작동합니다.


Michael이 일관성 문제를 다루었으므로 이것이 가장 좋은 대답입니다. 데이터베이스의 크기와 사용량에 따라 스냅 샷에서 특정 시점에 데이터를 안정적으로 재생할 수 없으므로 제약 조건 문제가 발생할 수 있습니다. 복제는 여러분이보고 싶을 수도 있습니다 -dev.mysql.com/doc/refman/5.0/en/replication.html
Aaron Newton

4
이것은 최고의 답변 일뿐만 아니라 유일한 답변입니다. 일반적으로 귀하는 개발자이므로 백업은 귀하의 비즈니스가 아닙니다. 다른 누군가가 이미 그들을 돌보고 있거나 있어야하고, 참여하기 시작하면 이미 작동하는 시스템을 방해 할 수 있습니다. 이 상자는 이미 백업 중이므로 크기가 계속 증가하는 백업, 자체 백업 및 자체 백업 백업이 제공됩니다. 그건 그냥 견과류입니다. 게다가 : 당신은 개발자입니다 : 어쨌든 왜 생산 상자 근처에 가고 있습니까?
Maximus Minimus

2
@JimmyShelter이 개발 운영 팀은 개발자와 옵스가 함께 긴밀하게 작동하는지하지 의미 생각의 학교는,하지만 데브가 실제로 수행 작전을. 일반적으로 잘 작동하지 않지만 사람들이 시도하는 것을 막지는 않습니다.
Michael Hampton

이것이 정답입니다. 백업 시스템의 요구 사항과 목적을 명확하게 설명하고 git이 어떻게 맞지 않는지를 보여줍니다. 일관성과 성능에 대한 논의를위한 추가 보너스 포인트.
Gabriel Bauman

OP에이 문제를 처리 할 수있는 운영 팀이 없다고 가정하여 답변을 게시했음을 알려 드리겠습니다. 나는 이런 종류의 작업이 실제로 시스템을 운영하는 사람들에게 맡겨져 있고 그 길을 알고 있다는 것에 동의합니다. 그러나 자신이 아닌 모자를 착용 해야하는 상황이 있으며 그 상황에서 자신의 고안된 해결책을 제시하는 것보다 모범 사례를 배우는 것이 좋습니다. 나는 또한 당신의 대답이 매우 유익하다는 것을 알았습니다!
logc

39

내 두 센트 : 나는 그것이 좋은 생각이라고 생각하지 않습니다. GIT는 "시간에 다른 지점에서 파일 집합의 저장 스냅 샷"와 같은 무언가를, 그래서 당신은 할 수 완벽하게 같은 뭔가를 GIT를 사용하지만, 그건 당신이 의미하지 않는다 해야한다 . GIT는 소스 코드를 저장하도록 설계 되었기 때문에 대부분의 기능이 빠져있을뿐 아니라 약간의 편의를 위해 많은 성능을 거래하게됩니다.

이것에 대해 생각하는 주된 이유는 "데이터와 코드의 사본을 동기화하여 유지하기"때문이며, 이는 코드의 버전 2.0과 버전 1.0과 다른 데이터베이스 스키마가 필요하다는 것을 걱정한다는 것을 의미합니다. . 더 간단한 해결책은 데이터베이스 스키마를 CREATEGit 저장소의 소스 코드 와 함께 명령문 이있는 SQL 스크립트 세트로 저장하는 것 입니다. 그런 다음 설치 절차 중 일부는 이전에 설치된 데이터베이스 서버에서 해당 스크립트를 실행하는 것입니다.

이러한 -d 테이블 의 실제 내용CREATE소스 코드 버전과 관련이 없습니다. 다른 팀에서 서로 다른 회사에서 사용하는 서버 A와 서버 B에 소프트웨어 버전 1.0을 설치한다고 가정하십시오. 몇 주 후에는 스키마가 완전히 동일하더라도 테이블의 내용이 매우 다릅니다.

데이터베이스의 내용을 백업하고자하므로 덤프에 속하는 소프트웨어의 현재 버전으로 백업 덤프에 태그를 지정 하는 백업 스크립트를 사용하는 것이 좋습니다 . 스크립트는 소스 코드 버전 문자열에 액세스 할 수 있도록 GIT 저장소에 있어야하지만 덤프 자체는 버전 제어 시스템에 속하지 않습니다.

편집 :

질문에 동기를 부여한 원래 게시물을 읽은 후에 는 더 모호한 아이디어를 발견했습니다. 요점은 mysqldump명령이 DB의 현재 상태를 일련의 SQL INSERT문으로 변환하고 GIT가이를 업데이트하여 테이블 행만 가져올 수 있다는 것입니다.

mysqldump이 때문에 일부는 소리 백업 방법 중 하나 의 MySQL의 설명서에 적혀. GIT 부분은 저자가 데이터베이스 서버 가 MySQL을 포함한 충돌로부터 복구하기 위해 트랜잭션 로그 를 유지한다는 것을 알지 못하는 곳 입니다. 되는 이 로그를 사용 하면 데이터베이스에 대한 증분 백업을 생성해야한다고,하지 GIT를. 이것은 무엇보다도 GIT 리포지토리를 무한대 이상으로 늘리지 않고 복구 후 로그를 회전하거나 플러시 할 수 있다는 이점이 있습니다 ...


2
버전 제어의 데이터없이 데이터베이스 스키마를 저장하는 데 어떤 점이 있는지 잘 모르겠습니다. 데이터가 가장 중요하며 이것이 바로 백업하려는 것입니다. 그러나 현재 소프트웨어 버전으로 데이터베이스 백업에 태그를 지정한다는 아이디어가 마음에 듭니다. 그런 식으로 구현하려고합니다.
wobbily_col

10
데이터없이 스키마를 저장하는 요점은 설치 직후 소프트웨어를 "사용할 수 있어야"한다는 것입니다. 위키 인 경우 위키 페이지를 작성하고 무언가를 작성할 준비가되어 있어야합니다. 스키마 내용 을 설치하면 설치 후 위키에 X 위키 페이지가 이미 채워져 있습니다. "콘텐츠를 작성하기 위해 위키 시스템을 설치"하는 것이 아니라 "어딘가에서 위키를 복사하여 읽는 것"입니다. .
logc

3
실제 상황에 따라 질문을 수정하는 것이 좋습니다. 모든 세부 정보를 게시 할 수 없더라도 각 설치에서 수정되지 않은 것으로 표시하려면 많은 데이터가 필요하다고 명시해야합니다. 단일 설치가 있습니다 ...
logc

2
@wobbily_col 텍스트가 아닌 이진 기반 형식은 소스 제어 컨텍스트에서 값이 제한됩니다. 당신은 할 수 diff를 , 당신이 할 수없는 그것을 분기 / 병합 당신은 확실히 DB를 저장하기 위해 자식을 사용할 수 있지만, 그래서 등을, 대부분의 사람들은 스크립트에 DB 구조뿐만 아니라 필요한 데이터를 선호합니다. 약간 더 많은 작업을 수행하지만 위의 기능 목록을 제공하는 것은 타협입니다. 이것이 귀하의 솔루션에 좋은 아이디어인지 여부를 측정해야합니다. 그렇지 않으면 GIT가 DB를 직접 저장하도록 할 수 있습니다. 작업에 가장 적합한 것은 아닙니다.
Daniel B

3
@ RaduMurzea : 이것이 원칙의 문제라고 생각합니다. 버전 관리 시스템은 바이너리가 아닌 소스 코드를 관리하도록 설계되었습니다. 크기 문제는 아닙니다. 교육 비디오도 체크인하지 않는 것처럼 데이터베이스 덤프를 저장소에 체크인해서는 안됩니다. 그러나 아무도 당신을 그렇게 막을 수 없습니다. :)
logc

7

개인적으로, GIT 버전 제어는 바이너리 또는 MySQL 백업 덤프 파일과 같은 덤프 파일이 아닌 데이터 파일을 위해 설계 되었기 때문에 소스 제어 버전 시스템을 사용하여 백업 파일을 저장하는 것은 좋은 생각이 아닙니다. 그렇게 할 있다고해서 자동으로 해야 한다는 의미는 아닙니다 . 또한, 새로운 커밋마다 새로운 데이터베이스 백업을 고려한 리포지토리는 많은 하드 디스크 공간을 사용하여 크게 증가하고 GIT 성능에 영향을 미쳐 소스 제어 시스템이 느려집니다. 나에게 백업 전략을 실행하고 코드의 무언가가 잘못되었을 때 데이터베이스를 복원해야 할 때 항상 백업 파일을 준비하는 것이 좋습니다.하지만 소스 제어 도구는 바이너리 데이터를 저장하지 않습니다.

이러한 이유로 1 일과 2 일의 백업 파일을 저장 한 다음 두 백업 파일의 차이점을 확인할 수있는 유틸리티가 없습니다. 많은 여분의 쓸모없는 작업이 필요합니다. 새 코드를 커밋 할 때 GIT를 사용하여 데이터베이스 백업을 저장하는 대신 데이터베이스 백업을 다른 경로에 날짜 및 시간으로 구분하여 저장하고 태그를 사용하여 각 버전에 대해 생성 된 새 데이터베이스 백업에 대한 참조를 코드에 삽입하십시오. 누군가 이미 제안했듯이.

데이터베이스 백업 및 GIT에 대한 마지막 참고 사항: 데이터베이스 관리자는 일부 데이터가 손실되어 데이터베이스를 복원해야 할 때 1 일 백업 파일과 2 일 백업 파일의 차이점을 확인할 필요가 없습니다. 오류 및 데이터 손실없이 데이터베이스를 복원하여 가동 중지 시간을 줄일 수있는 마지막 백업 파일. 실제로 데이터베이스 관리자의 임무는 시스템이 어떤 이유로 장애가 발생할 경우 가능한 빨리 데이터를 복구 할 수 있도록하는 것입니다. 커밋에 연결된 GIT에 데이터베이스 백업을 저장하면 백업이 GIT 리포지토리에 저장된 특정 시점으로 제한되어 다운 타임을 줄이기 때문에 데이터베이스 관리자가 데이터를 빠르게 복원 할 수 없습니다. 시스템의

그럼, 대신 좋은 백업 소프트웨어 솔루션을 사용, GIT를 사용하여 백업을 저장하지 않는 것이 좋습니다 (거기에 그들 중 일부는 여기에 더 세분화를 제공하고 안전하고, 당신을 데이터를 보존 할 수 있도록하는) 재난 발생시 간단하고 빠른 데이터 복구.


아마도 downvoter가 왜 downvoted했는지 설명 할 것입니다.
Alberto Solano

1
downvoter는 아니지만이 접근법은 현재의 병합 충돌을 유발한다고 생각합니다.이 충돌은 대부분의 git 사용자가 선호하는 분기, 종종 병합 워크 플로우에 특히 도움이되지 않습니다.
Daniel B

@DanielB 저는 데이터베이스 백업 파일을 저장하기 위해 버전 관리 시스템을 사용하지 말 것을 제안합니다. 버전 관리 시스템을 사용하지 않고도 데이터베이스 백업 문제를 쉽게 해결할 수 있다고 생각합니다. 버전 제어 시스템 (GIT, TFS, SVN 등)은 파일이나 데이터베이스 백업을 덤프하지 않고 데이터를 저장하기위한 소프트웨어 용으로 설계되었습니다 (그에 대한 솔루션은 많이 있습니다).
Alberto Solano

나는 대부분의 사용자가 처음 몇 문장을 읽고 공감한다고 생각합니다.

1
@AlbertoSolano 나는 본다; 그러나 질문 ( "GIT에서 DB를 백업 할 수 있습니까?")을 읽은 다음 첫 번째 진술 ( "백업 파일을 저장하는 것이 좋습니다 ...")을 읽으면 반대의 말을하는 것처럼 보입니다 . 대답의 나머지 부분은 여기도 거기도 없다고 말하는 것 같습니다. 대부분의 사람들은 기차 사고가 일어나기를 기다리고 있다고 생각합니다.
Daniel B

1

바이너리 데이터베이스, 특히 데이터베이스에 바이너리 데이터를 저장해서는 안됩니다.
코드 변경과 데이터베이스 DML 변경은 완전히 다릅니다.

MySQL과 Oracle은 특정 시점으로 복원 할 목적으로 아카이브 로그를 작성할 수 있습니다. 해당 로그를 안전한 곳에 백업하면 괜찮을 것입니다.

Git을 사용하여 이러한 "아카이브 로그"를 백업하는 것은 의미가 없습니다. 프로덕션 환경의 아카이브 로그는 다소 무거 우므로 정기적으로 전체 백업을 수행 한 후에 제거해야합니다. 또한 자식을 git에 넣는 것은 쓸모가 없습니다-그것들은 이미 어떤 의미에서 저장소입니다.


1
왜 MySQL이 만든 "아카이브 로그"를 백업하기 위해 Git을 사용하지 않습니까?
gnat

1
이해가되지 않기 때문입니다. 프로덕션 환경의 아카이브 로그는 다소 무거 우므로 정기적으로 전체 백업을 수행 한 후에 제거해야합니다. 또한 자식을 git에 넣는 것은 쓸모가 없습니다-그것들은 이미 어떤 의미에서 저장소입니다. Michael Hampton은이 문제 (이 페이지)에 대해 꽤 좋은 대답을합니다.
Jehy

1
git에 모든 사본을 보관하려는 경우 회전 로그를 왜 귀찮게합니까? 몬스터 로그 파일 하나만 보관해도됩니다.
wobbily_col
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.