← 전체 글로 돌아가기

웹 개발

운영 중 데이터를 삭제해야 할 때 실수를 줄이는 방법

프로덕션 데이터베이스에서 데이터를 삭제하거나 초기화해야 할 때 되돌릴 수 없는 실수를 방지하는 체크리스트를 정리했다.

운영 환경에서 데이터를 삭제하는 건 위험한 작업이다. 한 번 삭제되면 되돌릴 수 없기 때문이다. 그래서 여러 단계의 확인이 필요하다.

삭제 전에 백업 만들기

절대 첫 번째 단계는 아니지만, 반드시 해야 할 것이다. 데이터베이스 전체 백업이나 해당 테이블의 스냅샷을 만들어두자. PostgreSQL이라면 pg_dump 또는 pg_basebackup 명령을 사용할 수 있다. 이렇게 하면 최악의 경우 복구할 수 있다.

삭제할 데이터를 먼저 조회해보기

DELETE 문을 실행하기 전에, 먼저 SELECT 문으로 정확히 어떤 데이터가 삭제될지 확인하자. 쿼리 조건이 정확한지, 예상보다 많은 데이터를 선택하고 있지는 않은지 확인해야 한다.

-- 먼저 이 쿼리로 확인
SELECT COUNT(*) FROM users WHERE created_at < '2024-01-01';

-- 몇 개가 선택되는지 봤으면, 실제 삭제
DELETE FROM users WHERE created_at < '2024-01-01';

트랜잭션으로 테스트하기

PostgreSQL이나 MySQL 같은 데이터베이스에서는 트랜잭션을 사용할 수 있다. BEGIN 명령으로 트랜잭션을 시작하고 DELETE 문을 실행한 뒤, ROLLBACK 명령으로 되돌려 보자. 이렇게 하면 실제 데이터를 손상시키지 않고 삭제 쿼리가 제대로 동작하는지 확인할 수 있다.

스테이징 환경에서 먼저 시뮬레이션

가능하다면 운영 데이터베이스의 백업본을 스테이징이나 로컬 환경에 복원해서, 그곳에서 먼저 삭제 쿼리를 테스트하자. 쿼리 문법이 맞는지, 의도한 데이터만 선택되는지 확인할 수 있다.

외래 키 제약 확인하기

삭제하려는 테이블의 행을 참조하는 다른 테이블이 있을 수 있다. 외래 키 제약 때문에 삭제가 실패하거나, ON DELETE CASCADE 때문에 예상치 못한 데이터가 함께 삭제될 수 있다. 관련 테이블을 먼저 확인하자.

로그와 감사 기록 남기기

데이터 삭제는 반드시 기록해두자. 언제, 누가, 왜 어떤 데이터를 삭제했는지 로그에 남겨두면 나중에 문제가 생겼을 때 추적할 수 있다. 가능하면 DELETE 문 대신 소프트 삭제(soft delete) 같은 방식을 사용해서 데이터를 보존하는 것도 좋은 방법이다.

단계별로 조금씩 삭제하기

한 번에 100만 개 행을 삭제하는 것보다, 10만 개씩 나눠서 여러 번 삭제하는 게 낫다. 데이터베이스의 락을 최소화할 수 있고, 문제가 생겼을 때 영향 범위를 줄일 수 있다. 특히 큰 테이블에서는 이런 접근이 필수다.