본문 바로가기

프로젝트/나만의명언집

[나만의명언집 프로젝트] ec2 인스턴스(아마존 리눅스)에서 데이터베이스 복원하기(pg_dump => psql)

반응형

이 포스트는..

해당 포스트는 이전 포스트에서 백업한 로컬의 데이터베이스 파일을 EC2 에 접속하여 복원하는 과정을 기록한 포스트 입니다. RDS 에서도 복원은 성공하였으나, vpc 요금이 하루 단위로 매섭게 오르는 것을 보고, ec2 내에서 일단은 데이터베이스를 돌리기로 결정하였습니다. 

 

 

PSCP 를 통해 로컬 데이터베이스 백업 파일을 EC2 인스턴스에 올리기

이와 관련한 내용은  해당 포스트 에서 다루었기 때문에 흐름만 언급하고 넘어간다.  우선 앞서 백업한 파일을 EC2 인스턴스의 /home/ec2-user 경로에 올린다.

 

 

SSH 클라이언트를 통해 접속한 ec2 인스턴스 에서 조회해보면 정상적으로 해당 경로에 파일이 업로드 된 것을 확인할 수 있다.

 

.sql 파일에 대한 사용자/그룹 및 경로 변경하기

현재 올려진 postgres.sql 파일의 권한을 보면 기본 사용자인 ec2-user 에게 있는 것을 볼 수 있다. 또한 /home/ec2-user 라는 공간은 해당 사용자만 접근 가능한 고유의 공간이므로 postgresql 을 설치하면 자동으로  생성되는 postgres 라는 사용자가 접근할 수 없게 되어 있다.

 

따라서 해당 파일을 postgres 사용자가 접근할 수 있는 장소로 이동시키고, 그 다음에 해당 파일에 대한 권한을 postgres 에게 넘겨주도록 하여 백업 시 해당 파일을 인식할 수 있도록 할 것이다.

 

 

파일 사용자 및 권한 변경

현재 로컬에서 전달받은 .sql 파일의 사용자 및 그룹을 살펴보면 모두 ec2-user 로 되어 있다. 이를 모두 postgres 로 변경할 것이다.

 

아래 명령어를 적용하면 ex-user 를 해당 파일의 사용자로 지정하고, 그룹 또한 ex-user 로 설정한다.

sudo chown ex-user:ex-user /home/ec2-user/파일명.확장자

 

 

변경된 이후 모두 postgres 로 적용된 것을 확인할 수 있다.

 

 

파일 위치 이동하기

해당 파일은 한 번만 사용하고 삭제할 것이므로 postgres 사용자가 접근 가능한 위치 까지만 이동시킬 것이다. 따라서 /home/ec2-user 경로에서 home 으로 이동 시킨다.

 

다음 형식으로 명령어를 입력해보자. 이 때 ec2-user 만의 공간에서 다른 공간으로 파일을 이동하는 것은 최상위 권한을 필요로 하기 때문에 sudo 를 앞에 붙여주어야 한다.

 

sudo mv [파일명] [경로]

 

그러면 다음과 같이 지정한 위치로 파일이 이동된 것을 볼 수 있다.

 

 

 

데이터베이스 복원하기

이제 해당 파일을 데이터베이스에 복원할 것이다. 데이터베이스에 대한 권한은 전적으로 postgres  의 영역이므로 사용자를 postgres 로 변경한다(sudo su - postgres) 

 

그 후 위치한 경로를 조회해보면 ec2-user 와는 다른 경로가 디폴트 되어 있는 것을 확인할 수 있다.

 

 

 

이 경로 에서 아까 전의 경로로 직접 들어가도 되지만 굳이 그럴 필요는 없다.  리눅스 에서는 / 을 입력하면 루트 경로에서 시작하는 것으로 인식하기 때문에(즉, 절대 경로로 인식된다) 다음과 같이 경로를 지정하면 정상적으로 접근할 수 있다.

psql -U postgres -d postgres -f /home/백업파일명.sql

 

 

 

복원 결과 확인하기

복원을 완료하고, psql 접속 후 데이터베이스 테이블 목록을 조회하면 아래와 같이 정상적으로 추가된 것을 볼 수 있다.

 

 

만일 로컬 환경에서 지정한 외래키가 잘 적용되어 있는지 확인하려면 다음 조회 쿼리를 입력하면 된다.

SELECT
    tc.table_name, 
    kcu.column_name, 
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name 
FROM 
    information_schema.table_constraints AS tc 
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
WHERE 
    constraint_type = 'FOREIGN KEY';

 

그러면 다음과 같이 각 테이블 별로 관련 정보가 조회된다.

 

반응형