DB 스키마 변경을 추적하는 메커니즘
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"을 포함하는 .하지 않는 코멘트 SVN 후크를 .이sql 。 sql 。mydb
string: checkingstring 입니다. 이것은 누군가가 적절한 체크 없이 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 를 참조해 주세요.
Scott Ambler는 데이터베이스 리팩터링에 관한 일련의 기사를 작성(및 공동 집필)하고 있습니다.이는 스키마를 유지하기 위해 기본적으로 TDD의 원칙과 관행을 적용해야 한다는 생각입니다.데이터베이스에 대한 일련의 구조 및 시드 데이터 단위 테스트를 설정합니다.그런 다음 변경하기 전에 변경 내용을 반영하도록 테스트를 수정/쓰기합니다.
우리는 이것을 꽤 오랫동안 해왔고 효과가 있는 것 같다.유닛 테스트 스위트에서 기본 열 이름과 데이터 유형 검사를 생성하는 코드를 작성했습니다.언제든지 이러한 테스트를 재실행하여 SVN 체크 아웃의 데이터베이스가 애플리케이션이 실제로 실행하고 있는 라이브 db와 일치하는지 확인할 수 있습니다.
개발자들은 때때로 그들의 샌드박스 데이터베이스를 수정하고 SVN에서 스키마 파일을 업데이트하지 않는 것으로 나타났습니다.코드는 체크인되지 않은 DB 변경에 따라 달라집니다.그런 종류의 버그는 특정하기 매우 힘들 수 있지만 테스트 스위트가 바로 알아차릴 것입니다.보다 큰 Continuous Integration 플랜에 짜넣어져 있는 경우, 특히 편리합니다.
스키마를 파일에 덤프하여 소스 제어에 추가합니다.그러면 간단한 diff를 통해 무엇이 변경되었는지 알 수 있습니다.
K. Scott Allen은 스키마 버전 관리에 관한 괜찮은 기사를 가지고 있습니다.이 기사에서는 다른 답변에서 참조된 증분 업데이트 스크립트/이행 개념을 사용합니다.http://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx를 참조하십시오.
C# 를 사용하고 있는 경우는, 매우 편리한 ORM 툴인 Subsonic 을 참조해 주세요.Subsonic은 스킴이나 데이터를 다시 작성하기 위한 sql 스크립트도 생성합니다.그런 다음 이러한 스크립트를 소스 제어에 넣을 수 있습니다.
저는 Visual Studio에서 다음과 같은 데이터베이스 프로젝트 구조를 여러 프로젝트에 사용했는데 꽤 잘 작동했습니다.
데이터베이스
스크립트 변경
0. PreDeploy.sql
1. Schema Changes.sql
2. Data Changes(데이터 변경)sql
3. 권한sql
스크립트 작성
스프로크
기능들
표시
그런 다음 빌드 시스템은 다음 순서로 스크립트를 실행하여 데이터베이스를 버전 간에 업데이트합니다.
1. PreDeploy.sql
2. Schema Changes.sql
Create Scripts 폴더의 내용
2. Data Changes(데이터 변경)sql
3. 권한sql
각 개발자는 각 파일의 끝에 코드를 추가하여 특정 버그/기능에 대한 변경을 체크인합니다.메이저 버전이 완성되어 소스 제어로 분기되면 Change Scripts 폴더에 있는 .sql 파일의 내용이 삭제됩니다.
매우 심플하지만 효과적인 솔루션을 사용합니다.
신규 설치의 경우 모든 DB 스키마를 저장하는 metadata.sql 파일이 저장소에 있으며 빌드 프로세스에서 이 파일을 사용하여 데이터베이스를 생성합니다.
업데이트의 경우 하드코드된 소프트웨어에 업데이트를 추가합니다.실제로 문제가 되기 전에 문제를 해결하는 것을 좋아하지 않기 때문에 하드코드로 보관하고 있습니다.이러한 문제는 지금까지 문제가 되지 않았습니다.
소프트웨어에는 다음과 같은 기능이 있습니다.
RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');
이 코드는 데이터베이스가 버전 1(자동으로 작성된 테이블에 저장됨)에 있는지 확인하고 오래된 경우 명령을 실행합니다.
메타데이터를 갱신합니다.이 업그레이드를 로컬로 실행하고 데이터베이스 메타데이터 전체를 추출합니다.
metadata.sql을 커밋하는 것을 잊어버리는 경우가 종종 있습니다.그러나 빌드 프로세스에서 테스트하는 것은 간단하기 때문에 큰 문제는 아닙니다.또한 오래된 데이터베이스를 사용하여 새로 설치하고 처음 사용할 때 업그레이드해야 합니다.
또한 다운그레이드는 지원되지 않지만 기본적으로 업데이트 중에 문제가 발생할 경우 이전 버전을 복원하고 업데이트를 수정한 후 다시 시도합니다.
기술 수준이 낮기 때문에 더 나은 솔루션이 있을 수 있지만 스키마를 SQL 스크립트에 저장하여 데이터베이스를 생성할 수 있습니다.이 스크립트를 생성하기 위한 명령어를 실행할 수 있다고 생각합니다만, 유감스럽게도 명령어는 모릅니다.
그런 다음 스크립트에서 작동하는 코드와 함께 스크립트를 소스 제어로 커밋합니다.코드와 함께 스키마를 변경해야 할 경우 변경된 스키마가 필요한 코드와 함께 스크립트를 체크인할 수 있습니다.다음으로 스크립트의 diff는 스키마 변경 시 diff를 나타냅니다.
이 스크립트를 사용하면 DBUnit 또는 빌드 스크립트와 통합할 수 있으므로 이미 자동화된 프로세스에 적합할 수 있습니다.
빌드 버전 이름을 딴 폴더를 만들고 거기에 업그레이드 및 다운그레이드 스크립트를 넣습니다.예를 들어 1.0.0, 1.0.1 및 1.0.2 폴더가 있을 수 있습니다.각 버전에는 버전 간에 데이터베이스를 업그레이드 또는 다운그레이드할 수 있는 스크립트가 포함되어 있습니다.
1.0.1에서 문제가 발생하여 1.0.2를 사용하고 있는 경우 클라이언트 또는 고객이 전화를 걸어와도 데이터베이스를 해당 버전으로 되돌리는 것은 문제가 되지 않습니다.
데이터베이스에서 데이터베이스의 현재 버전을 저장할 "schema" 표를 작성합니다.그러면 데이터베이스를 업그레이드 또는 다운그레이드할 수 있는 프로그램을 쉽게 작성할 수 있습니다.
Joey가 말한 것처럼, 만약 당신이 Rails의 세계에 있다면, Migrations를 사용하세요.:)
현재 PHP 프로젝트에서는 레일 이행 개념을 사용하고 있으며, 이행 디렉토리에는 파일 제목 "migration_XX.sql"을 유지합니다.여기서 XX는 이행의 번호입니다.현재 이러한 파일은 업데이트 시 수작업으로 작성되지만 쉽게 수정할 수 있습니다.
다음으로 "Migration_watcher"라는 스크립트가 있습니다.이 스크립트는 프리알파에서와 같이 현재 모든 페이지 로드 시 실행되며 XX가 현재 이행 버전보다 큰 새로운 migration_XX.sql 파일이 있는지 확인합니다.이 경우 데이터베이스에 대해 모든 migration_XX.sql 파일을 최대 수까지 실행하고 voila! 스키마 변경이 자동화됩니다.
시스템을 되돌릴 수 있는 기능이 필요한 경우 많은 조정이 필요하지만, 단순하고 지금까지 매우 작은 팀에게 매우 잘 작동하고 있습니다.
Toad for MySQL에는 2개의 데이터베이스를 동기화할 수 있는 스키마 비교 기능이 있습니다.지금까지 사용한 도구 중 최고입니다.
Yii가 데이터베이스 이행을 처리하는 방식이 마음에 듭니다.이행은 기본적으로 를 구현하는 PHP 스크립트입니다.CDbMigration
up
이행 로직을 포함하는 메서드., '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,down
이행 번복을 지원하는 방법.,,safeUp
★★★★★★★★★★★★★★★★★」safeDown
를 사용하여 트랜잭션 컨텍스트에서 마이그레이션이 수행되도록 할 수 있습니다.
Yii 령령도도 도도 yyiic
에는 이행 작성 및 실행 지원이 포함되어 있습니다.마이그레이션은 하나씩 또는 일괄적으로 적용하거나 되돌릴 수 있습니다.가 PHP를 구현하는 됩니다.CDbMigration
는 사용자가 지정한 타임스탬프와 이행명을 기반으로 고유하게 명명됩니다.이전에 데이터베이스에 적용된 모든 마이그레이션은 마이그레이션 테이블에 저장됩니다.
자세한 내용은 매뉴얼의 데이터베이스 마이그레이션 문서를 참조하십시오.
db-deploy - 주로 Java 도구이지만 php에서도 작동합니다.
- http://dbdeploy.com/
- http://davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy.html
"스크립팅" 측에서는 Ant(크로스 플랫폼)을, 소스 저장소에서는 Subversion을 사용하는 것이 좋습니다.변경하기 전에 로컬 파일에 db를 "백업"할 수 있습니다.
- Ant를 통해 기존 DB 스키마를 파일로 백업
- Ant를 통해 Subversion 저장소로 버전 제어
- Ant를 통해 새 sql 문을 DB로 전송
IMHO 이행에는 큰 문제가 있습니다.
버전 간에 업그레이드하는 것은 문제 없습니다만, 수백 개의 테이블이 있고 (당사와 같이) 오랜 시간 동안 변경된 경우 특정 버전을 새로 설치하는 데 시간이 오래 걸릴 수 있습니다.
베이스라인은 최신 버전(수백 개의 고객 데이터베이스)까지 실행되기 때문에 델타의 전체 이력을 실행하는 데 매우 오랜 시간이 걸릴 수 있습니다.
데이터베이스 스키마를 비교하는 명령줄 mysql-diff 도구가 있습니다.여기서 스키마는 디스크상의 라이브 데이터베이스 또는 SQL 스크립트일 수 있습니다.대부분의 스키마 마이그레이션 작업에 적합합니다.
언급URL : https://stackoverflow.com/questions/1607/mechanisms-for-tracking-db-schema-changes
'sourcecode' 카테고리의 다른 글
vuejs 앱에서 동적 기본 URL을 설정하려면 어떻게 해야 합니까? (0) | 2023.01.30 |
---|---|
Panda 데이터 프레임에서 여러 열 선택 (0) | 2023.01.30 |
왜 자바에서는 10부터 99까지의 모든 숫자의 곱이 0이라고 생각할까요? (0) | 2023.01.30 |
값이 일정한 bindParam을 사용하는 경우 참조 오류에 의해 파라미터 2를 통과시킬 수 없습니다. (0) | 2023.01.30 |
JNI는 jstring을 char*로 변환합니다. (0) | 2023.01.30 |