2023/07/26

PostgreSQL 백업 및 복원 예 (일반적인 논리 백업)

■ 백업

명령행 실행시 패스워드 없이 할려면, pgpass.conf 에 작업 계정에 대한 인증 설정이 미리 되어 있어야 함.


(원격)

pg_dump --host localhost --port 5432 --username "postgres" --password "" --dbname "test" --format custom --blobs --verbose --file "test.backup"


(로컬)

pg_dump --username "postgres" --no-password --dbname "test" --blobs --verbose --format=c --file "test.backup"



■ 복원

유의) 복원 대상에 세션이 물려 있는 경우에는, 복원시 대상 개체의 drop, create 쿼리 실행 오류가 발생하고, 그걸 무시하고 계속 진행하는 경우 기존 테이블에 데이터가 중복 복원 추가됨. 그러므로, 세션이 일체 물려 있지 않은 상태에서 복원 작업을 진행해야 함.

SELECT pg_terminate_backend(pid) FROM pg_stat_activity  WHERE pid <> pg_backend_pid() AND datname = 'test';


(DB 복원으로 할 경우. 대상 이름이 다른 경우 미리 생성후)

pg_restore --clean --create --no-privileges --no-owner --username "postgres" --dbname "test_new" --disable-triggers --format=c --verbose "test.backup"

--clean --create 파라미터를 주는 경우 백업에 있는 DB명으로 동일 복원. 하지만 복원 대상과 동일 DB 명을 주면 에러를 뿌림. 

pg_restore 내부 로직이 문제인지 모르겠으나,.

test 를 삭제후 test 에 복원하려면, 다른 DB명으로 복원 지정(생성)후 하면, 원래 test 를 삭제/복원. 동일하게 test 를 지정하면 DB drop,create 오류나고, 생성 안해두면 DB 없다고 또 복원 안됨..;;


(다른 DB에 단순 복원으로 할 경우. 대상 이름이 다른 경우 미리 생성후)

pg_restore --no-privileges --no-owner --username "postgres" --dbname "test_new" --format=c --verbose "test.backup"

테이블의 경우 개체가 이미 있는 경우, 거기에 레코드 추가 insert 방식이므로, 데이터 중복 발생 유의.


(대상 DB에, 대상 테이블 복원으로 할 경우)

pg_restore --clean --no-privileges --no-owner --username "postgres" --dbname "test_new" --table "table1" --disable-triggers --format=c --verbose "test.backup"

--clean 파라미터 주면, 대상 개체를 먼저 삭제후 복원. 파라미터 없는 상태에서 중복 이름 있는 경우, 데이터 중복 복원해 버리므로 유의 필요.






가장 많이 본 글