notes
데이터베이스 백업 및 복원
데이터베이스 백업·복원 절차와 장애 대응 시 주의점 메모.
운영 중인 PostgreSQL을 DBeaver에서 백업하고 다른 DB에 복원했던 순서다. 스크린샷은 DBeaver 22 버전이라 메뉴 위치가 조금 다를 수 있다. DBeaver는 결국 내부에서 pg_dump와 pg_restore를 돌리는 거라, 맨 아래에 같은 일을 하는 명령도 같이 적어 두었다.
- DBeaver에서 도구 → 백업으로 테이블을 고르고 Custom 형식으로 파일을 만든다.
- 복원은 대상 DB에서 도구 → 복원으로 그 파일을 골라 돌리고, 끝나면 로그와 행 수를 확인한다.
- 화면 뒤에서는
pg_dump -Fc와pg_restore가 도는 거라 터미널에서도 똑같이 할 수 있다.
1. 데이터베이스 백업
도구→백업클릭
- 백업할 테이블 선택 →
다음클릭
- 옵션 설정 →
Start클릭. Format은 Custom, Encoding은 UTF-8, 출력 폴더와 파일 이름 패턴만 맞춰 두면 된다.
- 백업 완료 후
취소클릭 → 백업 확인
2. 데이터베이스 복원
복원할 DB를 먼저 만들어 두고 그 DB에서 메뉴를 연다. 다른 DB에서 열면 엉뚱한 곳에 테이블이 쌓인다.
도구→복원클릭
- 백업 파일 경로 설정, 옵션 선택 →
Start클릭. 기존 테이블을 지우고 다시 만들려면 Clean 옵션을 켜는데, 운영 DB에서는 두 번 확인하고 켠다.
- 복원 완료 후
취소클릭 → 복원 확인. 로그 끝에errors ignored on restore같은 줄이 뜨면 대부분 이미 있던 스키마나 권한 때문이라, 테이블 행 수까지 맞는지 본다.
3. 터미널에서 할 때
서버에서 cron으로 돌리거나 GUI가 없을 때는 명령으로 한다. 형식을 뭘로 떠냐에 따라 복원 도구가 달라진다.
나는 거의 Custom(-Fc)만 쓴다. 파일 하나로 끝나고, 필요한 테이블만 골라서 복원할 수 있어서다.
pg_dump / pg_restore 명령
# 백업 (Custom 형식)
pg_dump -h 127.0.0.1 -U postgres -d mydb -Fc -f dump-mydb-$(date +%Y%m%d).backup
# 테이블 하나만
pg_dump -h 127.0.0.1 -U postgres -d mydb -Fc -t public."KSAgree" -f agree.backup
# 복원 대상 DB 만들기
createdb -h 127.0.0.1 -U postgres mydb_restore
# 복원 (기존 객체 지우고 다시 만들려면 --clean --if-exists)
pg_restore -h 127.0.0.1 -U postgres -d mydb_restore --no-owner dump-mydb-20221211.backup
# Plain SQL로 떠서 psql로 넣기
pg_dump -h 127.0.0.1 -U postgres -d mydb > mydb.sql
psql -h 127.0.0.1 -U postgres -d mydb_restore < mydb.sql다른 서버로 옮길 때는 버전을 꼭 본다. pg_restore는 자기보다 새 버전 pg_dump로 만든 파일을 못 읽는다. 소유자 계정이 다르면 --no-owner를 붙여야 권한 에러가 안 쌓인다.