우리는 8 백만 행이있는 테이블의 UUID 유형 열에 색인을 추가하기 위해 Postgres와 함께 Ruby on Rails 마이그레이션을 사용하고 있습니다.8 천만 행 테이블에 대한 색인 생성
concurrently
패턴을 따르고 disable_ddl_transaction!
입니다. 그러나 배포 직후 마이 그 레이션 도중 심각한 속도 저하를 감지하고 결국 테이블이 응답을 중지했습니다. 중간에 마이그레이션을 취소했으나 테이블이 마침내 복구되었지만 테이블이 응답을 멈추게 한 원인을 아직 알 수 없습니다.
우리는 AWS RDS를 사용하고 있으며 모든 통계를 확인했으며 CPU 나 I/O가 초과 된 것처럼 보이지 않았습니다.
내 질문에이 마이그레이션 중에 우리가 감속/가동 중지 시간을 초래할 수있는 다른 고려 사항이 있습니까?
다른 테이블이 응답했지만 응용 프로그램이로드되고 있었지만이 테이블 하나가 막혔습니다. 여기
마이그레이션입니다 :class AddIndexToPublicId < ActiveRecord::Migration
disable_ddl_transaction!
def up
change_column :table1, :public_id, :uuid, null: false
change_column :table2, :public_id, :uuid, null: false
change_column :table3, :public_id, :uuid, null: false
add_index :table1, :public_id, unique: true, algorithm: :concurrently
add_index :table2, :public_id, unique: true, algorithm: :concurrently
add_index :table3, :public_id, unique: true, algorithm: :concurrently
end
def down
remove_index :table1, :public_id
remove_index :table2, :public_id
remove_index :table3, :public_id
change_column :table1, :public_id, :uuid, null: true
change_column :table2, :public_id, :uuid, null: true
change_column :table3, :public_id, :uuid, null: true
end
end
마이그레이션의 change_column
부분은 잘 작동하는 듯하지만, 우리 schema.rb하지 않는 경우 인덱싱은 지금 우리가 이상한 상태에있어 너무 완료되지 않았습니다 우리의 db와 일치해라.
그래서 우리는 조금 더 배웠습니다. 우리는 실제로'null : false' 부분을 지나치지 않았습니다. 우리는 이전을 다시하고 마침내 그 일을 지나쳤습니다. 그런 다음 마이그레이션을 완료하고 table1에 인덱스를 추가하면 더 많은 가동 중지/느려짐이 발생했습니다. 우리는 IO/CPU를 살펴 보았고 스파이크가 발생하지 않았습니다. –