개발, 테스트, 프로덕션에서 데이터베이스를 어떻게 관리하시나요?

개발, 테스트 및 프로덕션 서버 간에 데이터베이스 스키마와 데이터를 관리하는 방법에 대한 좋은 예를 찾는 데 어려움을 겪었습니다.

우리의 설정은 다음과 같습니다. 각 개발자는 앱과 MySQL 데이터베이스를 실행하는 가상 머신을 가지고 있습니다. 이 가상 머신은 개발자가 원하는 모든 것을 할 수 있는 개인 샌드박스입니다. 현재 개발자는 SQL 스키마를 변경하고 데이터베이스를 텍스트 파일로 덤프하여 SVN에 커밋합니다.

우리는 항상 최신 커밋된 코드를 실행하는 지속적 통합 개발 서버를 배포하려고 합니다. 지금 이렇게 하면 각 빌드에 대해 SVN에서 데이터베이스를 다시 로드합니다.

'릴리스 후보'를 실행하는 테스트(가상) 서버가 있습니다. 테스트 서버에 배포하는 작업은 현재 매우 수동적인 프로세스이며, 일반적으로 SVN에서 최신 SQL을 로드하고 조정하는 작업이 포함됩니다. 또한 테스트 서버의 데이터가 일관되지 않습니다. 마지막으로 커밋한 개발자가 샌드박스 서버에 가지고 있던 테스트 데이터를 그대로 사용하게 됩니다.

모든 것이 무너지는 곳은 프로덕션에 배포할 때입니다. 라이브 데이터를 테스트 데이터로 덮어쓸 수 없으므로 모든 스키마 변경 사항을 수동으로 다시 생성해야 합니다. 데이터를 조작하기 위한 스키마 변경 또는 변환 스크립트가 많은 경우 이 작업은 매우 번거로울 수 있습니다.

스키마만 문제였다면 더 쉬운 문제일 수 있지만, 데이터베이스에는 보안 및 권한 테이블의 메타 데이터와 같이 개발 중에 업데이트되는 '기본' 데이터도 있습니다.

이것이 지속적인 통합과 원스텝 빌드로 나아가는 데 있어 가장 큰 장벽입니다. 어떻게 는 이 문제를 해결하나요?


후속 질문: 특정 데이터베이스 인스턴스를 업그레이드하기 위해 어떤 스크립트를 실행해야 하는지 알 수 있도록 데이터베이스 버전을 어떻게 추적하나요? Lance가 언급한 것과 같은 버전 테이블이 표준 절차에 포함되나요?

타란티노를 언급해 주셔서 감사합니다. 저는 .NET 환경을 사용하고 있지는 않지만 그들의 DataBaseChangeMangement 위키 페이지가 매우 유용하다는 것을 알았습니다. 특히 이 파워포인트 프레젠테이션(.ppt)이 도움이 되었습니다.

주어진 디렉토리에 있는 *.sql 스크립트의 이름을 데이터베이스의 테이블과 비교하여 확인하고 파일 이름의 첫 부분을 구성하는 정수를 기준으로 없는 스크립트를 순서대로 실행하는 Python 스크립트를 작성하려고 합니다. 제가 생각하기에 매우 간단한 해결책이라면 여기에 게시하겠습니다.


이를 위해 작동하는 스크립트가 있습니다. DB가 존재하지 않는 경우 초기화하고 필요에 따라 업그레이드 스크립트를 실행합니다. 기존 데이터베이스를 지우고 파일에서 테스트 데이터를 가져오는 스위치도 있습니다. 약 200줄 정도 되므로 여기에는 올리지 않겠습니다(관심이 있으시면 붙여넣기에 올릴 수도 있지만).

질문에 대한 의견 (2)
해결책

몇 가지 좋은 옵션이 있습니다. 저는 전략을 사용하지 않습니다.

  1. 모든 스키마 변경 사항을 스크립트로 작성하고 CI 서버가 데이터베이스에서 해당 스크립트를 실행하도록 합니다. 현재 데이터베이스 버전을 추적할 수 있는 버전 테이블을 만들고 최신 버전에 대한 스크립트만 실행합니다.

  2. 마이그레이션 솔루션을 사용합니다. 이러한 솔루션은 언어에 따라 다르지만 .NET의 경우 Migrator.NET을 사용합니다. 이를 통해 데이터베이스 버전을 관리하고 버전 간에 위아래로 이동할 수 있습니다. 스키마는 C# 코드로 지정합니다.

해설 (0)

개발자는 단순히 전체 데이터베이스를 소스 제어에 덤프하는 것이 아니라 작업하는 각 버그/기능에 대해 변경 스크립트(스키마 및 데이터 변경)를 작성해야 합니다. 이러한 스크립트는 현재 프로덕션 데이터베이스를 개발 중인 새 버전으로 업그레이드합니다.

빌드 프로세스는 프로덕션 데이터베이스의 복사본을 적절한 환경으로 복원하고 소스 제어의 모든 스크립트를 실행하여 데이터베이스를 현재 버전으로 업데이트할 수 있습니다. 모든 스크립트가 올바르게 실행되는지 확인하기 위해 매일 이 작업을 수행합니다.

해설 (0)

루비 온 레일즈 높여줍니까 투명지에 살펴보면서 이.

데이터베이스 스키마 파일을 변환할 수 있는 첫 번째 좁히어 너무 호출됨 마이그레이션과 기본적으로 버전 및 데이터가 버전 N N + 1 (또는 다운그레이드하기 버전에서 N + 1) 의 경우, N). 현재 버전 데이터베이스에서 테이블 알려줍니다.

전 항상 청소하십시오 유닛 테스트 파일에서 데이터 조작 및 테스트 데이터베이스뿐 고정식입니다 채워집니다.

해설 (0)

이 책은 [리팩토링 데이터베이스뿐: 진화 데이터베이스 설계] [1] 어떤 생각을 제공하십시오 방법에 대한 데이터베이스를 관리할 수 있습니다. 또한 짧은 버전이 판독값 http://support. http://martinfowler.com/articles/evodb.html

39 한 PHP+MySQL 프로젝트 I&, ve 경식도 데이터베이스에 저장된 데이터베이스 버전 번호를 접속되므로, 그렇지 않을 경우, 먼저 체크 프로그램을 데이터베이스입니까 완화했다. 만약 프로그램이 다른 버전 업그레이드를 위한 데이터베이스 单捞磐啊 페이지를 열 예정이다. Php 코드, 마이그레이션하여 지정되어 있으며, 각 업그레이드합니다 데이터베이스 스키마를 기존의 모든 데이터가 변경될 예정입니다.

[1]: http://www.amazon.com/refactoring-databases-evolutionary-addison-wesley-signature/dp/ 0321293533

해설 (0)
  • -;;;; &Gt db&gt &lt dev&lt 다음과 같이 데이터베이스뿐만 이름을 ' ,, db&gt tst&lt &lt >; ,, db&gt stg&lt &lt >; ,, db&gt prd&lt &lt >; ' (물론 db 이름을 절대 하르고데 합니다.
  • 당신이 약간만이라도 구축할 수 있어야 할 수 있어 다른 유형의 db& # 39 의 동일한 물리적 서버 (추천합니까 게 내가 할 수 있습니다. 만약 리소스는 긴밀한)
  • 당신이 약간만이라도 그 사이에 데이터를 자동으로 이동할 수 있어야 합니다.
  • Db 생성 스크립트를 분리하십시오 &solarisdvd 부품설치 = 한다는 것이 항상 가능한 it 및 채우기 위해 처음부터 재생성합니다 db (데이터베이스 (db) 를 이전 버전 또는 외부 데이터 소스
  • 사용 금지 하르고데 코드에서 연결 문자열을 (심지어 않는 구성 파일) 의 구성 파일을 사용하여 연결 문자열을 템플릿일 - 동적으로 재구성할 필요가 있으며, 각 채우는 작업을 할 수 있는 application_layer 높여줍니까 재컴파일해야 잘못되었습니다.
  • do 버전 관리, 데이터베이스 (db) 를 사용하여 데이터베이스 제품, 그렇지 않으면 뭔가 여유가 있다면 개발 버전 관리 - 객체에는 준비됐어들 사용하여 자체적으로
  • save it 를 각 DDL 추적되도록 변경 및 일부 기록 테이블 (예 여기서요)
  • 매일 backups! 당신이 약간만이라도 테스트 얼마나 빨리 뭔가 손실됩니다 백업에서 (사용 오토마시 리스토어할 스크립트에만 리스토어할 수
  • 심지어 너의 DEV 데이터베이스와 같은 문제를 정확하게 할 수 있는 데이터를 생성 스크립트입니다 PROD 개발자가 함께 게임을 만들 수 있기 때문에 정확한 복제본입니다 prod 및 it (그러니까말이야 내아기마저도 구매시스템통합에 적자 엔드입니다 하나, 그러나 변화가 마인드 및 비즈니스 프로세스를 통해 비용 너회가 훨씬 덜 때 이런 안타 이 fan-in 법적으로 보장할 수 있는 모든 것을 할 수 있지만, 이 때문에 억지로 코더 한 수 아래 첨자
해설 (2)

이것이 충족되지 않은 - 우리 함께 이 문제에 대한 해결 방안을 지속적으로 생각하신거야 I& # 39 m, 즉. 몇 년 동안 각 릴리스에는 별도의 변경 스크립트입니다 관리했습니다. 이 스크립트입니다 델타 를 지난 운영본 릴리스에는 포함될 예정이라고 말했다. 각 응용 프로그램을 통해 릴리즈입니다 버전 번호를 부여하여 증분우선순위수준우선 아니하였으매 뭔가 다음과 같습니다.

  • dbChanges_1.sql
  • dbChanges_2.sql -.
  • dbChanges_n.sql

이 두 줄의 개발 및 유지 협력했습니다 충분한 보살피되 시작했습니다. 새로운 개발 및 유지 보수 분기로의 trunk/mainline 위한 단기 향상, 버그 수정, etc. 어쩔 수 없이, 할 수 있는 분기로의 스키마에는 수정하시기 휘말릴 수 있기 때문이다. 이 시점에서 우리가 가진 것 때문에, 우리는 이미 dbChanges_n + 1.sql 트렁크에 됐지 구성표가 다음과 같습니다.

  • dbChanges_n.1.sql
  • dbChanges_n.2.sql -.
  • dbChanges_n.3.sql

역시 이 때까지 우리는 어느 날, 우리는 충분히 잘 협력했습니다 조회 및 주류 및 10 에 있는 것을 42tb 델타 스크립트에만 지사급. 아 아!

한 정보기술 (it), 즉, 여기서 우리는 단순히 요즘 유지관리하지 델타 스크립트입니다 svn 버전 때마다 우리는 스크립트입니다 덮어씁니다 릴리스부터. 하나님이 멀리 분기로서의 스키마에는 변화를 만드는 것이 특징이다.

따라서 I& # 39 m 만족하지 않고, 이 중 하나. I really like 总监和首席信息官完全了解 마이그레이션과 충스러웠으니 않는다. # 39, ve 매우 클 i& 이야기를 통해 리키바제. 이 제품은 总监和首席信息官完全了解 변동분 데이터베이스 리팩토링. # 39 의 it& 모양과 I& # 39 만 보고, 이를 상세히 알게 될 겁니다. 그 경험이 있어? # 39; d i& 대해서 듣고 결과는 매우 궁금하다.

해설 (0)

SQL 비교하십시오 같은 도구를 사용하여 바라볼 수도 있습니다 수 있도록 다양한 버전의 차이점은 스크립트입니다 빨리 버전 간 마이그레이션합니다 데이터베이스

해설 (0)

39 m, m 두렵도 i& I& # 39, 합의에 따라 다른 점입가경이다. 개발자는 해당 사항을 스크립트입니다 합니다.

대부분의 경우 단순 변경하십시오 won& # 39 표, 할 일이 너무 단순하게 작동하는 데 필요한 기존 데이터 수정, 개발자 및 smartupdate 필요합니다 의심하였더라 마이그레이션과 they& # 39, re 스크립팅된 제대로 (물론 이 필요한 일부 지점에서 테스트하려면 조심스럽게 릴리스에는 주기).

또, you& 감지에서 있으시면 # 39, ll 전달하십시오 개발자가 아니라 되돌릴 수 있도록 해당 사항을 롤백 스크립트입니다 위해 필요하다면. 이 뿐만 아니라 해야 할 수 있도록 그들의 롤백에서 테스트되었습니다 실행하므로 닫히지만 오류 없이 DB 같은 상태로 롬폭 이전에 (이 것이 항상 가능한 것은 바람직한 좋은 인프라일까요 규칙 또는 있지만, 대부분의 시간을).

39, 서버, 내가 모르는 don& CI 에 있는 후크 방법. 아마도 당신의 CI 서버를 구축할 수 있어야 합니다, 매일 밤 에 스냅사진의 알려진 후 모든 변경 이후 qic 워크플로가 돌아갑니다. 아마 그렇지 않으면 that& # 39 에 있는 것이 아니라 # 39 의 빌드 스크립트는 줄바꿈할 마이그레이션과 분할합니다 night& 있지만, 그 이후의 모든 수준들과.

해설 (0)

우리는 매우 유사한 설치 OP.

39 의 s 를 개발, 개인 개발자들은 VM& DB& # 39 의.

[개발자 곧 커밋하면 salesforce. 보면안돼 분기로서의]

테스트는 서로 다른 시스템의 실행하십시오 (실제로는, s # 39 에서 VM& 호스팅된 서버에서) [곧 허드슨 CI 서버를 운영하는]

테스트 db 에 의해 덤프합니다 로드중 참조. 개발자 스키마에는 패치 적용 개발자가 데이터 패치를 적용하고

실행하십시오 장치 및 시스템 테스트를 진행중이다.

고객에게 설치 프로그램 운영 구축됨 있다.

우리가하는:

우리는 우리의 스키마 덤프하지 시행하십시오 스캔박스 DB. 그리고 sql 데이터 덤프하지. 우리는 그 이전의 다른 것을 요구한다. n-1 의 n 으로 업그레이드할 수 있는 변경분 복제 페어당 있다.

우리는 덤프합니다 구성 및 변경분 복제.

그래서 우리는 빈 db 를 설치하려면 ᄂ씨 청소하십시오 덤프합니다 실행하십시오 버전. 그 사이에 패치가 적용하십시오 패치.

(유하 언급한 Rail& # 39 의 아이디어를 가진 표 재기록할 현재 DB 버전 업데이트 설치 해야 하나, 더 좋은 인프라일까요 엉뚱한.)

전에 할 수 있도록 검토됨 변경분 복제 및 덤프합니다 베타 테스트. 내가 어떤 식으로 I& # 39 로, 이를 중심으로 can& # 39, t 지켜보리니 ve seen 개발자 테스트 DB 에 계정이 삽입하십시오 점이다.

해설 (0)

다비드 프로이, 자바, 닷넷 (.net) 툴과도 체크아웃합니다 있을 수 있는 파일 버전 테이블 및 쓰기 위한 표준을 따르는 sql 레이아웃과 스키마에는 너회의 파이썬 버전.

해설 (0)

.NET 환경을 사용하는 경우 해결책은 타란티노입니다. 이 솔루션은 NANT 빌드에서 이 모든 것(설치할 SQL 스크립트 포함)을 처리합니다.

해설 (1)

Mysql diff 를 사용하고 있습니다. 이 두 가지 데이터베이스 (DB) 에서 라이브 또는 스크립트에만) 를 출력입니다 차이가 스키마에는 변경하십시오 스크립트입니다. mysql diff 실행되는 응용 프로그램 시작, emc. 아웃하기로 스키마에는 변경일 보고합니다 개발자. 그래서 개발자가 직접 쓰기, 반자동 스키마 업데이트 일이 더 필요가 없습니다.

해설 (0)

39, ve 기록되었으므로 i& 도구 (있는) 에 의해 후킹 오픈 다비트리프) 는 데이터베이스 스키마, 제안하세요 마이그레이션과 스크립트에만 것이라고 볼 수 있습니다. 던질 수 있는 경우 또는 변경입니다 deletes 수정되므로 데이터 오류가 아니라, 이를 위한 제안 제공하십시오 스크립트입니다 (예를 들면 때 열이 누각되었습니다 새로운 스키마에는 it 확인할 경우 그동안 renamed 만들고 있는 열 xx - 스크리프트리스크레비슈그주션 생성할지 변경하십시오 기술서임을).

39 만 m (http://code.google.com/p/migrationscriptgenerator/), SQL Server I& 두렵도: (It& # 39, s 도 꽤 알파, 그러나 그것은 매우 낮은 마찰 (특히 it 와 결합할 경우 타란티노 또는 http://code.google.com/p/simplescriptrunner/)

The way I in your SQL 스크립트를 사용할 수 있는 것은 이슬너스 프로젝트 또한 투명지에 db_next 로칼에서 변경할 수 있는 데이터베이스 (사용 Management Studio 또는 [네이베르나트 스키마에는 익스포트를] [2] 또는 린제투스크라 크리스트라타바제 또는 뭔가). 그럼 미그라티온스크리프트제너레이터 실행하십시오 _next _dev 및 db 를 만드는. sql 업데이트하십시오 마이그레이션하기 위한 스크립트에만 추정했다.

[2]: +first+project http://wiki.fluentnhibernate.org/show/GettingStarted

해설 (0)

For oracle database oracle ddl2svn 우리가 사용하는 도구.

이 도구는 오토메이티드 다澜 프로세스

각 db 구성표가 프레젠테이션이든 구성표가 ddl 1. 2. 동일팔레트에 it 업계의 버전 콘도르

수동으로 인스턴스들도 해결되었으므로 사이의 변경

해설 (0)