Rails : 생산 데이터베이스를 변경하는 가장 좋은 방법
-
03-07-2019 - |
문제
사용중인 프로덕션 데이터베이스를 변경해야합니다. 몇 개의 열만 추가합니다. 마이그레이션으로 DEV 데이터베이스를 변경했습니다. 기존 데이터를 보존하고 운영을 너무 많이 방해하지 않고 프로덕션 데이터베이스를 업데이트하는 가장 좋은 방법은 무엇입니까?
MySQL이며 이미 기존 레코드에 대해서도 열에 데이터를 추가해야합니다. 한 열에는 기본값 (부울)을 가질 수 있지만 다른 열은 타임 스탬프이며 임의의 백 데이트 값을 가져야합니다. 행 카운트는 크지 않습니다.
따라서 마이그레이션을 사용하는 경우 어떻게 데이터를 추가하고 데이터를 추가 할 수있는 방법 (또는 세 가지 - 마이그레이션을 통해 처음 구축되지 않았을 때 생산 DB에 데이터를 추가하는 방법입니다. 대신 스키마)?
해결책
프로덕션 DB 스키마가 DEV에서 사용하는 내용과 정확히 일치하지 않는 상태에있는 것처럼 들립니다 (완전히 명확하지는 않지만). 나는 모래에 선을 그릴 것이고, 그 prod db를 더 나은 상태로 얻을 것입니다. 본질적으로 당신이하고 싶은 것은 prod db에 "schema_info"테이블이 있는지 확인하는 것입니다. 그러면 마음 내용에 마이그레이션을 추가 할 수 있으며 프로덕션 DB에 대해 작동합니다.
일단 완료 한 후에는 스키마 변경 사항을 추가하거나 데이터를 추가하는 마이그레이션을 작성할 수 있지만 실제로주의해야 할 것은 마이그레이션을 사용하여 데이터를 추가하면 이와 같이 마이그레이션 자체 내에서 모델을 정의해야한다는 것입니다. :
class AddSomeColumnsToUserTable < ActiveRecord::Migration
class User < ActiveRecord::Base; end
def self.up
add_column :users, :super_cool, :boolean, :default => :false
u = User.find_by_login('cameron')
u.super_cool = true
u.save
end
def self.down
remove_column :users, :super_cool
end
end
그 이유는 미래에 리팩토링 또는 기타 기간 동안 모델을 완전히 제거 할 수 있기 때문입니다. "user.find_by_login ..."라인에서 사용자 클래스를 정의하지 않으면 마이그레이션은 큰 고통 인 예외가 발생합니다.
다른 팁
나는 항상이 절차를 따릅니다.
- mysqldump 명령으로 prod 데이터베이스를 덤프하십시오
- mysql 명령을 사용하여 덤프로 dev / test 데이터베이스를 채우십시오.
- Dev / Test에서 마이그레이션을 실행합니다
- 점검 마이그레이션이 작동했습니다
- mysqldump 명령으로 prod 데이터베이스를 덤프 (변경되었을 수 있음) 서버에서 백업을 유지합니다.
- Prod에서 마이그레이션 실행 (Capristano 사용)
- 테스트 마이그레이션은 Prod에서 작동했습니다
- 맥주를 마시십시오 (오류 로그를 보면서)
개발자 환경에서 사용한 동일한 마이그레이션을 사용하지 않는 이유가 있습니까?
함께 열을 추가합니다 add_column
마이그레이션에서는 비파괴 적이어야합니다. "Alter Table"문을 생성합니다. 일단 생성 된 열에 무엇을 넣을 것인지 알고 있다면 마이그레이션 내의 값을 채울 수 있습니다 (행 카운트가 큰 경우 시간이 덜한 대안을 선택할 수 있습니다).
열의 정의를 제거하거나 변경하는 것은 플랫폼 의존적이라고 생각합니다. 일부는 열을 제자리에 삭제할 수 있고 다른 일부는 이름을 크리티브-선택-선택-드롭 순서 시퀀스를 수행합니다.
보다 구체적으로 얻으려면 더 많은 정보가 필요합니다. 어떤 종류의 마이그레이션을보고 있습니까? 어떤 플랫폼을 실행하고 있습니까? 마이그레이션의 일부로 값을 설정해야합니까? 그런 것들이 많은 도움이 될 것입니다. 질문을 편집하면 목록을 다시 밀어 올릴 것입니다.