키의 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 테이블의 이름을 다른 것으로 변경하거나 다른 데이터베이스로 옮길 수 있습니다.
여기서 다루지 않은 유일한 문제는 트리거에 관한 것입니다. 활성화 된 모든 트리거에 대해주의를 기울여야하지만 스키마에 따라 다릅니다.
그게 도움이되기를 바랍니다.
만약 내가 그것에 대해 듣고 싶다면, 지금까지 유일한 방법은 소스 제어에 대한 변경 스크립트 커밋과 관련이 있습니다. 데이터베이스를 롤백/전달하면 필드 변경으로 인해 데이터 손실/손상 문제가 발생할 수 있다는 문제점이 있습니다. 나는 MySQL을 만족스럽게 처리하는 시스템을 아직 찾지 못했지만 어딘가에 있어야한다고 생각하는 데는 도움이되지 않습니다. –