최근에 내 Rails (3.0.9) 응용 프로그램에서 다시 시작해야하는 문제를 디버깅하려고합니다. 응용 프로그램의 인스턴스를 다시 배포해야합니다 (다시 배포하지 않음). 데이터베이스에서 비 중단 이주가 수행 될 때). 이것은 이전에는 발생하지 않았고 최근에 시작해야하는 이유를 찾을 수 없습니다.레일즈 응용 프로그램이 이전에 오류가 발생해서 오류가 발생했습니다.
내 프로덕션 환경에는 각각 하나의 MySQL 인스턴스를 공유하는 fork 된 Unicorn 인스턴스를 사용하는 서버가 몇 개 있습니다. 각 인스턴스는 1의 연결 풀을 사용하고 있습니다. 또한 준비 데이터베이스를 테스트 한 후 실제 데이터를 테스트하기위한 최종 준비 환경으로 사용되는 서버가 하나 있습니다.
이전에는 이전 코드가 전혀 필요하지 않은 마이그레이션 인 경우 프로덕션 유니콘 서버를 다시 배포하거나 다시 시작하지 않고도 프로덕션 DB에서 마이그레이션을 실행할 수있었습니다. 예를 들어 기존 테이블에 새로운 옵션 필드를 추가하면 스테이징 서버에 배포 된 코드가 데이터를 기록하지만 기존 서버는이를 무시하고 데이터베이스를 계속 사용할 수 있습니다. 새로운 코드를 생산에 적용 할 준비가되었습니다.
최근에 우리는 마이그레이션을 실행 한 후에 프로덕션 서버에서 예외가 발생하는 것을보고 있지만 수정 된 테이블에 새 행을 삽입하려고 시도 할 때만 나타납니다. 응용 프로그램의 다른 모든 부분, 모든 다른 테이블은 영향을받지 않습니다,하지만 빨리 삽입있다, 우리는 얻을이 :
NoMethodError: undefined method `name' for nil:NilClass
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:56:in `visit_Arel_Nodes_InsertStatement'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:55:in `map'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:55:in `visit_Arel_Nodes_InsertStatement'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:15:in `send'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:15:in `visit'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/visitor.rb:5:in `accept'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:18:in `accept'
[GEM_ROOT]/bundler/gems/rails-83fb5552b6ab/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:111:in `with_connection'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/visitors/to_sql.rb:16:in `accept'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/tree_manager.rb:20:in `to_sql'
[GEM_ROOT]/gems/arel-2.0.10/lib/arel/select_manager.rb:217:in `insert'
우리가 그 때 '에도 불구하고, 프로덕션 서버를 다시 시작하면 문제가 사라집니다 여전히 이전 코드를 실행합니다. 따라서 앱이이 오류에 부딪치지 않았다면 마이그레이션 이전에 수행중인 작업을 계속할 수 있어도 테이블이 수정 될 때 연결에서 무언가가 손상된 것으로 보입니다.
나는 ActiveRecord/ARel을 파고 들었다.하지만 내가 할 수있는 가장 큰 이유는이 테이블의 캐쉬 모델이 어느 컬럼에 대한 지식을 잃어 버렸는가하는 것이다. 왜 이것이 갑자기 일어날 것인가?