2010-11-21 5 views
0

MySQL 데이터 모델을 저장하고 변경 사항을 개발 데이터베이스 서버에 자동으로 적용하는 가장 좋은 방법은 무엇입니까? (또는 최소한 야간에)?MySQL 데이터 모델을 어떻게 동기화하고 동기화합니까?

이후 생산에 배포 할 예를 들어, 오늘은 내 프로젝트에서 일하고 있어요 및 내 데이터베이스에서이 테이블을 작성하고 SQL 파일로 문을 저장합니다

create table dog (
    uid int, 
    name varchar(50) 
); 

그리고 내일, 내가 원하는 결정 각 개 품종도 기록합니다.

create table dog (
    uid int, 
    name varchar(50), 
    breed varchar(30) 
); 

해당 스크립트가 첫 번째 릴리스에 대한 생산 작동하지만 그것은 나를 ERROR 1050 (42S01): Table 'dog' already exists 때문에 내 개발 데이터베이스를 업데이트 도움이되지 않습니다 : 그래서 읽을 수있는 SQL 파일을 변경합니다. 또한이 변경 사항이 첫 번째 릴리스 이후에 만들어진 경우 프로덕션 환경에서 작동하지 않습니다. 그래서 지금은 ALTER 테이블이 필요합니다.

그래서 지금은이 문제가 : 나는 내가 어떻게해야 내 데이터 모델 (A SQL 파일에 문을 만들 수의 무리), 및

  • 을 절약 할 방법을

    1. 이인가 과 같은 변경 사항을 데이터베이스에 적용하고 있습니까?

    내 목표는 변경 사항을 정확하게 릴리스하고 지속적인 통합을 가능하게하는 것입니다. DDLSYNC라는 도구를 사용하여 오라클 데이터베이스에서 차이점을 찾아 적용하지만, MySQL과 비슷한 도구가 있는지 모르겠습니다.

  • 답변

    1

    직장에서 우리는 데이터베이스 버전 관리를위한 작은 스크립트를 개발했습니다. 모든 테이블 또는 데이터 세트를 변경할 때마다 자체 SQL 파일이 생성됩니다.

    파일은 순차적으로 번호가 매겨집니다. 해당 정보를 데이터베이스에 저장하여 어떤 업데이트 파일이 실행되었는지 추적합니다. 스크립트는 파일이 실행될 때 파일 이름이있는 행을 삽입하고 실행이 완료되면 행을 완료 시간 소인으로 업데이트합니다. 이것은 트랜잭션 내부에 래핑됩니다. (트랜잭션 내에서 MySQL에서 DDL 명령을 실행할 수 없다는 것을 기억해야합니다. 트랜잭션에서 DDL을 수행하려고하면 암시 적 커밋이 발생합니다.)

    SQL 파일은 소스 코드 저장소에 포함되어 있으므로 정상적인 롤아웃 프로세스의 업데이트 스크립트 부분. 이렇게하면 데이터베이스와 코드를 동기화 된 상태로 쉽게 유지할 수 있습니다. 솔직히, 가장 어려운 부분은 다른 개발자가 보류중인 커밋에서 다음 번호를 가져 오지 않았는지 확인하는 것입니다.

    우리는이 업데이트 시스템을 dev 데이터베이스의 야간 삭제 (옵션)와 결합하여 내용을 지난 밤의 라이브 시스템 백업으로 바꿉니다. 백업이 복원되면 보류중인 업데이트 파일이 프로세스에서 실행되고 업데이트가 실행됩니다.

    복원은 라이브 데이터베이스에 있던 테이블 만 덮어 쓰게됩니다. 따라서 테이블을 추가하는 모든 업데이트는 존재하지 않는 경우에만 추가해야합니다. DROP TABLE IF EXISTS은 편리합니다. 유감 스럽지만 모든 데이터베이스가이를 지원하는 것은 아니므로, 업데이트 시스템은 SQL뿐 아니라 우리가 선택한 언어로 작성된 스크립트의 실행도 허용합니다.

    약 150 줄의 코드에서 모두. 디렉토리를 읽고, 내용을 테이블과 비교하며, 아직 실행되지 않은 모든 것을 결정된 순서대로 실행하는 것만 큼 쉽습니다.

    0

    많은 프레임 워크에서 표준 도구가 있습니다. 레일스에는 Migrations이라는 이름이 있는데, 이는 PHP 또는 유사한 언어로 쉽게 복제됩니다.

    관련 문제