2012-02-21 5 views
2

MySQL 데이터베이스의 변경 사항을 추적하는 방법이 있습니까? 나는 오프라인에서 개발 한 다음 내 서버에 대한 모든 변경 사항을 커밋합니다. 응용 프로그램 자체에 대해 나는 힘내를 사용하고 멋지게 작동한다.MySQL 데이터베이스를 소급하여 변경

그러나 데이터베이스의 경우 라이브 데이터베이스에 고객 데이터가 포함되어 있으며 개발 데이터베이스로 바꿀 수 없기 때문에 모든 것을 수동으로 변경합니다.

완전히 다른 DB로 교체하지 않고 구조 변경 만 적용 할 수있는 방법이 있습니까?

+0

만약 내가 그것에 대해 듣고 싶다면, 지금까지 유일한 방법은 소스 제어에 대한 변경 스크립트 커밋과 관련이 있습니다. 데이터베이스를 롤백/전달하면 필드 변경으로 인해 데이터 손실/손상 문제가 발생할 수 있다는 문제점이 있습니다. 나는 MySQL을 만족스럽게 처리하는 시스템을 아직 찾지 못했지만 어딘가에 있어야한다고 생각하는 데는 도움이되지 않습니다. –

답변

0

원하는 용어는 '데이터베이스 마이그레이션'입니다 (아니요, 하나의 RDBMS에서 다른 RDBMS로 이동하는 것을 의미하지는 않습니다). 마이그레이션은 데이터베이스 구조를 프로그래밍 방식으로 버전 제어하는 ​​방법입니다. 대부분의 언어에는 ORM 라이브러리/프레임 워크의 일부인 일종의 마이그레이션 툴킷이 있습니다.

PHP를 들어 변경 내용 추적이 루비를 들어 Doctrine

는 물론

0

키의 Rails의 볼 수있는 것은 내 친구 Snapshots입니다.

이제 넓은 분야입니다. 당신이해야 할 첫 번째 일은 당신이 데이터베이스에 어떤 종류의 데이터를 가지고 있는지 추적하고 싶다면 결정하는 것입니다. 그렇다면 LVM, copying InnoDB binary logs 및 간단한 mysqldump을 사용하여 몇 가지 옵션을 사용할 수 있습니다.

이제 데이터베이스 변경 (예 : 열 추가)간에 원활한 전환을 원할 경우 다른 옵션이 있습니다.

첫 번째 복제입니다. 그건 좋은 선택이지만 조금 복잡합니다. 복제 기능을 사용하면 하나의 슬레이브를 변경할 수 있습니다. 잠금이 끝나면 일부 잠금 기능을 사용하여 마스터로 만들고 마스터를 바꿀 수 있습니다. 정말 어렵지만 더 나은 선택입니다.

복제 할 여력이 없다면 다운 타임을 최소화하면서 단일 마스터 DB에 변경 사항을 적용해야합니다. 좋은 옵션은 다음과 같습니다.

"facebook_account"필드를 추가하기 위해 Customer 테이블을 바꾸려고한다고 가정합니다. 첫째, 당신은이 같은 별칭 테이블을 사용할 수 있습니다

(이 데이터가) 원래 테이블 :

CREATE TABLE `customer` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

새로운 하나를

CREATE TABLE `new_customer` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `facebook_account` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

또는 단순히 :

CREATE TABLE new_customer LIKE customer; 
ALTER TABLE new_customer add column facebook_account VARCHAR(255); 

이제 데이터를 새 테이블에 복사 해 보겠습니다. 우리는 먼저 다른 것들을 발행 할 필요가 있습니다. 나는 한 번에 그것들을 각각 설명 할 것입니다.

먼저 테이블을 변경하는 동안 다른 연결이 고객 테이블을 수정하도록 허용 할 수 있으므로 잠금을 발행합니다.이에 대한 자세한 내용을 원한다면 here 이동 :

LOCK TABLES customer WRITE ,new_customer WRITE; 

지금 내가 파일 시스템에 대한 캐시 내용을 작성하는 테이블을 플러시 :

FLUSH TABLES customer; 

이제 우리는 삽입 할 수 있습니다. 먼저 성능 문제에 대한 키를 비활성화합니다. 데이터가 삽입 된 후에 키를 다시 활성화합니다.

ALTER TABLE new_customer DISABLE KEYS; 
INSERT INTO new_customer(id,name,facebook_account) SELECT customer.id,customer.name, Null FROM customer; 
ALTER TABLE new_customer ENABLE KEYS; 

이제 테이블을 전환 할 수 있습니다.

ALTER TABLE customer RENAME old_customer; 
ALTER TABLE new_customer RENAME customer; 

마지막으로 잠금 장치를 해제해야합니다.

UNLOCK TABLES; 

그게 전부입니다. 수정 된 테이블을 추적하려면 old_customer 테이블의 이름을 다른 것으로 변경하거나 다른 데이터베이스로 옮길 수 있습니다.

여기서 다루지 않은 유일한 문제는 트리거에 관한 것입니다. 활성화 된 모든 트리거에 대해주의를 기울여야하지만 스키마에 따라 다릅니다.

그게 도움이되기를 바랍니다.

관련 문제