[사례 연구] 데이터베이스 마이그레이션이 무너지는 순간, 어떻게 대응할 것인가
데이터베이스 마이그레이션은 개발팀이 가장 두려워하는 작업 중 하나다. 성공하면 눈에 띄지 않지만, 실패하면 서비스 전체가 마비되고 데이터가 손실될 수 있다. 이 글은 마이그레이션이 실제로 어떻게 망가지는지, 그리고 문제가 생겼을 때 어떻게 수습할 것인지를 다룬다.
마이그레이션이 실패하는 근본 원인
데이터베이스 마이그레이션이 실패하는 경우는 보통 몇 가지 패턴으로 나뉜다. 먼저 충분한 테스트 없이 프로덕션 환경에 직접 적용하는 경우다. 개발 환경과 스테이징 환경에서는 문제가 없었는데, 실제 데이터의 규모와 복잡도가 다르면 예상하지 못한 병목 지점이 나타난다. 둘째, 마이그레이션 중 발생하는 데이터 타입 불일치나 제약 조건 위반이다. 기존 데이터가 새로운 스키마에 맞지 않으면 마이그레이션 과정이 중단되고, 롤백을 시도하다가 더 큰 혼란이 생길 수 있다. 셋째, 롤백 계획을 세우지 않은 채 진행하는 것이다. 문제가 발생했을 때 어떻게 원래 상태로 돌아갈지 정해두지 않으면 패닉 상태에 빠진다.
마이그레이션 중 성능 저하 문제
많은 팀이 간과하는 부분이 성능이다. 대용량 데이터를 한꺼번에 마이그레이션하려고 하면 락(lock)이 길어져서 서비스 전체가 느려진다. 예를 들어 수백만 건의 레코드를 옮기면서 동시에 사용자들의 요청도 처리해야 하는 상황이 된다. 이때 인덱스를 미리 만들지 않으면 마이그레이션 속도가 급격히 떨어지고, 타임아웃이 발생한다. 또한 마이그레이션 중에 복제(replication) 지연이 발생하면, 마스터 데이터베이스와 슬레이브의 데이터가 불일치할 위험도 있다.
실제 마이그레이션 복구 전략
문제가 이미 발생했다면, 침착함을 유지하고 다음 순서로 대응해야 한다. 먼저 즉시 롤백하는 것을 고려한다. 마이그레이션을 완료하지 못했다면 백업에서 복구하는 것이 가장 빠른 해결책이다. 다만 이는 마이그레이션 시작 이후의 데이터 변경 사항을 모두 잃는다는 뜻이므로, 얼마나 빨리 결단할 수 있느냐가 중요하다.
롤백이 불가능하거나 부분 복구가 필요한 경우라면, 마이그레이션된 데이터를 검증해야 한다. 기존 데이터와 마이그레이션된 데이터를 비교해서 어느 부분이 손상되었는지 파악한다. 이를 위해 마이그레이션 전에 검증 스크립트를 미리 작성하는 것이 도움이 된다. 예를 들어 레코드 수 비교, 데이터 해시값 검증, 관계 무결성 점검 등이다.
데이터 손상이 확인되면, 영향받은 범위를 격리하고 나머지 시스템은 유지한 채로 부분 복구를 진행한다. 이 과정에서 데이터베이스 트랜잭션 로그를 활용해서 특정 시점까지 복구하는 PITR(Point-In-Time Recovery)을 사용할 수 있다.
데이터 손실 방지 체크리스트
- 전체 백업 및 증분 백업 준비 — 마이그레이션 직전에 완전한 백업을 받고, 복구 가능성을 테스트
- 이중화 환경에서 진행 — 프로덕션과 동일한 환경에서 먼저 시뮬레이션
- 락 시간 최소화 — 배치 처리를 통해 작은 단위로 나눠서 마이그레이션
- 이중 쓰기(dual-write) 패턴 적용 — 마이그레이션 기간 동안 새 데이터베이스와 기존 데이터베이스 모두에 쓰기
- 자동화된 검증 — 마이그레이션 후 자동으로 데이터 무결성을 점검
마이그레이션 성공을 위한 실전 전략
마이그레이션을 계획할 때부터 실패 시나리오를 가정해야 한다. 롤백 계획, 긴급 연락처, 복구 절차를 문서화하고, 팀 전체가 이를 숙지해야 한다. 테스트 단계에서는 예상되는 워크로드보다 훨씬 큰 데이터로 스트레스 테스트를 수행한다. 실제 마이그레이션 날에는 트래픽이 적은 시간을 선택하고, 모니터링을 강화해서 이상 신호를 즉시 감지한다.
마이그레이션 후에도 수 일간은 모니터링을 유지하고, 느린 쿼리나 데이터 불일치 이슈가 없는지 정기적으로 확인한다. 이런 준비가 마이그레이션의 성공 확률을 크게 높인다.