pg_dump -h ${RDS ENDPOINT} -U ${DB유저명} -d ${DB명} -Fc -f ${DUMP 파일명}
\ (역슬래시)를 사용해서 엔터를 칠 수도 있다. \를 사용하는 경우에는 한줄로 입력하면 제대로 인식이 안될 수도 있으니 주의
pg_dump \
-h ${RDS ENDPOINT} \
-U ${DB유저명} \
-d ${DB명} \
-Fc \
-f ${DUMP 파일명}
역슬래쉬 사용하여 한 줄로 입력 시
pg_dump: error: too many command-line arguments ...
실제 DB 인스턴스에 깔려있는 PostgreSQL의 버전이
덤프를 뜰 인스턴스에 깔려있는 PostgreSQL의 버전보다 높거나 같아야한다. (당연하지만...)
기존 서버를 구현할 때, 서버에 PostgreSQL을 설치를 안하고, 로컬 DB로만 붙어서 모든 걸 하다보니 나중에 덤프를 뜰 때 굉장히 곤란한 상황이 발생했다..
PostgreSQL16을 쓰고 있었는데, Amazon-Linux23에는 PostgreSQL16버전이 없었다.(못 찾았음)
sudo dnf install postgresql16 # -> X
## postgresql16을 찾을 수 없다고 뜬다.
sudo dnf install postgresql15 # -> O
## 15버전까지는 가능하다.
sudo dnf search postgresql
## 이 명령어로 설치 가능한 postgresql을 찾을 수 있다.

그래서 PGDG(RHEL용 PostgreSQL 공식 repo)를 그대로 설치하려고 했는데
Amazon-Linux23는 RHEL/CentOS 호환이 아니라서
그래서 Docker로 우회하여 PostgreSQL16을 설치했다.
# https://www.postgresql.org/download/linux/ubuntu/
# 공식 문서 참고
sudo apt install postgresql-16 # -> O
dump를 뜰 서버 인스턴스에서 실행
docker run --rm \
-v "$PWD:/work" \
-e PGPASSWORD='DB비밀번호' \
postgres:16 \
pg_dump \
-h ${RDS의 ENDPOINT} \
-U ${유저명} \
-d ${DB명} \
-Fc \
-f /work/${덤프파일명} ## 출력 파일 경로
$PWD: 현재 작업 디렉토리 (Present Working Directory)
/work: Docker 컨테이너 내부의 경로
:로 연결하여 호스트와 컨테이너를 연결
덤프 생성 후에는
ls -lh ${덤프파일명}
으로 파일이 제대로 생성되었는지 반드시 확인하자
(파일 용량이 0kb라면 제대로 생성되지 않은 것)
구 app 서버 -> 로컬 -> 신 app 서버
순으로 dump 파일을 옮겨준다.
내려받은 로컬에서 실행
scp -i [SSH키파일] [원본] [대상] ## 기본 구조
scp -i "C:/Users/.ssh/이전서버.key" ec2-user@[PUBLIC IP]:/home/ec2-user/[DUMP파일명] .
키파일 경로는
""로 감싸준다.
.: 현재 디렉토리
로컬에 잘 복사되었다면 아래 명령어를 실행하여 덤프 파일이 필요한 서버에 다시 옮긴다.
scp -i "C:/Users/.ssh/현재서버.key" [DUMP파일명] ubuntu@[PUBLIC IP]:/home/ubuntu/
dump 파일이 준비가 되었으면, 파일을 토대로 restore를 해야한다.
단, postgis를 사용하고 있는 DB를 옮기는 경우 restore할 서버인스턴스에서도 postgis를 사용해야만 정상적으로 restore가 된다.
pg_restore: error: could not execute query: ERROR: could not open extension control file .
.. No such file or directory Command was: CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA ...;
pg_restore: error: could not execute query:
ERROR: extension "postgis" does not exist Command was: COMMENT ON EXTENSION postgis IS 'PostGIS geometry and geography spatial types and functions';
sudo -i -u postgres psql -d [DB명] -c "CREATE EXTENSION IF NOT EXISTS postgis;"
sudo -i -u postgres psql -d [DB명] -c "SELECT postgis_full_version();" # 확인 쿼리
postgis가 설치되어있지 않다면 해당 DB에 설치를 postgres 유저로 진행한다.(PostgreSQL 설치 시 자동으로 생성되는 슈퍼유저(superuser))
pg_restore \
-h 10.0.0.114 \
-U nnzz_user \
-d nnzz \
--clean \
--if-exists \
--no-owner \
--no-privileges \
/work/[dump파일명]
데이터베이스를 파일로 저장하는 명령어
기본 구조
pg_dump [옵션] -d 데이터베이스명 -f 출력파일명
주요 옵션
1. 출력 형식 (-F)
bash# 커스텀 포맷 (압축됨, 가장 많이 쓰임)
pg_dump -U postgres -d [db명] -Fc -f backup.dump
SQL 텍스트 포맷 (읽을 수 있음)
pg_dump -U postgres -d [db명] -Fp -f backup.sql
tar 포맷
pg_dump -U postgres -d [db명] -Ft -f backup.tar
2. 데이터만 / 스키마만
bash# 데이터만 백업 (테이블 구조 제외)
pg_dump -U postgres -d [db명] --data-only -f data.dump
스키마만 백업 (데이터 제외)
pg_dump -U postgres -d [db명] --schema-only -f schema.dump
3. 특정 테이블만
bash# users 테이블만 백업
pg_dump -U postgres -d [db명] -t users -f users_backup.dump
여러 테이블
pg_dump -U postgres -d [db명] -t users -t orders -f tables_backup.dump
커스텀 포맷(-Fc)으로 백업한 파일을 복구하는 명령어
기본 구조
bashpg_restore [옵션] -d 데이터베이스명 백업파일
주요 옵션
1. 기본 복구
bash# 전체 복구
pg_restore -U postgres -d nnzz backup.dump
2. 클린 복구 (기존 데이터 삭제 후 복구)
bash# 기존 객체 삭제 후 복구
pg_restore -U postgres -d nnzz --clean backup.dump
데이터베이스까지 새로 생성
pg_restore -U postgres -d nnzz --clean --create backup.dump
3. 특정 테이블만 복구
bash# users 테이블만 복구
pg_restore -U postgres -d nnzz -t users backup.dump
4. 병렬 처리 (빠른 복구)
bash# 4개의 작업을 동시에 실행
pg_restore -U postgres -d nnzz -j 4 backup.dump