문제

사용중인 프로덕션 데이터베이스를 변경해야합니다. 몇 개의 열만 추가합니다. 마이그레이션으로 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"문을 생성합니다. 일단 생성 된 열에 무엇을 넣을 것인지 알고 있다면 마이그레이션 내의 값을 채울 수 있습니다 (행 카운트가 큰 경우 시간이 덜한 대안을 선택할 수 있습니다).

열의 정의를 제거하거나 변경하는 것은 플랫폼 의존적이라고 생각합니다. 일부는 열을 제자리에 삭제할 수 있고 다른 일부는 이름을 크리티브-선택-선택-드롭 순서 시퀀스를 수행합니다.

보다 구체적으로 얻으려면 더 많은 정보가 필요합니다. 어떤 종류의 마이그레이션을보고 있습니까? 어떤 플랫폼을 실행하고 있습니까? 마이그레이션의 일부로 값을 설정해야합니까? 그런 것들이 많은 도움이 될 것입니다. 질문을 편집하면 목록을 다시 밀어 올릴 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top