본문 바로가기
개발자 전향 프로젝트

로컬 컨테이너에 백업 DB 구축하기 (feat. Docker, Postgre)

by 샘오리 2023. 7. 15.

데이터의 저장소인 데이터베이스,

이 데이터베이스와 연결되지 않으면 웹 애플리케이션은 작동을 할 수가 없다.

 

하지만 다양한 이유로 데이터베이스와의 연결이 자유롭지 않을 수 있고 

이를 방지하기 위해 사용중인 DB를 로컬에 복제하곤 하는데

오늘은 로컬 PC(Windows) Docker 컨테이너에 Postgre DB를 복제하여 세팅하는 방법에 대해서 다뤄보겠다.

 

준비물:

1. 도커가 설치된 PC ( Windows의 경우 Docker Desktop으로 쉽게 설치가 가능하다)

2. 이미 사용중이며 접속이 가능한 Postgre DB

3. 테이블스페이스, 테이블, 파티션, 데이터가 포함된 SQL 스크립트

4. 본인이 익숙한 DB 툴 (Datagrip, sqldeveloper, Heidisql, Dbeaver 등등)

*설명은 Datagrip 기준으로


1. 포스트그레 이미지 받아서 컨테이너 실행하기

 

가장 먼저 도커 데스크탑을 열어 최신버전의 postgres 이미지를 받아준다.

 

받아주고 나서 컨테이너로 실행을 시킬 때 그냥 실행하지 말고 아래 그림과 같이 옵션을 선택한다.

  1. 컨테이너의 이름
  2. 로컬에 DB를 구축할 때 지정하고 싶은 호스트 포트 (Default 인 5432를 사용해도 된다)
  3. 호스트 경로와 컨테이너 경로 ( 이 부분이 이해가 안된다면 도커 기본지식을 알아야함)
  4. 환경변수 (Postgres의 경우 변수는 POSTGRES_PASSWORD 이며 값은 본인이 사용하고 싶은 비밀번호)

실행 로그에서도, 컨테이너 탭에서도 위 실행옵션으로 Postgres  이미지가

컨테이너로 제대로 실행됐는지 확인이 가능하다.

2. 파워쉘로 컨테이너 내부 접속하여 테이블스페이스 미리 만들어주기

명령어로 어떤 컨테이너가 up인지 확인하고

postgres 컨테이너 찾아서 명령어로 내부로 접속하고

아까 지정한 컨테이너 경로 (ex: var/lib/postgresql/data)에 들어가서

실사용중인 db의 테이블스페이스에 맞게 미리 폴더를 만들어두면 되는것이다.

예를 들어 실사용중인  db의 테이블스페이스명 하나가 my_first_tb1라면 db 툴에서 테이블스페이스를 만들기 전에

그 테이블스페이가 들어갈 공간을 만들어주는 것 : 미리 mkdir my_first_tb1 해주는 것

 

이 작업이 끝나면 호스트 경로에 들어가서 제대로 폴더가 생성되었는지 확인해보면 된다.

(본인 로컬 경로)

되었다면 volume이 제대로 동기화됐다는 뜻이다.

 

3. DB 툴 들어가서 접속하고, 권한 부여하기

 

-- auto-generated definition
create user 소유주명
    superuser
    createdb
    createrole;

comment on role 소유주명 is '이 DB 소유주';

-- auto-generated definition
create user 사용자명;

alter user 사용자명 set search_path = 소유주명;

comment on role 사용자명 is '이 DB 사용자';

create schema 소유주명;

alter schema 소유주명 owner to 소유주명;

grant usage on schema 소유주명 to 사용자명;

GRANT SELECT, insert, update, delete ON ALL TABLES IN SCHEMA 소유주명 TO 사용자명;

chown postgres:  테이블 스페이스 명
chown postgres:  테이블 스페이스 명
chown postgres:  테이블 스페이스 명
chown postgres:  테이블 스페이스 명
chown postgres:  테이블 스페이스 명
chown postgres:  테이블 스페이스 명
chown postgres:  테이블 스페이스 명

4. 테이블스페이스+테이블+ 파티션 생성 및 데이터 삽입하기

실사용중인 db에서 DDL 스크립트 뽑아서 실행만 하면 된다.

예시:

데이터그립에서 DDL 추출
Dbeaver에서 DDL 추출

다른 툴을 사용한다면 방법이 조금 다르므로 UI 사용법을 찾아보면된다.

 

 

여기서 주의할 점은 해당 스크립트를 실행할 때 스크립트가 길고 데이터의 양이 많으면

꽤 오래걸리면서 툴이 뻗어버릴 수 있다는 점과

스크립트를 실행하는 콘솔이 본인이 지정한 스키마가 아닐 수 있다는 점이다.

 

본인이 지정한 스키마인지 확인하면서 틀을 생성하고 데이터를 넣으면 끝이다.

 

마지막으로 제일 중요한 것일 수도 있는데 웹 애플리케이션 또한 도커 컨테이너에 올린 사람들은 

웹 애플리케이션에서 해당 로컬 DB 접속 IP (127.0.0.1)를 적고 실행해보면 안된다.

왜 안될까?

 

127.0.0.1이 바라보는 방향이 WAS가 띄워진 컨테이너 자기 자신이기 때문이다.

해서 계속 DB 찾으려고 하지만 없는 것이다. 

그래서 IP주소는 명령 프롬프트에서 ipconfig 를 쳐서 IPv4 로 나오는 주소를 기입하면 된다.