DB 스키마 변경을 추적 및/또는 자동화하는 가장 좋은 방법은 무엇입니까?저희 팀은 버전 관리에 Subversion을 사용하고 있으며, 이러한 방법으로 일부 작업을 자동화할 수 있었습니다(빌드를 스테이징 서버에 푸시하고 테스트한 코드를 프로덕션 서버에 배포). 그러나 데이터베이스 업데이트는 아직 수동으로 진행 중입니다.Subversion을 백엔드로 계속 사용하면서 다양한 환경을 가진 서버 간에 효율적으로 작업할 수 있는 솔루션을 찾거나 만들고 싶습니다.
널리 사용되는 소프트웨어 패키지에는 DB 버전을 감지하고 필요한 변경 사항을 적용하는 자동 업데이트 스크립트가 포함되어 있습니다.대규모(여러 프로젝트 및 경우에 따라서는 여러 환경 및 언어)에서도 이 방법을 사용하는 것이 가장 좋은 방법입니까?그렇다면 프로세스를 간소화하는 기존 코드가 있습니까?아니면 자체 솔루션을 도입하는 것이 최선입니까?이전에 이와 유사한 것을 구현하여 Subversion의 커밋 후 후크에 통합한 적이 있습니까?아니면 잘못된 생각일까요?
여러 플랫폼을 지원하는 솔루션이 바람직하지만 대부분의 작업이 Linux/Apache/MySQL/PHP 스택을 지원해야 합니다.
질문에 대한 답변
Rails 세계에는 SQL의 데이터베이스 고유의 풍미가 아닌 Ruby로 데이터베이스를 변경하는 스크립트가 있습니다.Ruby 이행 코드는 현재 데이터베이스 고유의 DDL로 변환됩니다.이것에 의해, 데이타베이스 플랫폼의 전환이 매우 용이하게 됩니다.
데이터베이스를 변경할 때마다 새 마이그레이션을 작성합니다.이행에는 일반적으로 변경이 적용되는 “업” 방식과 변경이 취소되는 “다운” 방식이 있습니다.하나의 명령어로 데이터베이스를 최신 상태로 만들 수 있으며 데이터베이스를 스키마의 특정 버전으로 만들 때도 사용할 수 있습니다.Rails에서 마이그레이션은 프로젝트 디렉토리의 자체 디렉토리에 보관되며 다른 프로젝트 코드와 마찬가지로 버전 관리로 체크인됩니다.
이 Oracle Rails 마이그레이션 가이드에서는 마이그레이션에 대해 자세히 설명합니다.
다른 언어를 사용하는 개발자들은 마이그레이션을 검토하고 고유한 언어별 버전을 구현했습니다.Rucking은 Rails의 이행을 본뜬 PHP 이행 시스템입니다.그게 당신이 찾고 있는 것일지도 모릅니다.
우리는 bcword와 비슷한 것을 사용하여 5개의 다른 설치(실가동, 스테이징 및 몇 가지 개발 설치)에서 데이터베이스 스키마를 동기화하고 버전 관리에서 백업합니다.그것은 매우 잘 작동합니다.조금 더 자세히 설명하겠습니다.
데이터베이스 구조를 동기화하기 위해 업데이트라는 단일 스크립트가 있습니다.php 및 1.sql, 2.sql, 3.sql 등의 파일 번호가 매겨져 있습니다.스크립트는 데이터베이스의 현재 버전 번호를 저장하기 위해 추가 테이블을 1개 사용합니다.N.sql 파일은 데이터베이스의 버전(N-1)에서 버전 N으로 변경되도록 수동으로 제작됩니다.
테이블 추가, 열 추가, 이전 열 형식에서 새 열 형식으로 데이터 마이그레이션 및 열 삭제, 사용자 유형 등의 “마스터” 데이터 행 삽입 등에 사용할 수 있습니다.기본적으로는 모든 작업을 수행할 수 있으며 적절한 데이터 마이그레이션 스크립트를 사용하면 데이터가 손실되는 일이 없습니다.
업데이트 스크립트는 다음과 같이 동작합니다.
- 데이터베이스에 연결합니다.
- 현재 데이터베이스의 백업을 만듭니다(문제가 발생하기 때문에).[ mysqldump ]
- 존재하지 않는 경우 부기 테이블(_meta)을 만듭니다.
- _meta 테이블에서 현재 버전을 읽습니다.찾을 수 없는 경우 0으로 가정합니다.
- VERSION보다 번호가 높은 모든 .sql 파일에 대해 순서대로 실행합니다.
- 파일 중 하나에서 오류가 발생한 경우: 백업으로 롤백합니다.
- 그렇지 않으면 부기 테이블의 버전을 실행된 가장 높은 .sql 파일로 업데이트합니다.
모든 것이 소스 제어에 들어가며, 모든 설치에는 단일 스크립트 실행(콜링 업데이트)으로 최신 버전으로 업데이트되는 스크립트가 있습니다.적절한 데이터베이스 패스워드 등)를 사용합니다.SVN은 데이터베이스 업데이트스크립트를 자동으로 호출하는 스크립트를 사용하여 스테이징 및 실가동 환경을 업데이트하므로 코드 업데이트는 필요한 데이터베이스 업데이트와 함께 제공됩니다.
또한 동일한 스크립트를 사용하여 데이터베이스 전체를 처음부터 다시 작성할 수도 있습니다.데이터베이스를 드롭하고 다시 작성한 후 데이터베이스를 완전히 다시 채우는 스크립트를 실행합니다.또한 스크립트를 사용하여 빈 데이터베이스를 자동 테스트용으로 채울 수도 있습니다.
이 시스템을 셋업하는 데 몇 시간밖에 걸리지 않았습니다.개념적으로 심플하고 모든 사람이 버전 넘버링 방식을 사용할 수 있습니다.또, 모든 데이타베이스의 변경을 통신하거나 수동으로 실행할 필요 없이, 데이타베이스의 설계를 진행하거나 진화하는 기능도 매우 중요합니다.
단, phpMyAdmin에서 쿼리를 붙여넣을 때는 주의하십시오.생성된 쿼리에는 일반적으로 데이터베이스 이름이 포함됩니다. 데이터베이스 이름은 스크립트가 깨지기 때문에 절대 원하지 않습니다.CREATE TABLE 같은 것mydb
.newtable
시스템상의 데이터베이스가 mydb라고 불리지 않으면 (…)는 실패합니다.코멘트 전 SVN 훅을 작성했습니다.이 훅에서는.sql 파일을 사용할 수 없습니다.mydb
string. 이것은 누군가가 적절한 체크 없이 phpMyAdmin에서 복사/붙여넣은 확실한 신호입니다.
저희 팀은 모든 데이터베이스 변경을 스크립트 아웃하고 해당 스크립트를 애플리케이션의 각 릴리스와 함께 SVN에 커밋합니다.이렇게 하면 데이터가 손실되지 않고 데이터베이스를 점진적으로 변경할 수 있습니다.
하나의 릴리스에서 다음 릴리스로 이동하려면 일련의 변경 스크립트를 실행하면 됩니다.데이터베이스는 최신 상태이며 모든 데이터가 유지됩니다.가장 쉬운 방법은 아닐지 몰라도 확실히 효과적입니다.
여기서의 문제는 개발자가 자신의 로컬 변경 내용을 소스 제어로 스크립팅하여 팀과 공유하기 쉽게 만드는 것입니다.저는 수년간 이 문제에 직면해 왔으며, Visual Studio for Database 전문가의 기능에 영감을 받았습니다.같은 기능을 갖춘 오픈 소스 툴을 원하신다면, http://dbsourcetools.codeplex.com/ Have fun, – Nathan을 이용해 보세요.
아직 해결책을 찾고 있다면: neXtep designer라는 툴을 제안하고 있습니다.전체 데이터베이스를 버전 관리 하에 둘 수 있는 데이터베이스 개발 환경입니다.모든 변경을 추적할 수 있는 버전 제어 저장소에서 작업할 수 있습니다.
업데이트를 릴리스해야 할 경우 구성 요소를 커밋하면 제품이 이전 버전에서 SQL 업그레이드 스크립트를 자동으로 생성합니다.물론 이 SQL은 두 가지 버전에서 생성할 수 있습니다.
다음으로 여러 가지 옵션을 사용할 수 있습니다.이러한 스크립트는 기존 메커니즘에 의해 도입되도록 앱 코드와 함께 SVN에 넣을 수 있습니다.또 하나의 옵션은 neXtep의 전달 메커니즘을 사용하는 것입니다.스크립트는 “전달 패키지”(SQL 스크립트 + XML 기술자)라고 불리는 것으로 내보내집니다.설치자는 이 패키지를 이해하여 대상 서버에 도입하면서 구조의 일관성, 의존성 검사, 설치된 버전 등록 등을 보장할 수 있습니다.
이 제품은 GPL이며 이클립스를 기반으로 하므로 Linux, Mac 및 Windows에서 실행됩니다.Oracle, MySQL 및 Postgre도 지원합니다.현재 SQL(DB2 지원이 진행 중입니다).자세한 것은, Wiki 를 참조해 주세요.