데이터베이스 스키마를 어떻게 버전 화합니까? [닫은]


128

SQL 델타를 어떻게 준비합니까? 각 스키마 변경 SQL을 델타 폴더에 수동으로 저장합니까, 아니면 자동 디핑 프로세스가 있습니까?

소스 코드와 함께 데이터베이스 스키마 버전 관리 규칙에 관심이 있습니다. 아마도 스키마를 다른 사전 커밋 후크입니까?

또한 DbDeploy 외에 델타 확산에 대한 옵션은 무엇 입니까?

편집 : 답변을보고 델타를 사용하여 데이터베이스 마이그레이션을 실행하기위한 표준 체계에 익숙하다는 것을 분명히하고 싶습니다. 내 질문은 델타 자체, 바람직하게는 자동 생성에 관한 것입니다.

또한 버전 변경은 PHP와 MySQL을위한 것입니다. (루비 솔루션이 없습니다).


내가 사용 schemasync 패치 (및 롤백 스크립트)를 생성 할 수 있습니다. 이들은 SVN 저장소에 추가됩니다. 완벽하지는 않지만 잘 작동합니다. 또한 schemasync를 사용하면 스키마 변경 사항을 쉽게 배포 할 수 있습니다.
Jay Sidri

이 링크는 비어 있습니다. 여전히 존재합니까?
jocull

답변:


61

보다

데이터베이스 구조 변경을위한 버전 관리 시스템이 있습니까?

SVN에서 MS SQL 데이터베이스를 어떻게 버전 화합니까?

그리고 Jeff의 기사

버전 관리하에 데이터베이스 가져 오기

나는 당신의 고통을 느끼고 더 나은 대답이 있었으면 좋겠다. 이것은 당신이 찾고있는 것에 더 가깝습니다.

DB 스키마 변경 사항을 추적하는 메커니즘

일반적으로 이에 대한 적절한 해결책이 없다고 생각 하고이 분야에서 내 자신을 굴립니다.


내 질문에서 알 수 있듯이 델타의 개념을 알고 있습니다. 내 질문은 자동으로 작성하는 규칙에 관한 것입니다.
Eran Galperin

난 내 자신을 굴릴 것 같아요 ...;)
Eran Galperin

github.com/DBDiff/DBDiff DBDiff를 사용해 보셨습니까 ? @EranGalperin은 SQL의 스키마 및 데이터에 대한 자동화 된 마이그레이션을 수행하므로 원하는 내용에 적합합니다. 공개 나는 그 뒤에 개발자입니다!
Jasdeep Khalsa


4

여전히 옵션을 찾고 있다면 : neXtep designer를 살펴보십시오. 버전 관리 개념을 기반으로하는 무료 GPL 데이터베이스 개발 환경입니다. 환경에서는 항상 버전이 지정된 엔터티로 작업하며 데이터 모델 개발에 집중할 수 있습니다. 릴리스가 완료되면 버전 제어 시스템에 연결된 SQL 생성 엔진은 2 가지 버전 사이에서 필요한 델타를 생성 할 수 있으며 필요한 경우 일부 전달 메커니즘을 제공합니다.

무엇보다도 개발 중에 데이터베이스를 동기화 및 역 동기화하고 데이터 모델 다이어그램을 작성하며 통합 SQL 클라이언트를 사용하여 데이터베이스를 쿼리 할 수 ​​있습니다.

자세한 정보는 위키를 참조하십시오. http://www.nextep-softwares.com/wiki

현재 Oracle, MySql 및 PostgreSql을 지원하며 Java로 제품이 Windows, Linux 및 Mac에서 실행됩니다.


3

스키마 변경은 항상 추가되어야합니다. 따라서 열과 테이블을 삭제하지 않습니다. 데이터를 압축하고 나중에 롤백 할 수 없기 때문입니다. 이렇게하면 데이터베이스를 사용하는 코드를 데이터 나 기능의 손실없이 롤백 할 수 있습니다.

테이블과 열이 아직없는 경우 테이블과 열을 만들어서 데이터로 채우는 문이 포함 된 마이그레이션 스크립트가 있습니다.

마이그레이션 스크립트는 프로덕션 코드가 업데이트 될 때마다 그리고 새로 설치 한 후에 실행됩니다.

무언가를 삭제하고 싶을 때는 데이터베이스 설치 스크립트와 마이그레이션 스크립트에서 제거하여 이러한 오래된 스키마 요소가 새 설치에서 점차 단계적으로 제거됩니다. 새로운 설치는 설치 전에 이전 버전으로 다운 그레이드 할 수 없다는 단점이 있습니다.

그리고 물론 이러한 스크립트를 통해 DDL을 실행하고 데이터베이스에서 직접 동기화하지 않기 위해 직접 실행하지는 않습니다.


2

델타를 관리하지 않습니다. 마스터 데이터베이스를 변경하고 마스터 데이터베이스를 기반으로 XML 기반 빌드 스크립트를 작성하는 도구가 있습니다.

기존 데이터베이스를 업그레이드 할 때 XML 기반 빌드 스크립트를 사용하여 새 데이터베이스와 베어 테이블을 만드는 프로그램이 있습니다. 그런 다음 INSERT INTO x SELECT FROM y를 사용하여 이전 데이터베이스에서 데이터를 복사 한 다음 모든 인덱스, 제약 조건 및 트리거를 적용합니다.

새 테이블, 새 열, 삭제 된 열은 모두 자동으로 처리되며 복사 루틴을 조정하는 몇 가지 트릭으로 열 이름 바꾸기, 열 유형 변경 및 기타 기본 리팩토링을 처리 할 수 ​​있습니다.

대량의 데이터가있는 데이터베이스에서는이 솔루션을 권장하지 않지만 400GB의 테이블로 1GB가 넘는 데이터베이스를 정기적으로 업데이트합니다.


특히 여러 개발자를 다룰 때 다소 번거 롭습니다. 또한 빌드 프로세스가 까다로워지고 가능한 한 간단하게하고 싶습니다.
Eran Galperin 08:18

제대로 되려면 시간이 걸렸지 만 이제는 업그레이드를 준비하는 데 거의 노력이 필요하지 않으며 업그레이드를 수행하는 데 더 적은 노력이 필요합니다. 또한, 내가 좋아하는 한 가지는 임시 핫픽스 변경을 수행 할 수 있으며 업그레이드 절차에 영향을 미치지 않는다는 것입니다. 각 업그레이드는 새로운 DB입니다.
Darrel Miller

2

어떤 RDBMS를 사용하고 있는지 언급하지는 않았지만 MS SQL Server 인 경우 Red-Gate의 SQL Compare 는 객체 생성 스크립트간에 델타를 만드는 데 없어서는 안될 필수 요소입니다.


1
그것은 MySQL에 대한, 내 질문을 업데이트했습니다
Eran Galperin

2

나는 내 자신의 혼을 숨기지 않았지만 데이터베이스 스키마의 변경 사항을 추적하고 버전이 지정된 업데이트 스크립트를 만드는 내부 웹 응용 프로그램을 개발했습니다.

이 도구는 브라질 이라고 하며 현재 MIT 라이센스에 따라 오픈 소스입니다. 브라질은 루비 / 루비 온 레일 기반이며 Ruby DBI가 지원 하는 모든 데이터베이스 (MySQL, ODBC, Oracle, Postgres, SQLite) 에 대한 변경 배포를 지원합니다.

버전 스크립트에 업데이트 스크립트를 넣는 것에 대한 지원이 계획되어 있습니다.


브라질은 꽤 나아 보입니다. 주로 PHP를 사용하고 있습니다. 시스템 포팅을 고려한 적이 있습니까?
Eran Galperin


1

툴체인을 사용하여 데이터를 이식 가능한 형식으로 내 보낸 다음 새 스키마로 가져옵니다. 델타 SQL이 필요하지 않습니다. 추천.


3
이 휴대용 형식은 무엇입니까? 이전 버전과의 차이점 만 적용하여 새 스키마로 가져 오는 방법은 무엇입니까?
Eran Galperin

1

파이어 버드를 사용합니다 대부분의 개발을위한 데이터베이스를 내가 사용 FlameRobin의 그것을 관리 도구를. 모든 변경 사항을 기록하는 좋은 옵션이 있습니다. 하나의 큰 파일 또는 데이터베이스 변경 당 하나의 파일에 모든 것을 기록 할 수 있습니다. 이 두 번째 옵션을 사용한 다음 각 스크립트를 버전 제어 소프트웨어에 저장합니다. 이전에 Subversion을 사용 했으므로 이제 Git을 사용합니다.

FlameRobin과 Firelog에 대해 동일한 로깅 기능을 가진 일부 MySQL 도구를 찾을 수 있다고 가정합니다.

데이터베이스 테이블 중 하나에 버전 번호를 저장합니다. 구조 를 하므로 모든 데이터베이스를 쉽게 업그레이드 할 수 있습니다. 또한 대상 데이터베이스에서 SQL 스크립트를 하나씩 실행하는 간단한 PHP 스크립트를 작성했습니다 (데이터베이스 경로 및 사용자 이름 / 암호는 명령 줄에 제공됨).

모든 DML (삽입, 업데이트 삭제) 문을 기록하는 옵션도 있으며 각 데이터베이스에 포함 된 일부 '기본'데이터를 수정하는 동안이를 활성화합니다.

이 모든 작업을 자세하게 수행하는 방법에 대한 멋진 백서를 작성했습니다. 여기 에서 데모 PHP 스크립트와 함께 .pdf 형식으로 논문을 다운로드 할 수 있습니다 .


1

또한 개발자가 델타 SQL 스크립트를 중앙 저장소에 제출할 수있는 PHP 스크립트 세트를 개발했습니다.

데이터베이스 테이블 중 하나 (TBSYNCHRONIZE라고 함)에 최신 실행 스크립트의 버전 번호를 저장하므로 웹 인터페이스 또는 Eclipse 용으로 개발 된 클라이언트를 사용하여 데이터베이스를 쉽게 업그레이드 할 수 있습니다.

웹 인터페이스를 통해 여러 프로젝트를 관리 할 수 ​​있습니다. 데이터베이스 "분기"도 지원합니다.

http://www.gpu-grid.net/deltasql 에서 애플리케이션을 테스트 할 수 있습니다 (비밀번호 testdbsync로 관리자로 로그인 한 경우). 응용 프로그램은 오픈 소스이며 여기에서 다운로드 할 수 있습니다 : http://sourceforge.net/projects/deltasql

deltasql은 스위스와 인도에서 생산적으로 사용되며 일본에서 인기가 있습니다.


1

몇 달 전에 MySQL 스키마 버전 관리 도구를 검색했습니다. Doctrine 마이그레이션, RoR 마이그레이션, Java 및 Python으로 작성된 일부 도구와 같은 많은 유용한 도구를 발견했습니다.

그러나 그들 중 누구도 나의 요구 사항을 충족시키지 못했습니다.

내 요구 사항 :

  1. 요구 사항 없음, PHP 및 MySQL 제외
  2. Doctrine의 schema.yml과 같은 스키마 구성 파일이 없습니다.
  3. 다른 응용 프로그램 설치에서 동일한 스키마를 나타내는 것보다 연결에서 현재 스키마를 읽고 새 마이그레이션 스크립트를 작성할 수 있습니다.

마이그레이션 도구를 작성하기 시작했으며 현재 베타 버전이 있습니다.

이 주제에 관심이 있으시면 시도하십시오. 향후 요청 및 버그 보고서를 보내 주시기 바랍니다.

소스 코드 : bitbucket.org/idler/mmp/src 영어 개요 : bitbucket.org/idler/mmp/wiki/ 러시아어 홈 개요 : antonoff.info/development/mysql-migration-with-php-project


새로운 도구도 있습니다 : DBV : stackoverflow.com/a/13837473/6309
VonC


1

이 주제에도 관심이 있습니다.

있습니다 장고 위키에서이 주제에 대한 몇 가지 논의 .

흥미롭게도 CakePHP에는cake schema generate 명령 사용하여 스키마 버전 관리 기능이 내장 되어있는 것처럼 보입니다 .


내가 케이크의 솔루션에 대해 읽은 것에서-그것은 매우 기본적인 의미로 버전을 지정하지만 diffing 기능이 없으므로 나에게 쓸모가 없습니다.
Eran Galperin

1

MySQL의 경우

새 DB에 착륙 할 때 :

먼저 구조를 확인합니다.

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

stackoverflow 사용자 덕분에 구조적 차이점을 찾기 위해이 빠른 스크립트를 작성할 수 있습니다.

src : https://stackoverflow.com/a/8718572/4457531https://stackoverflow.com/a/26328331/4457531

두 번째 단계에서는 데이터를 테이블별로 확인합니다 mysqldiff. 약간 구식이지만 information_schema데이터를 기반으로 한 PHP 루프는 확실히 일을합니다.

버전 관리의 경우 동일한 방식을 사용하지만 diff 결과로 SQL 업데이트 스크립트 (업그레이드 또는 롤백)를 포맷하고 버전 번호 규칙을 사용합니다 (버전 번호 는 IP 주소처럼 보입니다) .

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------

0

데이터베이스 스키마의 엄격한 버전 관리를 사용하고 있습니다 (별도의 테이블에서 추적 됨). 스크립트는 버전 관리에 저장되지만 모두 변경하기 전에 현재 스키마 버전을 확인합니다.

다음은 SQL Server의 전체 구현입니다 (필요한 경우 동일한 솔루션을 MySQL 용으로 개발할 수 있음). SQL Server 데이터베이스 스키마 버전을 유지 관리하는 방법


방금 기사를 읽었습니다. 여전히 이것을 사용하거나 DBUp 또는 ReadyRoll과 같은 상용 솔루션을 채택 했습니까?
David Atkinson

현재 모든 프로젝트는 Entity Framework Code-First를 사용하며 마이그레이션을 사용하여 데이터베이스 버전을 지정합니다. 나는 몇 가지 레거시 프로젝트에서 기사의 솔루션을 가지고 있으며 그것을 대체하지 않았습니다. 다른 프로젝트에서는 Redgate 도구를 사용하여 스키마 및 마이그레이션을 관리했습니다.
Zoran Horvat

Redgate 사용자입니다. Redgate 도구를 EF와 함께 사용하려는 경우 다음이 가능합니다. red-gate.com/blog/database-lifecycle-management/…
David Atkinson

나는 다음 기회에 그것을 시도 할 것입니다. 그것은 우리에게 잘 도움이되었지만 그 동안 팀을 변경했으며 이제는 전진하기 전에 기본 EF 지원을 실험하고 있습니다.
Zoran Horvat

0

오랫동안 조사한 결과, 제게 만족하지 않는 타사 도구 나 Visual Studio 프로젝트 유형이 있거나 이론에 대한 블로그 만 있지만 구현은없는 것으로 나타났습니다. 그래서 나는 거의 1 년 동안 사용되는 작업 시스템을 구현하고 여기에 설명했습니다.

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

관심사에 따라 계속 더 쓸 것입니다.


2
안녕하세요, SO에 오신 것을 환영합니다. 이 답변은 실제로 완전하지는 않지만 기본적으로 링크 만 제공합니다. 링크 전용 답변은 최선의 답변이 아닙니다. 링크가 유효하지 않으면 답변이 쓸모 없게됩니다. 따라서 답변을 링크와 독립적으로 사용할 수 있도록 수정하고 최소한 찾을 수있는 내용의 요약을 추가하십시오. 감사합니다!
Fabio는 Reinstate Monica가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.