본문 바로가기

일상

RDS 스냅샷에서 pg_dump로 SQL 덤프 뽑기 (스냅샷은 SQL 파일이 아니다)

반응형

RDS를 지웠거나 지울 예정인데 데이터베이스를 로컬 .sql 파일로 보관하고 싶을 때, 스냅샷에서 덤프를 뽑는 방법입니다.


1. 스냅샷은 SQL 파일이 아니다
RDS 스냅샷을 백업이라고 생각해서 "다운로드해서 .sql로 쓰면 되겠지" 했다가 막히는 경우가 많습니다. 스냅샷은 AWS 안에서만 쓰는 블록 단위 이미지라, 파일로 내려받아 열 수가 없습니다. SQL 덤프(.sql이나 pg_dump 아카이브)를 얻으려면 살아 있는 데이터베이스에 pg_dump를 붙여서 뽑아야 하는데, 원본 인스턴스를 이미 지웠다면 붙을 대상이 없습니다. 그래서 스냅샷을 임시 인스턴스로 잠깐 되살려서 덤프를 뜨고, 다시 지우는 방식으로 돌아가야 합니다.


- 스냅샷 = AWS 전용 블록 이미지 (파일로 다운로드 불가)
- SQL 덤프는 살아 있는 DB에 pg_dump를 붙여야 나옴
- 원본을 지웠으면 스냅샷을 임시로 복원해서 뽑는 수밖에 없음


2. 스냅샷을 임시 인스턴스로 복원한다
먼저 스냅샷으로부터 임시 인스턴스를 하나 만듭니다. 어차피 곧 지울 거라 작은 인스턴스 클래스면 충분합니다. 로컬에서 접속해 덤프를 떠야 하니 공개 접속을 켜고, 보안 그룹에서 내 IP의 5432 포트를 열어 둡니다. 복원은 10분 안팎 걸리므로, 상태가 available이 되고 접속 엔드포인트가 나오는지 확인하고 넘어갑니다.


- 곧 지울 것이라 작은 인스턴스 클래스로 충분
- 로컬 접속 위해 공개 접속 + 보안 그룹 5432 허용
- available 되고 엔드포인트 나오면 준비 완료(약 10분)


3. pg_dump로 통째 뽑고 검증한다
임시 인스턴스가 뜨면 pg_dump로 데이터베이스를 통째로 뜹니다. custom 포맷(-Fc)으로 뜨면 압축되고 복원도 유연합니다. 비밀번호는 명령 인자에 평문으로 넣지 말고 환경 변수로 넘기는 게 안전합니다. 덤프가 끝나면 파일 크기만 보고 안심하지 말고, pg_restore로 아카이브 목차(TOC)를 읽어 테이블이 다 들어갔는지 확인합니다. 아카이브가 손상되면 목차 읽기 자체가 실패하므로, 이 한 번으로 무결성까지 검증됩니다.


- custom 포맷(-Fc) = 압축 + 복원 유연
- 비밀번호는 환경 변수로(평문 인자 금지)
- pg_restore로 목차(TOC) 읽어 무결성까지 확인


4. 임시 인스턴스와 스냅샷을 정리한다
로컬 덤프가 검증됐으면 임시 인스턴스는 최종 스냅샷 없이 바로 삭제합니다. 원본 스냅샷도 더 이상 필요 없으면 같이 지웁니다. 이러면 손에는 로컬 .dump 파일 하나만 남고, AWS 쪽 과금은 다시 발생하지 않습니다. 나중에 복원이 필요하면 새 DB를 만들고 pg_restore로 이 파일을 밀어 넣으면 됩니다.


- 임시 인스턴스는 최종 스냅샷 없이 삭제
- 원본 스냅샷도 필요 없으면 삭제 -> 로컬 파일만 남고 과금 없음
- 복원은 새 DB에 pg_restore로 밀어 넣으면 끝


5. 정리
RDS 스냅샷을 로컬 SQL로 옮기는 핵심은 "스냅샷은 살아 있는 DB가 아니다"를 이해하는 것입니다. 파일로 바로 못 뽑으니, 스냅샷을 임시 인스턴스로 잠깐 되살려 pg_dump로 뜨고, 검증한 뒤, 임시 자원을 지우면 됩니다. 이렇게 해 두면 AWS를 완전히 내려도 데이터는 손안의 파일로 안전하게 남습니다.


- 스냅샷은 임시 복원해야 덤프를 뽑을 수 있음
- pg_dump(-Fc) + pg_restore -l 로 뜨고 검증
- 임시 자원 정리하면 로컬 파일만 남고 과금 없음


함께 보면 좋은 글:
- 안 쓰는 AWS 인프라를 완전히 내려 요금 0원으로 만들기 - 이 덤프가 나온 전체 철거 작업 편


여기까지 RDS 스냅샷에서 pg_dump로 SQL 덤프를 뽑는 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!

반응형