AWS에서 서비스하는 postgreSQL RDS의 경우 super user 권한을 가진 user가 없어서 pg_dumpall 를 수행할 수 없다고 공식 가이드 문서에서 확인할 수 있다.

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html

하지만, 약간의 변형을 가하면, pg_dumpall 명령어를 사용할 수 있다.

기본 구성

  • postgreSQL (source DB) : dump를 뜨려는 원본 RDS
  • postgreSQL (target DB) : dump를 복원하려는 타겟 RDS
  • dump용 EC2 : postgreSQL client 버전 12 이상이 설치되어 있는 서버. source RDS와 target RDS에 접속가능해야 한다.

DUMP 수행

postgreSQL RDS는 rdsadmin 이 소유하고 있는 database가 있는데 이건 RDS 생성시 만들었던 master 계정이 권한이 없기 때문에 덤프를 뜨는게 불가능하다. postgreSQL 12버전 이상을 사용하면 특정 database를 제외하고 덤프를 뜰 수 있다.(–exclude-database 옵션)

덤프를 뜨기전, master 계정이 database에 권한을 가지고 있는지, tablespace 소유 여부를 확인한다.

# postgreSQL 접속
$ psql --host=(source RDS Endpoint) --port=(source RDS port) --username=(master 계정) --password

# db list 조회
> \l 

# 사용자 권한 조회
> \du

# table space 조회
> \db

# master 계정 소유로 table space 변경
> ALTER TABLESPACE (tablespace 명) OWNER TO (master 계정);

# master 계정에게 db 권한 부여
> GRANT (db명) TO (master 계정);

master계정에게 권한이 부여되었다면, 아래 명령어로 rdsadmin이 소유한 database는 제외하고 dump를 뜬다. –no-role-passwords 옵션을 사용하여 super_user 권한이 없는 계정으로 dump를 뜬다. 복원 후 사용자 비밀번호는 다시 지정한다.

$ pg_dumpall --no-role-passwords -f (파일명) --exclude-database=rdsadmin --exclude-database=template0 -v -h (source RDS endpoint) -U (master 계정) -p (source RDS port)

데이터 용량이 많아서 압축 덤프를 사용하는 경우의 명령어는 아래와 같다.(gzip 사용)

$ pg_dumpall --no-role-passwords --exclude-database=rdsadmin --exclude-database=template0 -v -h (source RDS endpoint) -U (master 계정) -p (source RDS port) | gzip > 파일명.gz

덤프 중 실제로 잘 덤프를 뜨고 있는지 여부에 대한 확인은 RDS의 모니터링 지표 중 connection 지표를 확인한다.

RESTORE 수행

덤프 작업이 완료 된 후 restore를 수행한다.

$ psql -h (target RDS endpoint) -U (master 계정) -p (target RDS port) < (백업 파일)

압축 덤프를 사용했던 경우에는 아래 명령어로 복원한다.

gunzip -c 파일명.gz | psql -h (target RDS endpoint) -U (master 계정) -p (target RDS port) 

복원 후 psql로 target RDS에 접속하여 사용자 비밀번호를 다시 입력한다.

# target RDS 연결
$ psql --host=(target RDS Endpoint) --port=(target RDS port) --username=(master 계정) --password

# 사용자 정보 변경
> ALTER ROLE (사용자명) WITH LOGIN;
> ALTER USER (사용자명) WITH PASSWORD '(비밀번호)';

40 GB 데이터 베이스 기준으로 dump 뜨는데 30분, restore하는데 20분이 수행되었다.

pg_dump의 경우 table space 및 사용자의 권한은 복사되지 않고, 데이터 베이스 별로 덤프를 떠서 복원해야 하기 때문에 RDS 전체 데이터를 백업해야 하는 경우에는 pg_dumpall 이 더 빠르고 정확하고 편하다.

'AWS' 카테고리의 다른 글

EKS node group spec 변경  (0) 2023.01.03
EC2 서버간 시간 동기화(Amazon Time Sync Service)  (0) 2023.01.03
ALB + Tomcat 환경에서 client ip 로깅하기  (0) 2023.01.03
AWS Access key 종류  (0) 2023.01.03
EC2 EBS 볼륨 증설(ubuntu os)  (0) 2023.01.03