Skip to content
dev-marco-song
Go back

프로덕션 환경의 데이터베이스 스키마 변경하기(Online-Schema-change)

Edit page

OSC(online schema change)가 뭐죠?

서비스 중인 프로덕션 환경의 테이블 스키마를 수정할 때는, 스키마를 수정하는 도중에도 데이터를 READ / WRITE 할 수 있어야 한다. 이렇게 무중단으로 스키마를 수정하는 방법을 Online-Schema-Change, OSC라 한다.

OSC를 사용하게 된 배경…

alter table로 프로덕션 DB를 수정하다가, table lock으로 인해 일부 테이블 사용이 불가능해진 사고가 발생했다. 문제가 생긴 테이블들은 drop, create 모두 불가능한 교착 상태가 지속되었고 해결에 상당한 시간이 소요되었다. 스키마 변경에 따른 DB 문제 재발 방지를 위해 OSC를 도입하였다.

개념 설명

기존 alter table 방식

  1. 해당 테이블을 락으로 새로운 READ or WRITE 차단 ( READ / WRITE lock 여부는 DB 엔진, DB 버전, 쿼리문마다 얘기가 다르므로 주의) - mysql5.6
  2. 새로운 테이블의 빈 임시 테이블을 만들고, (스키마 변경이 반영된)
  3. 기존 테이블에서 새 테이블에 데이터를 복사하고,
  4. 새 테이블을 기존 테이블과 같은 이름으로 바꾸고 기존 테이블을 삭제한다.
  5. 새로운 테이블에 차단했던 Lock을 푼다.

문제점 : 락 문제때문에 프로덕션에선 사용하기 곤란하다. 락이 걸린 동안 발생하는 READ / WRITE가 불가능해지고, 데드락으로 인한 DB 교착이 생길 수 있다. 그래서 어떻게? 락 걸지마! - OSC 의 해결 방법

OSC 사용 방법

하여 OSC의 대표적인 툴인 percona에서 만든, pt-online-schema-change를 소개한다.각자 환경에 맞는 방법으로 percona-toolkit을 설치한다. (글에서는 mac homebrew로 설치)

brew install percona-toolkit

pt-online-schema-change 스크립트를 환경에 맞게 옵션을 설정하여 셸에서 실행하면 스키마 변경이 진행된다. 다음과 같은 상황에서 사용한다.

테스트용 셸 스크립트

pt-online-schema-change \
--alter "add column testcol varchar(255) default null" D=myDatabase,t=test_A \
--chunk-size=200 \
--host=xxx.rds.amazonaws.com \
--port=3306 \
--user=marco \
--ask-pass \
--progress=time,30 \
--charset=UTF8 \
--execute

Edit page
Share this post on:

Previous Post
AJV(another json validatiror)를 사용하여 JSON 스키마 검증하기(json schema validation)
Next Post
리액트 file upload button 먹통 문제 해결